一般来说,调试uboot最好的方式是使用openjtag,因为uboot说到底就是一段裸机程序,只不过比较复杂。但是受实际环境限制,实际工作中使用较多的调试技巧主要有两种:打印和直接在命令行测试,打印比较常见也比较简单,直接使用printf即可,这里就以最近这段时间调试uboot下面lcd为例,简单说说命令行调试。
平台:
AM335x,u-boot 2010.09,linux 3.10
问题:
由于此版本u-boot比较旧,没有整套framebuffer子系统框架,所以采取的是移植好官方裸机驱动,直接加入到u-boot编译,这样做虽然不符合u-boot和linux这种框架思想,但是简单又实用,比较让lcd能够显示比较重要,但是发现移植之后显示官方的图片是OK,显示其他的使用工具转换的确不正确,而是出现乱七八糟的彩条。
调试:
开始怀疑是时钟问题,但是对着CPU手册仔细看了看,似乎并没有问题,后面就怀疑图片转换有问题,然后就直接在u-boot界面使用命令进行了测试,最后发现,直接往显存写入内容,显示是没有问题,而是用工具转换而来的数值写入显存却不正确,然后更换了一个图片转数组工具,一切正常。下面是主要的调试过程,简单记录下,启动u-boot进入命令行界面后,然后依次按下面操作(此处显存地址为0x96fffffff,屏幕480*272,RGB565格式,因此整个屏幕需要内存为480*272*2字节):
1.检查显存数据是否正确
md 0x96fffffff 1000 // 查看显存的前1000个32bit数据
显示数据后,和图片转成的数据做对比,发现数据都是正确的
2.向显存写入内容,观察屏幕显示
mw 0x96fffffff 0x001f //RGB565-0x001f 写入2bytes全蓝,
观察屏幕显示为蓝色,由此确定向显存写入数据时,能够正确写入也能够正确显示,因此可以确定是图片转成的数据有问题,也就是格式不对,从而导致屏幕显示不正确。
最后总结一下:
调试u-boot,使用md和mw可以很方便查看内存情况,尤其分析内存数据时