1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| #include <stdio.h> #include <string.h> #include <unistd.h>
#include <gpiod.h>
struct gpiod_chip *chip; struct gpiod_line *line_led;
struct gpiod_line_request_config config;
int led_init(unsigned char gpio_chip_num, unsigned char gpio_off_num) { int ret; char dev_name[16];
if(gpio_chip_num > 6 || gpio_off_num > 32) { printf("[INFO] %s argument error.\n", __FUNCTION__); return -1; } memset(dev_name, 0, sizeof(dev_name)); snprintf(dev_name, sizeof(dev_name), "/dev/gpiochip%d", gpio_chip_num);
chip = gpiod_chip_open(dev_name); if(!chip) { printf("fail to open chip0\n"); return -1; }
line_led = gpiod_chip_get_line(chip, gpio_off_num); if(!line_led) { printf("fail to get line_led\n"); return -1; }
config.consumer = "led_out"; config.request_type = GPIOD_LINE_REQUEST_DIRECTION_AS_IS; config.flags = 0;
ret = gpiod_line_request(line_led, &config, 0); if(ret < 0) { printf("fail to request line_led for output mode\n"); return -1; }
return ret; }
int led_control(int cmd) { int ret;
if(cmd == 0) { ret = gpiod_line_set_value(line_led, 0); } else { ret = gpiod_line_set_value(line_led, 1); }
if(ret < 0) { printf("fail to set line_led value\n"); return -1; }
return ret; }
int led_release(void) { gpiod_line_release(line_led); gpiod_chip_close(chip); }
int main(int argc, char *argv[]) { if(0 > led_init(4, 2)) { printf("led init error.\n"); return -1; }
printf("led value: %d\n", gpiod_line_get_value(line_led));
led_release();
return 0; }
|