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 "gpio.h" | ||||||
|  | #include "util.h" | ||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #include <stdio.h> | #include <string.h> | ||||||
| 
 | 
 | ||||||
| // We assume that all pins have already been exported on boot,
 | // We assume that all pins have already been exported on boot,
 | ||||||
| // and that we have permission to write to them.
 | // and that we have permission to write to them.
 | ||||||
| 
 | 
 | ||||||
| int gpio_init(int pin_nr, bool output){ | int gpio_init(int pin_nr, bool output){ | ||||||
|   int ret = 0; |  | ||||||
|   int fd = -1, tmp; |  | ||||||
| 
 |  | ||||||
|   char pin_dir_path[50]; |   char pin_dir_path[50]; | ||||||
|   int pin_dir_path_len = snprintf(pin_dir_path, sizeof(pin_dir_path), |   int pin_dir_path_len = snprintf(pin_dir_path, sizeof(pin_dir_path), | ||||||
|                            "/sys/class/gpio/gpio%d/direction", pin_nr); |                            "/sys/class/gpio/gpio%d/direction", pin_nr); | ||||||
|   if(pin_dir_path_len <= 0){ |   if(pin_dir_path_len <= 0){ | ||||||
|     ret = -1; |     return -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 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 gpio_set(int pin_nr, bool high){ | ||||||
|   int ret = 0; |  | ||||||
|   int fd = -1, tmp; |  | ||||||
| 
 |  | ||||||
|   char pin_val_path[50]; |   char pin_val_path[50]; | ||||||
|   int pin_val_path_len = snprintf(pin_val_path, sizeof(pin_val_path), |   int pin_val_path_len = snprintf(pin_val_path, sizeof(pin_val_path), | ||||||
|                            "/sys/class/gpio/gpio%d/value", pin_nr); |                            "/sys/class/gpio/gpio%d/value", pin_nr); | ||||||
|   if(pin_val_path_len <= 0){ |   if(pin_val_path_len <= 0){ | ||||||
|     ret = -1; |     return -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 ret; |   return write_file(pin_val_path, (void*)(high ? "1" : "0"), 1); | ||||||
| } | } | ||||||
|  | |||||||
					Loading…
					
					
				
		Reference in new issue