Gpio Q&A

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

可使用下述三种方式。

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

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

    查看kernel/drivers/sstar/include/infinity2m/gpio.h可知GPIO1对应的是PAD_GPIO4,查看GPIO_Mapping_Table可知PAD_GPIO4对应的RIU地址为103C,8BIT偏移地址为0x08。配置为Output、DRV>4mA,当OUT=low时,Reg value = 0x00;当OUT= high时,Reg value = 0x11。

    kernel/drivers/sstar/gpio/infinity2m/gpio_table.c文件中也有gpio mode相关寄存器配置说明。

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

    ./riu_w 0x103C 0x04 0x00    //拉低
    ./riu_w 0x103C 0x04 0x11    //拉高
    
  3. 使用mmap映射物理地址到虚拟地址,通过访问虚拟地址访问物理地址。方式2中riu_w的代码实现即是此方式。代码实现:reg_rw.c

...