1、 操作GPIO的底层函数
操作一个IO口,首先要对其配置,例如工作模式、上下拉电阻、输入输出。
在板级开发包中提供了两种方法:
一、在linux/arch/arm/mach-omap2/board-am3517evm.c中有这样一个结构体
static struct omap_board_mux board_mux[] __initdata = {
/* USB OTG DRVVBUS offset = 0x212 */
OMAP3_MUX(CHASSIS_DMAREQ3,OMAP_MUX_MODE0|OMAP_PIN_INPUT_PULLDOWN),
{ .reg_offset = OMAP_MUX_TERMINATOR },
};
我们使用OMAP3_MUX这样一个宏来添加自己的配置。那么这些配置信息是怎么配置完成呢?
主要由下面的一个函数来完成,
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);具体这个函数做什么,就不详细说了,主要是向对应寄存器写值。
二、第二种方法是使用一个函数接口:
omap_mux_init_gpio(57, OMAP_PIN_OUTPUT);
这个方法可以直接对某个IO口进行配置。
这两种方法都是可行的,但是要注意一点,那就是寄存器的地址是否与你自己所用芯片的一致,由于omap系列有多款处理器,地址还是有很大区别的。这些定义主要在
mux34xx.h mux34xx.c
当然,也可以不使用这些接口,可以自己映射操作。比如:
#define OMAP34XX_PADCONF_START 0x48002030
#define OMAP34XX_PADCONF_SIZE 0x05cc
#define GPIO_56_MUX_OFFSET (0x480020B8 - OMAP34XX_PADCONF_START)
#define GPIO_57_MUX_OFFSET (0x480020BA - OMAP34XX_PADCONF_START)
#define GPIO_56_CFG_INT 0x011C /* IEN | PU | PEN | M4 */
#define GPIO_57_CFG_INT 0x011C /* IEN | PU | PEN | M4 */
void __iomem *base;
base = ioremap(OMAP34XX_PADCONF_START, OMAP34XX_PADCONF_SIZE);
if (base == NULL) {
printk(KERN_ERR "tps65070 gpio ioremap failed\n");
ret = -EINVAL;
goto err_misc;
}
iowrite16(GPIO_56_CFG_INT, base + GPIO_56_MUX_OFFSET);
iowrite16(GPIO_57_CFG_INT, base + GPIO_57_MUX_OFFSET);
iounmap(base);
如何将一个GPIO设置为输出或输入:
gpio_direction_output(102, 1);设置为输出1
gpio_direction_input(96); 设置为输入
omap系列的GPIO有防抖功能,设置如下:
omap_set_gpio_debounce(102, 1); 防抖功能使能
omap_set_gpio_debounce_time(102, 0xa); 防抖时间
2、 omap驱动的大概的分布与位置:
![omap-am3517板级开发包的一些说明 - 边缘之火 - 边缘之火](http://img1.ph.126.net/Nfvi7GCj7hN3afXo0hjDZA==/6597904295982851092.png)
其他驱动都是按照惯例存放于divers等目录
http://sxw0624.blog.163.com/blog/static/20016803820132121397814/