【fireflyRK3288/firefly RK3399开发板】GPIO控制
Python例子:模块安装请参考:http://developer.t-firefly.com/thread-10503-1-2.html
android例子:
http://dev.t-firefly.com/forum.p ... =396&highlight=GPIO
fireflyRK3399驱动中调用GPIO:
http://www.t-firefly.com/doc/product/info/id/88.html
调试方法IO指令GPIO调试有一个很好用的工具,那就是IO指令,Firefly-RK3399的Android系统默认已经内置了IO指令,使用IO指令可以实时读取或写入每个IO口的状态,这里简单介绍IO指令的使用。 首先查看 io 指令的帮助:#io --help
Unknown option: ?
Raw memory i/o utility - $Revision: 1.5 $
io -v -1|2|4 -r|w [-l <len>] [-f <file>] <addr> [<value>]
-v Verbose, asks for confirmation
-1|2|4 Sets memory access size in bytes (default byte)
-l <len> Length in bytes of area to access (defaults to
one access, or whole file length)
-r|w Read from or Write to memory (default read)
-f <file>File to write on memory read, or
to read on memory write
<addr> The memory address to access
<val> The value to write (implies -w)
Examples:
io 0x1000 Reads one byte from 0x1000
io 0x1000 0x12 Writes 0x12 to location 0x1000
io -2 -l 8 0x1000 Reads 8 words from 0x1000
io -r -f dmp -l 100 200 Reads 100 bytes from addr 200 to file
io -w -f img 0x10000 Writes the whole of file to memory
Note access size (-1|2|4) does not apply to file based accesses.
从帮助上可以看出,如果要读或者写一个寄存器,可以用:io -4 -r 0x1000 //读从0x1000起的4位寄存器的值
io -4 -w 0x1000 //写从0x1000起的4位寄存器的值使用示例:
[*]查看GPIO1_B3引脚的复用情况
1. 从主控的datasheet查到GPIO1对应寄存器基地址为:0xff320000
2. 从主控的datasheet查到GPIO1B_IOMUX的偏移量为:0x00014
3. GPIO1_B3的iomux寄存器地址为:基址(Operational Base) + 偏移量(offset)=0xff320000+0x00014=0xff320014
4. 用以下指令查看GPIO1_B3的复用情况:
# io -4 -r 0xff320014ff320014:0000816a
5. 从datasheet查到:gpio1b3_sel
GPIO1B iomux select
2'b00: gpio
2'b01: i2c4sensor_sda
2'b10: reserved
2'b11: reserved
因此可以确定该GPIO被复用为 i2c4sensor_sda。
6. 如果想复用为GPIO,可以使用以下指令设置:
# io -4 -w 0xff320014 0x0000812a
GPIO调试接口Debugfs文件系统目的是为开发人员提供更多内核数据,方便调试。 这里GPIO的调试也可以用Debugfs文件系统,获得更多的内核信息。 GPIO在Debugfs文件系统中的接口为 /sys/kernel/debug/gpio,可以这样读取该接口的信息:# cat /sys/kernel/debug/gpio
GPIOs 0-31, platform/pinctrl, gpio0:
gpio-2 ( |vcc3v3_3g ) out hi
gpio-4 ( |bt_default_wake_host) inlo
gpio-5 ( |power ) inhi
gpio-9 ( |bt_default_reset ) out lo
gpio-10( |reset ) out lo
gpio-13( |? ) out lo
GPIOs 32-63, platform/pinctrl, gpio1:
gpio-32( |vcc5v0_host ) out hi
gpio-34( |int-n ) inhi
gpio-35( |vbus-5v ) out lo
gpio-45( |pmic-hold-gpio ) out hi
gpio-49( |vcc3v3_pcie ) out hi
gpio-54( |mpu6500 ) out hi
gpio-56( |pmic-stby-gpio ) out hi
GPIOs 64-95, platform/pinctrl, gpio2:
gpio-83( |bt_default_rts ) inhi
gpio-90( |bt_default_wake ) inlo
gpio-91( |? ) out hi
GPIOs 96-127, platform/pinctrl, gpio3:
gpio-111 ( |mdio-reset ) out hi
GPIOs 128-159, platform/pinctrl, gpio4:
gpio-149 ( |hp-con-gpio ) out lo
从读取到的信息中可以知道,内核把GPIO当前的状态都列出来了,以GPIO0组为例,gpio-2(GPIO0_A2)作为3G模块的电源控制脚(vcc3v3_3g),输出高电平(out hi)。FAQsQ1: 如何将PIN的MUX值切换为一般的GPIO?A1: 当使用GPIO request时候,会将该PIN的MUX值强制切换为GPIO,所以使用该pin脚为GPIO功能的时候确保该pin脚没有被其他模块所使用。Q2: 为什么我用IO指令读出来的值都是0x00000000?A2: 如果用IO命令读某个GPIO的寄存器,读出来的值异常,如 0x00000000或0xffffffff等,请确认该GPIO的CLK是不是被关了,GPIO的CLK是由CRU控制,可以通过读取datasheet下面CRU_CLKGATE_CON* 寄存器来查到CLK是否开启,如果没有开启可以用io命令设置对应的寄存器,从而打开对应的CLK,打开CLK之后应该就可以读到正确的寄存器值了。Q3: 测量到PIN脚的电压不对应该怎么查?A3: 测量该PIN脚的电压不对时,如果排除了外部因素,可以确认下该pin所在的io电压源是否正确,以及IO-Domain配置是否正确。Q4: gpio_set_value()与gpio_direction_output()有什么区别?A4: 如果使用该GPIO时,不会动态的切换输入输出,建议在开始时就设置好GPIO 输出方向,后面拉高拉低时使用gpio_set_value()接口,而不建议使用gpio_direction_output(), 因为gpio_direction_output接口里面有mutex锁,对中断上下文调用会有错误异常,且相比 gpio_set_value,gpio_direction_output 所做事情更多,浪费。
页:
[1]