星期四, 一月 17, 2008

移植uboot到2410上总结

这两天有点空闲时间,自己忙里偷闲,偷偷的在实验室的板子上移植了uboot
板子是我们自己制版焊接的,所以稳定性不是很好,不过凑合也能正常工作,一直以来工作都是用vivi,但是这个版本的vivi没有tftp下载功能,所以用xmodem协议下载zImage的时候太漫长了,而自己想移植个带tftp功能的vivi,可是由于没那么多时间就一直没成功,一直uboot也是试试,如果折腾折腾没成功,估计最后也得放弃,毕竟现在没那么多时间,而且主管也没给那个时间,这一切都是凭着工作之余,自己的兴趣所在。
板子是参考广州斯道2410的公版,还有友善之臂,反正内核什么的都没改直接就用他们的这些能正常在我们的板子上跑,我想硬件都一样吧,要不然也不能正常的跑,而且都是smdk2410公版的修改,(硬件是另一个同事做的,我具体不是很懂,不过应该和我想想的一样)
uboot是1.1.4的主要参考了
要参考了luofuchong 大侠
http://www.hhcn.com/cgi-bin/topic.cgi?forum=3&topic=562&start=0&show=
和bekars大侠
http://dev.csdn.net/article/84/84538.shtm
代码就是直接下载的xiaoluo的代码,然后打上他的补丁就ok了
make distclean
make clean
make smdk2410_config
make
就可以生成u-boot.bin了
用sjf2410烧写可以看到能够在板子上启动
一切都比较顺利(我想这都是因为xiaoluo都已经改过了)
但是还是有些问题,那就是不能正常引导内核
到Uncompressing Linux....................................................... done, booting the kernel的时候就停住了
这时候自己连uboot的基本命令都还不懂,又上网查了查用法
继续试验,还是不行,后来参考了另一个帖子,说是因为内核参数没有正确传递的原因,内核应该启动起来了,可是就是没有输出信息,和我在调试其他驱动的时候把console设为tty0一样,于是就朝着这个方向去解决问题
修改board目录下smdk2410.c
#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elif FCLK_SPEED==1 /* Fout = 202.8MHz */
//#define M_MDIV 0xA1
//#define M_PDIV 0x3
//#define M_SDIV 0x1
#define M_MDIV 0x /* Fout = 200MHz */
#define M_PDIV 0x4
#define M_SDIV 0x0

#endif
在include/configs/smdk2410.h中加上

#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */

#define CONFIG_SETUP_MEMORY_TAGS 1

#define CONFIG_INITRD_TAG 1

然后重新编译uboot

重新下载后,问题还是一样,很是郁闷,就有上网抠,查到还有人说是频率不对,我下面转的

几个帖子就是。
smdk2410的U-BOOT原来运行频率是202.8M,把U-BOOT的频率改成200M,

"board/smdk2410/smdk2410.c"

#define FCLK_SPEED 1

#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elif FCLK_SPEED==1 /* Fout = 202.8MHz */
//#define M_MDIV 0xA1
//#define M_PDIV 0x3
//#define M_SDIV 0x1
#define M_MDIV 0x5c /* Fout = 200MHz */
#define M_PDIV 0x4
#define M_SDIV 0x0
#endif

重新少些后问题依然,郁闷ing
后来又反复试验,在快要放弃的时候,突然发现有一次能引导kernel了
发现在这个uboot中有个bootargs参数要正确设置,由于受vivi影响,一直都是这么设置的
setenv bootargs="noinitrd console=ttyS0 root=/dev/mtdblock/4"
然后就saveenv了
以为没有问题,所以反复试验都没查这个,但是后来仔细printenv一看
bootargs="noinitrd=console=ttyS0 root=/dev/mtdblock/4"
不知道为什么多了个“=”
又反复设置,就是不能像vivi那样,不明白了,是不是这个uboot的bug还是uboot就是这样,没用过uboot不知道了
后来看设置bootcmd的时候是这样的:
setenv bootcmd=nand read 0x30000 0x1d0000
没有引号,不是自己想象的那样用引号括起来。
于是重新设置bootargs
setenv bootargs=noinitrd console=ttyS0 root=/dev/mtdblock/4
saveenv
这下终于可以boot kernel了
查点到这里就放弃了,回想起来,细心和坚持很重要,要不是坚持,可能这个问题就这么放过去了。
坚持!!!!!!!!!
再一次鼓励了我,虽然这次没什么太多的技术含量(个人感觉没有什么技术含量,就是google,还有就是直觉)
后来重新试验,发现上面修改的频率是有作用的,如果

#define M_MDIV 0x5c /* Fout = 200MHz */
#define M_PDIV 0x4
#define M_SDIV 0x0
改为
#define M_MDIV 0x5c /* Fout = 200MHz */
#define M_PDIV 0x4
#define M_SDIV 0x2
就出现了乱码,可能是波特率也随着改变了,所以有输出但是乱码,
但是

#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */

#define CONFIG_SETUP_MEMORY_TAGS 1

#define CONFIG_INITRD_TAG 1

这个还没有机会试验呢,但是我想也应该有作用的
不然kernel的参数就传递不过来了

0 意見: