LOFT-Q GPIO 使用

组织:Mixtile Team
版本:0.1
日期:2015.07.07

LOFT-Q 提供了众多的 GPIO 口用于开发者根据自己的需要进行扩展。不过这些 GPIO 的使用需要配合具体的扩展板才能使用。

对于 GPIO 的使用需要在内核中启用相关的配置,然后就可以在应用程序中使用相关的 GPIO 进行操作。

介绍

LOFT-Q 提供了 3 个 FPC 座子,分别为 J4, J5, J6,其中每个提供 60 针的 GPIO 支持,所有合计有 180 针的 GPIO 可供使用。具体的每个针脚的说明可以参考 GPIO 引脚说明 。如下图为 LOFT-Q 各个部分的简略图,其中有关 GPIO 的对照如下:

  • 2 Expansion CSI/MIPI-DSI 为摄像头所用 IO 口,也可以作为通用 GPIO 使用。
  • 3 Expansion LVDS 为显示屏,触摸屏所用 IO 口,也可以作为通用 GPIO 使用。
  • 5 Expansion CSPIO 包含一些可用作 SPI,UART,I2C 等接口的 GPIO, 以及通用的 GPIO。
../../_images/loftq-interface-map.png

GPIO 引脚说明

EXPANSION CSI/MIPI‐DSI — J4

引脚号 功能 引脚号 功能
1 CSI-D0 2 CSI-D1
3 CSI-D2 4 CSI-D3
5 CSI-D4 6 CSI-D5
7 CSI-D6 8 CSI-D7
9 CSI-D8 10 CSI-D9
11 CSI-D10 12 CSI-D11
13 GND 14 CSI-HSYNC
15 CSI-VSYNC 16 TWI0-SCK
17 TWI0-SDA 18 GND
19 CSI-MCLK 20 CSI-PCLK
21 GND 22 VDD1V8-CSI
23 VDD1V8-CSI 24 GND
25 VCC-5V 26 VCC-5V
27 GND 28 VCC-3V3
29 VCC-3V3 30 GND
31 MCSI-MCLK 32 NC
33 NC 34 GND
35 DSI-D0N 36 DSI-D0P
37 GND 38 DSI-D1N
39 DSI-D1P 40 GND
41 DSI-D2N 42 DSI-D2P
43 GND 44 DSI-D3N
45 DSI-D3P 46 GND
47 DSI-CKN 48 DSI-CKP
49 GND 50 SPDIF-IN
51 SPDIF-OUT 52 GND
53 I2S1-DIN 54 I2S1-BCLK
55 I2S1-LRCK 56 I2S1-MCLK
57 EARGND2 58 LRADC0
59 EARGND2 60 LRADC1

EXPANSION GPIO — J5

引脚号 功能 引脚号 功能
1 VCC-5V 2 VCC-5V
3 GND 4 VCC-LCD
5 VCC-LCD 6 GND
7 UART4-TX 8 UART4-RX
9 GND 10 VCC-JTAG
11 VCC-JTAG 12 AP-RESET#
13 TMS0 14 TCK0
15 TDO0 16 TDI0
17 JTAG-SEL0 18 GND
19 SPI0-MOSI 20 SPI0-MISO
21 SPI0-CLK 22 SPI0-CS0
23 GND 24 CSI2-D0N
25 CSI2-D0P 26 GND
27 CSI2-D1N 28 CSI2-D1P
29 GND 30 CSI2-D2N
31 CSI2-D2P 32 GND
33 CSI2-D3N 34 CSI2-D3P
35 GND 36 DSI-D0P
37 CSI2-CKP 38 GND
39 TWI3-SCK 40 TWI3-SDA
41 GND 42 MCS-MCLK1
43 GND 44 CAM-R-STBY-EN
45 CAM-R-RESET# 46 GND
47 PH0 48 PH1
49 PH2 50 PH3
51 PH4 52 PH5
53 PH6 54 PH7
55 PH8 56 PH29
57 PH30 58 GND
59 USB-DP0 60 USB-DM0

EXPANSION LVDS — J6

