OKMX6DL/Q 平台 GPIO 功能应用笔记

概述

本文档介绍了在飞凌 OKMX6DL/Q 平台(IMX6 系列,Linux 3.0.35)上使用 GPIO 的完整方法。

一、Linux GPIO 子系统

1. GPIO 目录结构

/sys/class/gpio/
├── export          # 导出 GPIO
├── unexport        # 撤销导出
├── gpiochip0       # GPIO1 组(0-31)
├── gpiochip32      # GPIO2 组(32-63)
├── gpiochip64      # GPIO3 组(64-95)
├── gpiochip96      # GPIO4 组(96-127)
├── gpiochip128     # GPIO5 组(128-159)
├── gpiochip160     # GPIO6 组(160-191)
└── gpiochip192     # GPIO7 组(192-223)

2. GPIO 编号计算

GPIO编号 = (BANK - 1) × 32 + N

例如 GPIO7-IO03:

  • BANK = 7, N = 3
  • GPIO编号 = (7-1) × 32 + 3 = 195

3. GPIO 操作命令

# 导出 GPIO
echo 195 > /sys/class/gpio/export
 
# 配置方向
echo out > /sys/class/gpio/gpio195/direction
# 可选值:in, out, high, low
 
# 设置电平
echo 1 > /sys/class/gpio/gpio195/value
echo 0 > /sys/class/gpio/gpio195/value
 
# 读取状态
cat /sys/class/gpio/gpio195/value
 
# 取消导出
echo 195 > /sys/class/gpio/unexport

4. GPIO 寄存器

寄存器描述
GPIOx_DR数据寄存器,输出时驱动引脚
GPIOx_GDIR控制引脚方向
GPIOx_PSR输入时读取数据
GPIOx_ICR1中断触发方式配置
GPIOx_ICR2中断触发方式配置
GPIOx_IMR中断屏蔽寄存器
GPIOx_ISR中断状态寄存器
GPIOx_EDGR_SEL边沿触发方式设置

二、Pinmux 配置修改

1. 内核配置位置

  • 引脚功能定义:arch/arm/plat-mxc/include/mach/iomux-mx6q.h
  • 板级配置:arch/arm/mach-mx6/board-mx6q_sabresd.h

2. 示例:释放 SD3 卡引脚用作 GPIO

/* GPIO 配置 */
MX6Q_PAD_SD3_CLK__GPIO_7_3,
MX6Q_PAD_SD3_CMD__GPIO_7_2,
MX6Q_PAD_SD3_DAT2__GPIO_7_6,
MX6Q_PAD_SD3_DAT3__GPIO_7_7,
MX6Q_PAD_SD3_DAT4__GPIO_7_1,
MX6Q_PAD_SD3_DAT5__GPIO_7_0,
MX6Q_PAD_NANDF_D1__GPIO_2_1,
MX6Q_PAD_NANDF_D0__GPIO_2_0,
 
/* 注释掉原 SD 卡配置 */
/* MX6Q_PAD_SD3_CLK__USDHC3_CLK_50MHZ,
   MX6Q_PAD_SD3_CMD__USDHC3_CMD_50MHZ, ... */

3. Datasheet 查找方法

以 EIM_A22 为例:

  1. 查找 ALT Mode = ALT5
  2. Pad Settings:PKE – ENABLED
  3. Pad Registers:[SW_PAD_CTL_PAD_EIM_ADDR22]
  4. MUX Control:[IOMUXC_SW_MUX_CTL_PAD_EIM_ADDR22]
  5. ALT5 配置值:0x05UL

三、常见问题排查

问题 1:Device or resource busy

原因:引脚被内核配置为其他功能 解决:检查内核引脚配置,确保无冲突

问题 2:GPIO 导出正常但功能异常

原因:

  1. 引脚被其他功能占用(常见是被串口占用)
  2. 硬件电路有上拉/下拉控制

解决:

  1. 检查内核引脚复用配置
  2. 检查硬件原理图

四、测试流程

# 1. 确保引脚已配置为 GPIO 模式
# 修改 board-mx6q_sabresd.h 并重编译内核
 
# 2. 导出 GPIO
echo 195 > /sys/class/gpio/export
 
# 3. 配置为输出
echo out > /sys/class/gpio/gpio195/direction
 
# 4. 设置高电平
echo 1 > /sys/class/gpio/gpio195/value
 
# 5. 读取状态
cat /sys/class/gpio/gpio195/value

关联笔记