内核是2.6.37.
1.在dm365.c文件中定义了dm365_pins结构体
static const struct mux_config dm365_pins[] = {
#ifdef CONFIG_DAVINCI_MUX
MUX_CFG(DM365, MMCSD0, 0, 24, 1, 0, false)
MUX_CFG(DM365, SD1_CLK, 0, 16, 3, 1, false)
MUX_CFG(DM365, SD1_CMD, 4, 30, 3, 1, false)
MUX_CFG(DM365, SD1_DATA3, 4, 28, 3, 1, false)
MUX_CFG(DM365, SD1_DATA2, 4, 26, 3, 1, false)
MUX_CFG(DM365, SD1_DATA1, 4, 24, 3, 1, false)
MUX_CFG(DM365, SD1_DATA0, 4, 22, 3, 1, false)
……
}
2.MUX_CFG宏定义是在arch\arm\mach-davinci\Mux.h中
#define MUX_CFG(soc, desc, muxreg, mode_offset, mode_mask, mux_mode, dbg)\
[soc##_##desc] = { \
.name = #desc, \
.debug = dbg, \
.mux_reg_name = "PINMUX"#muxreg, \
.mux_reg = PINMUX(muxreg), \
.mask_offset = mode_offset, \
.mask = mode_mask, \
.mode = mux_mode, \
},
意思就是把引脚复用寄存器muxreg的第mode_offset位先与~mode_mask取与运算,再和mux_mode取或运算。具体的实现是在arch\arm\mach-davinci\Mux.c中实现的
3.具体寄存器操作实现代码在mux.c文件中的davinci_cfg_reg函数中。对davinci_soc_info操作。而davinci_soc_info中包含结构体const struct mux_config *pinmux_pins;其值就是结构体dm365_pins。具体赋值是在dm365.c文件中的static struct davinci_soc_info davinci_soc_info_dm365的结构体定义时进行的。
4.在dm365.c中通过调用davinci_cfg_reg函数实现对IO口的配置
从而完成了对复用寄存器的设置。