U-boot管脚复用

需要配置寄存器:pad控制器,Mux控制器,select input寄存器和Data寄存器
配置IOMUX的必备工具:1.芯片原理图;2.芯片软件手册; 3.内核源代码

1. 查看原理图

找到KEY_ROW6对应的GPIO_2

2. 找到对应的Pad/Group Registers

找到GPIO_2对应的控制寄存器 SW_PAD_CTL_PAD_GPIO02

SW_PAD_CTL_PAD_GPIO02寄存器: 控制引脚上拉电阻、下拉电阻和电源控制

3. 根据ALT5:GPIO1_IO02查找IOMUXC寄存器

a) IOMUXC:IOMUX_SW_MUX_CTL_PAD_GPIO02

GPIO1_IO02代表GPIO1组寄存器的第02个寄存器,也就是第3位

b) GPIO_2的功能ALT5:GPIO1_IO02用于查找其他寄存器

设置ALT5: 101模式

4. GPIO编程

4.1 读操作

1. 通过配置IOMUXC控制器使得IOMUX选择GPIO模式
2. 配置GPIO direction register为input模式(GPIO_GDIR[GDIR]设置为0)
3. 从data寄存器读值

While the GPIO direction is set to input (GPIO_GDIR = 0), a read access to GPIO_DR does not return GPIO_DR data. Instead, it returns the GPIO_PSR data, which is the corresponding input signal value.实际上PSR才是读到的值

// SET INPUTS TO GPIO MODE.
write sw_mux_ctl_<input0>_<input1>_<input2>_<input3>, 32'h00000000
// SET GDIR TO INPUT.
write GDIR[31:4,input3_bit, input2_bit, input1_bit, input0_bit,] 32'hxxxxxxx0
// READ INPUT VALUE FROM DR.
read DR
// READ INPUT VALUE FROM PSR.  
read PSR

4.2 写操作

1. 通过配置IOMUXC控制器使得IOMUX选择GPIO模式,如果需要通过PSR寄存器读取值,则需要enable SION位(通常置1)
2. 配置GPIO direction register为output模式(GPIO_GDIR[GDIR]设置为1)
3. 向data寄存器写值(GPIO_DR)

// SET PADS TO GPIO MODE VIA IOMUX.
write sw_mux_ctl_pad_<output[0-3]>.mux_mode, <GPIO_MUX_MODE>
// Enable loopback so we can capture pad value into PSR in output mode
write sw_mux_ctl_pad_<output[0-3]>.sion, 1
// SET GDIR=1 TO OUTPUT BITS.
write GDIR[31:4,output3_bit,output2_bit, output1_bit, output0_bit,] 32'hxxxxxxxF
// WRITE OUTPUT VALUE=4’b0101 TO DR.
write DR, 32'hxxxxxxx5
// READ OUTPUT VALUE FROM PSR ONLY.
read_cmp PSR, 32'hxxxxxxx5

5. 配置GDIR, PSR, DR寄存器

GPIO1寄存器组基地址

GPIO1_IO02: IO02代表第3个寄存器,其他寄存器根据偏移量指定

5.1 配置GDIR方向寄存器

0x000 0100

5.2 配置DR数据寄存器

5.3 从PSR寄存器读取值

6. 实例

点亮上面流程中的LED灯

6.1 设置复用功能控制器IOMUX为GPIO模式
// 复用控制器地址
volatile  uint_32  *p_GPIO02_IOMUX = (uint_32*)0x20E0234u;
// 配置
*p_GPIO02_IOMUX &= 0;    // 清MUX位段
*p_GPIO02_IOMUX |= 0x15; // 设置为GPIO模式

6.2 设置方向寄存器GDIR
// 基地址
volatile  uint_32  *p_BASE = (uint_32*)0x209C000u;
// 方向寄存器地址
volatile  uint_32  *p_GPIO_GDIR = p_BASE + 4;
// 1为output输出模式
*p_GPIO_GDIR |= (1 << 2)
// 0位input输入模式
*p_GPIO_GDIR &= ~(1 << 2)
6.3 设置数据寄存器DR
// 数据寄存器地址
volatile  uint_32  *p_GPIO_DR   = p_BASE + 0;
// 亮
*p_GPIO_DR |= (1<<2);
// 灭
*p_GPIO_DR &= ~(1<<2);
6.4 查看PSR寄存器
// PSR寄存器基地址
volatile  uint_32  *p_GPIO_PSR  = p_BASE + 8;
// 查看PSR内容
*p_GPIO_PSR
  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踏马潜行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值