1. 架構
2. 有兩種操作方法
2.1 第一種: sysfs接口(舊, 已廢棄)
2.2 第二種: 字符設備接口(新)
3. 如何使用sysfs接口控制gpio?
3.1 確定要使用的gpio號(怎么知道gpio號呀?)
3.2 將gpio號寫入文件/sys/class/gpio/export中
# echo 333 > /sys/class/gpio/export
3.3 將gpio配置為輸入還是輸出
配置為輸出示例如下:
# echo out > /sys/class/gpio/gpio333 direction
3.4 如果3.3設置為輸入,那么讀取gpio的值
# cat /sys/class/gpio/gpio333/value
3.5 如果3.3設置為輸出, 那么向gpio寫入值
# echo 1 > /sys/class/gpio/gpio333/value
4. 如何使用字符設備接口控制gpio?
4.1 有兩種方法
4.1.1 使用libgpiod編程
4.1.2 使用命令行工具
4.2 使用libgpiod編程
示例如下:
void main() { struct gpiod_chip *chip; struct gpiod_line *line; int req, value; chip = gpiod_chip_open("/dev/gpiochip0"); if (!chip) return -1; line = gpiod_chip_get_line(chip, 3); if (!line) { gpiod_chip_close(chip); return -1; } req = gpiod_line_request_input(line, "gpio_state"); if (req) { gpiod_chip_close(chip); return -1; } value = gpiod_line_get_value(line); printf("GPIO value is: %d\n", value); gpiod_chip_close(chip); }
4.3 使用命令行工具(gpiod-tools)
4.3.1 gpiodetect: 列出所有的gpio
# gpiodetect gpiochip0 [209c000.gpio] (32 lines) gpiochip1 [20a0000.gpio] (32 lines) gpiochip2 [20a4000.gpio] (32 lines) gpiochip3 [20a8000.gpio] (32 lines) gpiochip4 [20ac000.gpio] (32 lines) gpiochip5 [20b0000.gpio] (32 lines) gpiochip6 [20b4000.gpio] (32 lines) gpiochip7 [mcp23s08.0] (8 lines)
4.3.2 gpioinfo: 列出某個gpio控制器的情況
# gpioinfo 0 gpiochip0 - 32 lines: line 0: unnamed unused input active-high line 1: unnamed unused input active-high line 2: unnamed unused input active-high line 3: unnamed "scl" output active-high [used open-drain] line 4: unnamed unused input active-high line 5: unnamed unused input active-high line 6: unnamed "sda" output active-high [used open-drain] line 7: unnamed "Push Button" input active-low [used] line 8: unnamed unused input active-high line 9: unnamed "?" output active-high [used] line 10: unnamed unused input active-high line 11: unnamed unused input active-high
4.3.3 gpioset: 設置gpio
設置gpio控制器0的第9個gpio輸出0 (注意在4.3.2中這個gpio是設置為輸出的)
# gpioset 0 9=0
4.3.4 gpioget: 讀取gpio
# gpioget 0 9
4.3.5 gpiomon: 監控gpio的狀態
# gpiomon 0 9