add function write_file() (#2181)
	
		
	
				
					
				
			* add function write_file() * handle EAGIN & EWOULDBLOCK * don't handle errnopull/2213/head
							parent
							
								
									861ef4a397
								
							
						
					
					
						commit
						6476207009
					
				
				 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