add function write_file() (#2181)
	
		
	
				
					
				
			* add function write_file()
* handle EAGIN & EWOULDBLOCK
* don't  handle errno
old-commit-hash: 6476207009
			
			
				commatwo_master
			
			
		
							parent
							
								
									e9642080ac
								
							
						
					
					
						commit
						ef8b6d20fb
					
				
				 4 changed files with 24 additions and 61 deletions
			
			
		@ -1,75 +1,29 @@ | 
				
			||||
#include "gpio.h" | 
				
			||||
#include "util.h" | 
				
			||||
#include <fcntl.h> | 
				
			||||
#include <unistd.h> | 
				
			||||
#include <stdio.h> | 
				
			||||
#include <string.h> | 
				
			||||
 | 
				
			||||
// We assume that all pins have already been exported on boot,
 | 
				
			||||
// and that we have permission to write to them.
 | 
				
			||||
 | 
				
			||||
int gpio_init(int pin_nr, bool output){ | 
				
			||||
  int ret = 0; | 
				
			||||
  int fd = -1, tmp; | 
				
			||||
 | 
				
			||||
  char pin_dir_path[50]; | 
				
			||||
  int pin_dir_path_len = snprintf(pin_dir_path, sizeof(pin_dir_path), | 
				
			||||
                           "/sys/class/gpio/gpio%d/direction", pin_nr); | 
				
			||||
  if(pin_dir_path_len <= 0){ | 
				
			||||
    ret = -1; | 
				
			||||
    goto cleanup; | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  fd = open(pin_dir_path, O_WRONLY); | 
				
			||||
  if(fd == -1){ | 
				
			||||
    ret = -1; | 
				
			||||
    goto cleanup; | 
				
			||||
  } | 
				
			||||
  if(output){ | 
				
			||||
    tmp = write(fd, "out", 3); | 
				
			||||
    if(tmp != 3){ | 
				
			||||
      ret = -1; | 
				
			||||
      goto cleanup; | 
				
			||||
    } | 
				
			||||
  } else { | 
				
			||||
    tmp = write(fd, "in", 2); | 
				
			||||
    if(tmp != 2){ | 
				
			||||
      ret = -1; | 
				
			||||
      goto cleanup; | 
				
			||||
    } | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
cleanup: | 
				
			||||
  if(fd >= 0){ | 
				
			||||
    close(fd); | 
				
			||||
    return -1; | 
				
			||||
  } | 
				
			||||
  return ret; | 
				
			||||
  const char *value = output ? "out" : "in"; | 
				
			||||
  return write_file(pin_dir_path, (void*)value, strlen(value)); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
int gpio_set(int pin_nr, bool high){ | 
				
			||||
  int ret = 0; | 
				
			||||
  int fd = -1, tmp; | 
				
			||||
 | 
				
			||||
  char pin_val_path[50]; | 
				
			||||
  int pin_val_path_len = snprintf(pin_val_path, sizeof(pin_val_path), | 
				
			||||
                           "/sys/class/gpio/gpio%d/value", pin_nr); | 
				
			||||
  if(pin_val_path_len <= 0){ | 
				
			||||
    ret = -1; | 
				
			||||
    goto cleanup; | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  fd = open(pin_val_path, O_WRONLY); | 
				
			||||
  if(fd == -1){ | 
				
			||||
    ret = -1; | 
				
			||||
    goto cleanup; | 
				
			||||
  } | 
				
			||||
  tmp = write(fd, high ? "1" : "0", 1); | 
				
			||||
  if(tmp != 1){ | 
				
			||||
    ret = -1; | 
				
			||||
    goto cleanup; | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
cleanup: | 
				
			||||
  if(fd >= 0){ | 
				
			||||
    close(fd); | 
				
			||||
    return -1; | 
				
			||||
  } | 
				
			||||
  return ret; | 
				
			||||
  return write_file(pin_val_path, (void*)(high ? "1" : "0"), 1); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue