GPIO Q&A

Q:Userspace下如何控制GPIO电平?

可使用下述三种方式。

  1. 使用echo命令控制IO,示例,控制GPIO1

    echo 1 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio1/direction
    echo 1 > /sys/class/gpio/gpio1/value    //拉高
    echo 0 > /sys/class/gpio/gpio1/value    //拉低
    
  2. 使用riu_w写寄存器控制电平,此方法需要查看GPIO_Mapping_Table,同样以GPIO1举例。

    查看kernel/drivers/sstar/pioneer3/gpio.h可知GPIO1对应的是PAD_SR_IO01,查看GPIO_Mapping_Table可知PAD_SR_IO01对应的RIU地址为103E,8BIT偏移地址为0x02。配置为Output、LeakHi、DRV=1→8mA,当OUT=low时,Reg value = 0x58;当OUT= high时,Reg value = 0x5B。

    由于Userspace下RIU的偏移地址是按16BIT计算,所以PAD_SR_IO01的reg地址为0x103E01。

    ./riu_w 0x103E 0x01 0x58    //拉低
    ./riu_w 0x103E 0x01 0x5B    //拉高
    
  3. 使用mmap映射物理地址到虚拟地址,通过访问虚拟地址访问物理地址。方式2中riu_w的代码实现即是此方式。

    代码实现:reg_rw.c

...