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/unexport4. 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 为例:
- 查找 ALT Mode = ALT5
- Pad Settings:PKE – ENABLED
- Pad Registers:
[SW_PAD_CTL_PAD_EIM_ADDR22] - MUX Control:
[IOMUXC_SW_MUX_CTL_PAD_EIM_ADDR22] - ALT5 配置值:0x05UL
三、常见问题排查
问题 1:Device or resource busy
原因:引脚被内核配置为其他功能 解决:检查内核引脚配置,确保无冲突
问题 2:GPIO 导出正常但功能异常
原因:
- 引脚被其他功能占用(常见是被串口占用)
- 硬件电路有上拉/下拉控制
解决:
- 检查内核引脚复用配置
- 检查硬件原理图
四、测试流程
# 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