Live & Learn
分类: LINUX
2017-04-22 10:53:38
系统平台:珠海鼎芯D328 -- 基于i.MX6Q
系统版本:Linux3.0.35
一、GPIO使用函数
#include
1. 申请GPIO,并占用:
int gpio_request(unsigned gpio, const char *label);
int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
flags -- GPIO属性,例如:GPIOF_OUT_INIT_HIGH
*label -- GPIO名称
2. 释放GPIO的占用:
void gpio_free(unsigned gpio);
3. 设定GPIO传输方向:
输入:int gpio_direction_input(unsigned gpio);
输出:int gpio_direction_output(unsigned gpio, int value);
4. 获取GPIO的值:
int gpio_get_value(unsigned gpio);
5. 设置GPIO的值:
int gpio_set_value(unsigned gpio, int value);
6. 配置GPIO上拉下拉:( 关于IMx6中gpio的上拉,并未用到此类函数,需要配置相关寄存器,其中系统本身已经配置好部分IO,如需再配置其他IO需要手动 )
int gpio_pull_updown(unsigned gpio, unsigned value);
value = 0, normal
value = 1, pull up
value = 2, pull down
二、GPIO中断使用
1. GPIO转中断:
static inline int gpio_to_irq(unsigned gpio);
这个函数将GPIO的PIN值转换为相应的IRQ值(中断号),可以传给set_irq_type()、request_irq()和free_irq()使用;
2. 中断转GPIO:
irq_to_gpio()
这个函数返回的GPIO编号通常用来调用gpio_get_value(),比如在沿触发的中断中获取引脚的状态
3. GPIO中断申请:
static inline int__must_check request_irq(unsigned intirq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);
irq 要申请的硬件中断号;
handler 向系统登记的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev参数将被传递;
flags 是中断处理的属性,
*name 设备名称
*dev 将被传递的参数,在中断共享时会用到,一般设置为这个设备的device结构本身或者NULL。
当flags发生时,触发中断。
4. 设置中断触发方式:
set_irq_type( gpio_to_irq(unsigned gpio),IRQF_TRIGGER_FALLING )
三、GPIO在基于i.MX6的Linux3.0.35内核中的配置(这里均已GPIO_6_11为例)
1. GPIO管脚特定模式的相关配置在arch/arm/mach-mx6/iomux_mx6q.h文件中。
2. GPIO的宏定义配置参数在iomux-v3.h文件中
3. GPIO板级初始化管脚在board-mx6q_sabresd.h文件中
4. GPIO在内核的中使用名称定义
四、针对i.MX6DQ手册查看GPIO的配置与寄存器
1. 一个IC上的引脚,通过一个n选1的多路开关,把需要的外设连接到该引脚上。具体额配置通过IOMUXC_SW_MUX_CTL_PAD寄存器来实现。
如下图所示,是IOMUXC_SW_MUX_CTL_PAD_NAND_CS0_B的IO复用配置,主要分2部分,SION和IO复用;
SION:是软件强行配置模式,配置了该模式后,该IO的具体电平不由所连接的模块决定,而是可以由软件写入决定,该功能估计是在调试设备时使用;
IO复用:写入不同的配置,IO引脚所连接到对应的模块;
还有一个配套的寄存器是IOMUXC_SW_PAD_CTL_PAD,主要是用于配置管脚的上下拉、开漏、驱动强度、信号变化率等功能!
2. 配套的寄存器IOMUXC_SW_PAD_CTL_PAD_NAND_CS0_B,主要是用于配置管脚的上下拉、开漏、驱动强度、信号变化率等功能!
3. GPIO管脚模式、信号、配置和寄存器的对应关系等