好的,经过前面两篇文章,我们已经能够编译和烧写u-boot到sd卡上了,接下来就是调试,完善功能了。
说到调试,在此之前我想的调试方法是在串口还没有初始化之前,就只能通过点灯大法来调试了; 等到串口初始化完成后,就可以通过串口打印,这样调试就方便多了。不过后来看到了两篇文章,介绍的是通过jlink来进行源码级别的调试,但是我现在一来没有电烙铁,没办法将tiny4412上的jtag接口引出来,所以也就放弃了,有兴趣的朋友可以试一试使用jtag来进行源码级的调试和学习。后续我也会尝试使用jlink来进行调试和学习,毕竟现在也只是学习阶段,通过源码级别的调试,应该能学到更多东西。
blog的链接我就放这里了:
1. http://www.cnblogs.com/humaoxiao/p/4181078.html
2. http://www.cnblogs.com/humaoxiao/p/4166230.html
既然要用点灯调试,那么必然要做点灯的相关代码编写了,因为不确定代码跑到哪里就出现问题了,所以点灯代码还是使用汇编来编写会比较通用写。话不多说,下面开始写代码。
首先要了解的是tiny4412上LED灯的相关信息,截图如下:
看上面的截图可以了解到,只要将GPM4_0,GPM4_1,GPM4_2,GPM4_3设置为输出引脚,要让灯点亮的话,只要将引脚的设置为输出低电平就OK了。
下面编写测试代码:
diff --git a/arch/arm/cpu/armv7/start.S b/arch/arm/cpu/armv7/start.S
index 7eee54b..83eed98 100644
--- a/arch/arm/cpu/armv7/start.S
+++ b/arch/arm/cpu/armv7/start.S
@@ -85,6 +85,10 @@ switch_to_hypervisor_ret:
#endif
#endif
/* 添加的测试代码,测试LED代码是否正常,测试完毕需要删除 */
+ bl LED1_ON
+ bl LED2_ON
+ bl LED3_ON
+ bl LED4_ON
bl _main
/*------------------------------------------------------------------------------*/
@@ -293,3 +297,81 @@ ENTRY(cpu_init_crit)
b lowlevel_init @ go setup pll,mux,memory
ENDPROC(cpu_init_crit)
#endif
+
+ENTRY(LED1_ON)
+ /*
+ * GPM4CON Address = 0x110002E0
+ * GPM4DAT Address = 0x110002E4
+ */
+ ldr r0, =0x110002E0
+ ldr r1, [r0] //读出GPM4CON的值
+ bic r1, r1, #0xf //将GPM4CON[0:3]清零
+ orr r1, r1, #0x1 //将GPM4_0设置为输出引脚
+ str r1, [r0] //将设置的值写回GPM4CON
+
+ ldr r0, =0x110002E4
+ ldr r1, [r0] //读出GPM4DAT的值
+ bic r1, r1, #0 //将CPM4DAT的第[0]清零,清零就是输出低电平了
+ str r1,