引脚号 第一功能 第二功能 引脚号 第一功能 第二功能
1 LVDS0-D0P LCD0-D0 2 LVDS0-D0N LCD0-D1
3 GND   4 LVDS0-D1P LCD0-D2
5 LVDS0-D1N LCD0-D3 6 GND  
7 LVDS0-D2P LCD0-D4 8 LVDS0-D2N LCD0-D5
9 GND   10 LVDS0-CLKP LCD0-D6
11 LVDS0-CLKN LCD0-D7 12 GND  
13 LVDS0-D3P LCD0-D8 14 LVDS0-D3N LCD0-D9
15 GND   16 LVDS1-D0P LCD0-D10
17 LVDS1-D0N LCD0-D11 18 GND  
19 LVDS1-D1P LCD0-D12 20 LVDS1-D1N LCD0-D13
21 GND   22 LVDS1-D2P LCD0-D14
23 LVDS1-D2N LCD0-D15 24 GND  
25 LVDS1-CLKP LCD0-D16 26 LVDS1-CLKN LCD0-D17
27 GND   28 LVDS1-D3P LCD0-D18
29 LVDS1-D3N LCD0-D19 30 GND  
31 LCD0-D20   32 LCD0-D21  
33 LCD0-D22   34 LCD0-D23  
35 LCD0-CLK   36 LCD0-HSYNC  
37 LCD0-DE   38 LCD0-VSYNC  
39 LCD-PWM   40 LCD-BL-EN  
41 GND   42 CTP-WAKE  
43 CTP-INT   44 TWI1-SCK  
45 TWI1-SDA   46 GND  
47 RTP-X1   48 RTP-X2  
49 RTP-Y1   50 RTP-Y2  
51 GND   52 VCC2V8-LCD  
53 VCC2V8-LCD   54 VCC2V8-LCD  
55 GND   56 VCC1V8-LCD  
57 VCC1V8-LCD   58 GND  
59 VCC-5V   60 VCC-5V  

GPIO 内核配置

Note

本节中所说的内核配置针对全志提供的旧版内核,而非主流内核。不过方法相同。

在用户应用使用 GPIO 之前,需要在内核中配置 GPIO 的 sysfs 支持。具体的配置方式如下:

Device Drivers  --->
                GPIO Support  --->
                            /sys/class/gpio/... (sysfs interface)

在内核中,启用上述配置即可,默认在 arch/arm/configs/loftq_linux_defconfig 中已经启用了该配置。

GPIO 使用示例

使用上述配置生成的内核,然后可以在应用中通过下面的示例进行测试。下面分别是通过命令行和C语言进行访问和测试的方法,基本的过程如下:

  • 根据 GPIO 名称计算实际对应的 gpio 编号

    全志方案的 gpio 编号计算方式: (第二个字母在字母序列中的位置 - 1) x 32 + 针口编号 。例如 PC13 或者 pc13 ,那么它的计算方式分别如下:

    pc13 的编号计算: (‘c’-‘a’)*32 + 13 ,结果为 77

    PC13 的编号计算: (‘C’-‘A’)*32 + 13 ,结果为 77

  • 导出 GPIO 访问路径和接口

  • 设置 GPIO 使用方式为输入或者输出

  • GPIO 读取或者写入访问

  • 取消 GPIO 导出

命令行访问和测试

我们以 “PC13” 为例作为测试。首先是确定其实际的 gpio 编号。根据前面介绍中的计算方式,可以知道 “PC13” 的 GPIO 编号为 77

  • 导出 GPIO 访问路径命令:

    echo 77 > /sys/class/gpio/export
    
  • 设置 GPIO 访问方式,输入或者输出,前一个为设置为输出模式,后一个设置为输入模式:

    echo "out" > /sys/class/gpio/gpio77/direction
    
    echo "in" > /sys/class/gpio/gpio77/direction
    
  • 如果设置为输出模式,下述分别为将 GPIO 设置为高和低的输出:

    echo 1 > /sys/class/gpio/gpio77/value
    
    echo 0 > /sys/class/gpio/gpio77/value
    
  • 如果设置为输入模式,可以通过下属命令读取当前 GPIO 的状态:

    cat /sys/class/gpio/gpio77/value
    
  • 取消 GPIO 导出:

    echo 77 > /sys/class/gpio/unexport
    

C语言访问和测试

对于 C 语言的访问方式与上述方式相同,只是所有的文件打开和访问,写入操作均使用 C 语言的方法来完成。

具体的实现可以参考我们的 jennic-util 中所使用的 gpio 相关代码。

更多参考

linux-sunxi 社区 GPIO 使用: http://linux-sunxi.org/GPIO