OMAP3 Linux 中的MUX设置
OMAP3 处理器的引脚都有很多功能,具体有哪些功能,需要在什么寄存器进行设置,需要看《系统控制模块》部分的描述。
如果知道引脚的功能或者名称,直接搜索应该可以找到对应的寄存器。
如果知道某个引脚的IO数目,在文中搜索gpio_xxx应该就可以找到对应的寄存器等信息。
先看两个文件:
./arch/arm/mach-omap2/mux.c
./arch/arm/plat-omap/include/mach/mux.h
其中mux.c中的一些设置:
static struct pin_config __initdata_or_module omap34xx_pins[] = {
/*
* Name, reg-offset,
* mux-mode | [active-mode | off-mode]
*/
/* 34xx I2C */
MUX_CFG_34XX("K21_34XX_I2C1_SCL", 0x1ba,
OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
MUX_CFG_34XX("J21_34XX_I2C1_SDA", 0x1bc,
OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
...... 省略
}
|
这里有一项设置是有关寄存器偏移地址的,注意,这里的偏移地址是以字节为单位的,而手册给的是以字为单位的,以上述的I2C1_SCL为例,手册查到的是:
CONTROL_PADCONF_HSUSB0_DATA7[31:16] 0x4800 21B8 PU/PD 0b11 - i2c1_scl
由于实际控制I2C_SCL这个引脚的有效寄存器单元是 0x4800 21b8 这个地址的寄存器 CONTROL_PADCONF_HSUSB0_DATA7 的 bit[31:16],所以地址应该是 0x4800 21bA。
而基地址是 0x4800 2000 。
这就是偏移地址0x1ba的由来。
mux.h中:
enum omap34xx_index {
/* 34xx I2C */
K21_34XX_I2C1_SCL,
J21_34XX_I2C1_SDA,
AF15_34XX_I2C2_SCL,
AE15_34XX_I2C2_SDA,
...... 省略
}
|
然后来看一个使用范例,关于I2C的:
见:./arch/arm/plat-omap/i2c.c文件:
static const int omap34xx_pins[][2] = {
{ K21_34XX_I2C1_SCL, J21_34XX_I2C1_SDA},
{ AF15_34XX_I2C2_SCL, AE15_34XX_I2C2_SDA},
{ AF14_34XX_I2C3_SCL, AG14_34XX_I2C3_SDA},
};
static void __init omap_i2c_mux_pins(int bus)
{
int scl, sda;
scl = omap34xx_pins[bus][0]; sda = omap34xx_pins[bus][1];
omap_cfg_reg(sda);
omap_cfg_reg(scl);
}
|
在mux.c和mux.h中进行设置后,在使用到这个引脚的地方需要使用omap_cfg_reg进行设置才能生效。
另外,注意 arch/arm/plat-omap/mux.c文件,其中使用了条件编译对omap_cfg_reg进行处理,编译开关:CONFIG_OMAP_MUX
如果没有配置CONFIG_OMAP_MUX,omap_cfg_reg是空函数,无法实现MUX功能。在beagle中默认配置是没有的,需要打开才可以。
阅读(2069) | 评论(0) | 转发(1) |