i.MX6qSabreLite内核源码阅读笔记-----board-mx6q_sabrelite.c 分析----2

现在我们逐行分析mx6_sabrelite_board_init 里的内容

mxc_iomux_v3_setup_multiple_pads(mx6q_sabrelite_pads,
ARRAY_SIZE(mx6q_sabrelite_pads));

虽然我们知道这个函数是对mx6q_sabrelite_pads结构中的每个元素进行了初始化,但是我们还是看看这个函数到底怎么实现的,目的是什么,到了干了什么。

int mxc_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t *pad_list, unsigned count)
{
iomux_v3_cfg_t *p = pad_list;
int i;
int ret;


for (i = 0; i < count; i++) {
ret = mxc_iomux_v3_setup_pad(*p);
if (ret)
return ret;
p++;
}
return 0;
}

貌似相当简单 但是哈市进一步看看iomux_V3_cfg_t 和mxc_iomux_v3_setup_pad是什么吧!

typedef u64 iomux_v3_cfg_t;  这个牛逼,就这么简单,吓了我一大跳。真想不明白,你直接写个u64 不完了吗?搞的这么复杂。

其实就是一个指向padlist的指针,为下一步初始化做准备。

int mxc_iomux_v3_setup_pad(iomux_v3_cfg_t pad)
{
u32 mux_ctrl_ofs = (pad & MUX_CTRL_OFS_MASK) >> MUX_CTRL_OFS_SHIFT;
u32 mux_mode = (pad & MUX_MODE_MASK) >> MUX_MODE_SHIFT;
u32 sel_input_ofs = (pad & MUX_SEL_INPUT_OFS_MASK) >> MUX_SEL_INPUT_OFS_SHIFT;
u32 sel_input = (pad & MUX_SEL_INPUT_MASK) >> MUX_SEL_INPUT_SHIFT;
u32 pad_ctrl_ofs = (pad & MUX_PAD_CTRL_OFS_MASK) >> MUX_PAD_CTRL_OFS_SHIFT;
u32 pad_ctrl = (pad & MUX_PAD_CTRL_MASK) >> MUX_PAD_CTRL_SHIFT;


if (mux_ctrl_ofs)
__raw_writel(mux_mode, base + mux_ctrl_ofs);//写入的数据 mux_mode


if (sel_input_ofs)
__raw_writel(sel_input, base + sel_input_ofs);


if (!(pad_ctrl & NO_PAD_CTRL) && pad_ctrl_ofs)
__raw_writel(pad_ctrl, base + pad_ctrl_ofs);


return 0;
}
貌似就是对寄存器进行了配置,上帝啊!这谁能看得懂。还是赶紧翻阅一下手册吧!

static iomux_v3_cfg_t mx6q_sabrelite_pads[] = {
/* AUDMUX */
MX6Q_PAD_SD2_DAT0__AUDMUX_AUD4_RXD,
MX6Q_PAD_SD2_DAT3__AUDMUX_AUD4_TXC,
MX6Q_PAD_SD2_DAT2__AUDMUX_AUD4_TXD,
MX6Q_PAD_SD2_DAT1__AUDMUX_AUD4_TXFS,

首先从这里看起。。。

#define  MX6Q_PAD_SD2_DAT0__AUDMUX_AUD4_RXD \
(_MX6Q_PAD_SD2_DAT0__AUDMUX_AUD4_RXD | MUX_PAD_CTRL(NO_PAD_CTRL))


_MX6Q_PAD_SD2_DAT0__AUDMUX_AUD4_RXD  定义。。

#define _MX6Q_PAD_SD2_DAT0__AUDMUX_AUD4_RXD \
IOMUX_PAD(0x0368, 0x0054, 3, 0x07B4, 0, 0)


#define IOMUX_PAD(_pad_ctrl_ofs, _mux_ctrl_ofs, _mux_mode, _sel_input_ofs, \
_sel_input, _pad_ctrl) \
(((iomux_v3_cfg_t)(_mux_ctrl_ofs) << MUX_CTRL_OFS_SHIFT) | \
((iomux_v3_cfg_t)(_mux_mode) << MUX_MODE_SHIFT) | \
((iomux_v3_cfg_t)(_pad_ctrl_ofs) << MUX_PAD_CTRL_OFS_SHIFT) | \
((iomux_v3_cfg_t)(_pad_ctrl) << MUX_PAD_CTRL_SHIFT) | \
((iomux_v3_cfg_t)(_sel_input_ofs) << MUX_SEL_INPUT_OFS_SHIFT) | \
((iomux_v3_cfg_t)(_sel_input) << MUX_SEL_INPUT_SHIFT))


#define MUX_CTRL_OFS_SHIFT 0

#define MUX_MODE_SHIFT 36

#define MUX_PAD_CTRL_OFS_SHIFT 12

#define MUX_PAD_CTRL_SHIFT 41

#define MUX_SEL_INPUT_OFS_SHIFT  24

#define MUX_SEL_INPUT_SHIFT 59

所以呢?

看了半天也没有看明白这是个什么东西,但是大致的明白,其实mx6q_sabrelite_pads 这里面的一堆东西,表示地址和数据,下面的函数解析地址和数据,然后写入寄存器。大概的就是这样了。先不管它了,先看其他的,后头再看吧!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值