uboot-汇编实现点亮LED灯

背景

    有时候在调试新项目开发板,上电启动后串口完全没有打印信息,开发板没有一点信息反馈,这时候我们需要在uboot代码的stage1阶段汇编代码中实现LED点亮来测试CPU是否加载了启动代码,以此来判断整个CPU和开发板的状态。

实现

    整体实现流程:查看LED灯GPIO口、获取GPIO口基地址、获取方向和数据寄存器地址、写汇编代码进行测试;

NXP IMX7D

    查看电路图,可看出LED接在GPIO2口上,接下来查看芯片手册GPIO2寄存器信息;

uboot-汇编实现点亮LED灯_第1张图片

    获取GPIO2寄存器基地址,芯片手册NXP IMX7DRM.pdf,基地址为0x30210000;

    GPIO2寄存器详细描如下:

uboot-汇编实现点亮LED灯_第2张图片

    方向寄存器和详细描述如下:

uboot-汇编实现点亮LED灯_第3张图片

    32位的bit位对应GPIO2_IOx,0表示INPUT,1表示OUTPUT;

    数据寄存器详细描述如下:

uboot-汇编实现点亮LED灯_第4张图片

    当方向寄存器设置为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灯点亮功能;

uboot-汇编实现点亮LED灯_第5张图片

TI AM437X

    电路图:AM437x Sitara™ 处理器 (Rev. A).pdf

uboot-汇编实现点亮LED灯_第6张图片

    查看芯片手册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

    功能寄存器:

uboot-汇编实现点亮LED灯_第7张图片

     方向寄存器:

uboot-汇编实现点亮LED灯_第8张图片

    数据寄存器:

uboot-汇编实现点亮LED灯_第9张图片

    计算寄存器值:

        设置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 关灯

 

你可能感兴趣的:(NXP/TI)