摄像头模块的GPIO操作

通用输入输出
每个管脚可以配置为输入或者输出,具体步骤如下:
步骤 1. 参考“管脚复用控制寄存器”配置管脚的相应位,使能需要使用的 GPIO 管脚功能。
步骤 2. 配置寄存器 GPIO_DIR ,选择 GPIO 是作为输入还是输出。
步骤 3. 当配置成输入管脚时,读取 GPIO_DATA 寄存器可查看输入信号值;当配置成输出管
脚时,通过向 GPIO_DATA 寄存器写入输出值可控制 GPIO 管脚输出电平。
管脚复用控制寄存器可以在
doc/ReleaseDoc/zh/00.hardware/chip/Hi3516EV200/Hi3516EV200_PINOUT_CN.xlsx
查到。

p3原先作为led端口,有两个GPIO,管脚定义为
1 IRIN_GPIO1_7 IRIN
2 GND 接地
3 GPIO2_0 GPIO/PWM iocfg_reg51

GPIO1_7的复用寄存器为
iocfg_reg50,为芯片86脚,地址为 0x120c001c,缺省值为0x1400
该寄存器定义为:
31:11 保留。
10 电平转换速率控制,为0时电平转换速率快,为1时电平转换速率慢。
9 下拉电阻使能,高有效。
8 上拉电阻使能,高有效。
7:4 管脚驱动能力选择:
0x0:IO2档位4;
0x1:IO2档位3;
0x2:IO2档位2;
0x3:IO2档位1;
其它:保留。
3:0 功能选择:
0x0:JTAG_TDO;
0x1:SPI1_SDO;
0x2:GPIO1_7;
0x4:UART2_RTSN;
0x5:I2S_SD_RX;
其它:保留。
设置复用状态为GPIO1_7
mw.w 0x120c001c 0x0002 1

GPIO2_0的复用寄存器为
iocfg_reg51 为芯片85脚,地址为 0x120c0020,缺省值为0x1D00
该寄存器定义为:
31:11 保留。
10 电平转换速率控制,为0时电平转换速率快,为1时电平转换速率慢。
9 下拉电阻使能,高有效。
8 上拉电阻使能,高有效。
7:4 管脚驱动能力选择:
0x0:IO2档位4;
0x1:IO2档位3;
0x2:IO2档位2;
0x3:IO2档位1;
其它:保留。
3:0 功能选择:
0x0:JTAG_TDI;
0x1:SPI1_CSN1;
0x2:GPIO2_0;
0x3:SDIO0_CARD_POWER_EN;
0x4:PWM3;
0x5:I2S_SD_TX;
其它:保留。
设置复用状态为GPIO2_0
mw.w 0x120c0020 0x0002 1

GPIO的基址:
GPIO1 0x120B_1000
GPIO2 0x120B_2000

GPIO_DIR 为 GPIO 方向控制寄存器。用来配置 GPIO 管脚方向。
Offset Address: 400
Total Reset Value: 0x00
Bits [7:0] RW gpio_dir
GPIO 方向控制寄存器。bit[7:0]分别对应
GPIO_DATA[7:0],各比特可独立控制。
0:输入;
1:输出。
设置GPIO1_7 的方向为输出
mw.w 0x120b1400 0x0080 1
设置GPIO2_0 的方向为输入
mw.w 0x120b2400 0x0000 1

GPIO_DATA为GPIO数据寄存器,
Offset Address: 0x000~0x3FC
Total Reset Value: 0x00
GPIO_DATA寄存器利用PADDR[9:2]实现了读写寄存器比特的屏蔽操作。该寄存器对
应256个地址空间。PADDR[9:2]分别对应GPIO_DATA[7:0],当相应的bit为高时,则
可以对相应的位进行读写操作;反之,若对应bit为低则不能进行操作。例如:
若地址为0x3FC(0b11_1111_1100),则对GPIO_DATA[7:0]这8bit操作全部有
效。
若地址为0x200(0b10_0000_0000),则仅对GPIO_DATA[7]的操作有效。
要对GPIO_DATA[7]单独操作,操作地址则是
0b1000 0000<<2 = 0b 10 0000 0000 = 0x200
设置GPIO1_7 输出1
mw.w 0x120b1200 0xff 1

要对GPIO_DATA[0]单独操作,操作地址则是
0b0000 0001<<2 = 0b 00 0000 0100 = 0x004
查询GPIO2_0 电平
md.l 0x120b2003 1

而在uboot的源代码中,我们可以使用writel和readl函数操作寄存器,例如刷机功能键和指示灯可以通过下面方法实现

writel(0x02, 0x120c0020); //fun GPIO2_0
writel(0x02, 0x120c001c); //fun GPIO1_7
writel((0x01|readl(0x120b2400)), 0x120b2400); //dir output writel((0x7f&readl(0x120b1400)), 0x120b1400); //dir input
if(readl(0x120B1200)) {
udelay(1000000);
writel(0x01 ,0x120B2004); //set bit
}
else {
udelay(1000000);
writel(0x01 ,0x120B2004); //set bit udelay(1000000);
writel(0x00 ,0x120B2004); //reset bit udelay(1000000);
writel(0x01 ,0x120B2004); //set bit udelay(1000000);
writel(0x00 ,0x120B2004); //reset bit udelay(1000000);
writel(0x01 ,0x120B2004); //set bit udelay(1000000);
writel(0x00 ,0x120B2004); //reset bit udelay(1000000);
writel(0x01 ,0x120B2004); //set bit 刷机的函数入口}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值