linux用戶空間如何控制gpio?


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM