背景
有时候在调试新项目开发板,上电启动后串口完全没有打印信息,开发板没有一点信息反馈,这时候我们需要在uboot代码的stage1阶段汇编代码中实现LED点亮来测试CPU是否加载了启动代码,以此来判断整个CPU和开发板的状态。
实现
整体实现流程:查看LED灯GPIO口、获取GPIO口基地址、获取方向和数据寄存器地址、写汇编代码进行测试;
NXP IMX7D
查看电路图,可看出LED接在GPIO2口上,接下来查看芯片手册GPIO2寄存器信息;
获取GPIO2寄存器基地址,芯片手册NXP IMX7DRM.pdf,基地址为0x30210000;
GPIO2寄存器详细描如下:
方向寄存器和详细描述如下:
32位的bit位对应GPIO2_IOx,0表示INPUT,1表示OUTPUT;
数据寄存器详细描述如下:
当方向寄存器设置为OUTPUT时电平可拉高拉低、32位bit对应GPIO2_IOx,0表示低,1表示高;
汇编代码编写,先计算出方向寄存器地址需要写入的数据,GPIO2_IO2/3,对应bit位的2和3,这里设置为OUTPUT,那么二进制值应该为1100,换算成十六进制为0xc;
数据寄存器数据计算,看电路图可知点亮LED需拉高输出电平,那么对应bit位是1100,换算成十六进制为0xc;
汇编代码如下:
ldr r0, =0x30210004 #将寄存器地址0x30210004写入r0寄存器中
mov r1, #0xc #将立即数0xc移动到r1寄存器中
str r1, [r0] #将r1源寄存器中一个32位的数据传送到r0存储器中
ldr r0, =0x30210000
mov r1, #0xc
str r1, [r0]
下面汇编代码实现LED D14灯点亮功能;
TI AM437X
电路图:AM437x Sitara™ 处理器 (Rev. A).pdf
查看芯片手册GPIO口为GPIO3:
D15 - LED1 - SAI2_TXC - GMII1_CRS/MCASP1_ACLKX - gpio3_1
D14 - LED2 - SAI2_TXFS - GMII1_RXERR/MCASP1_FSX - gpio3_2
基地址:AM437X Manual.pdf
功能寄存器:
方向寄存器:
数据寄存器:
计算寄存器值:
设置GPIO3_1位输出:
0x481AE000 + 134 = 0x0
设置GPIO3_1拉高:
0x481AE000 + 13c = 0x2
扩展
uboot命令读写寄存器
mw [.b, .w, .l, .q] address value [count]
md [.b, .w, .l, .q] address [# of objects]
也可实现电灯动作,例如imx8mm电灯:
SYS_LED1 GPIO1_14 0x4000
SYS_LED2 GPIO1_13 0x2000
Start Address End Address Region NIC Port Size
方向 mw 0x30200004 0x6000
数据 mw 0x30200000 0x6000 开灯
mw 0x30200000 0x0000 关灯