移植u-boot-2009.03到友善之臂mini2440开发板step3
在前面两篇文章中,介绍了U-Boot的基本移植过程、LED驱动及宏定义的修改等,本文主要在此基础上导入串口输出的设置方法及系统运行频率的设置等。在串口移植成功后大家可根据自身需要修改Nand Flash、Net等其它驱动模块。
请同时关注以下两文章:
移植u-boot-2009.03到友善之臂mini2440开发板step1
移植u-boot-2009.03到友善之臂mini2440开发板step2
U-Boot提供了一个简单的功能菜单,有点像一个微型的Shell,它可以接收用户命令,执行相应的操作。默认情况下,菜单是通过第一个串口输出到上位机进行显示的,当然你也可以把菜单输出到其它串口或USB口或显示屏上,后面几种情况要求比较高,不在本文讨论之列。
在经过了Step2后,按理说应该能从串口正常输出了啦,再次确认了串口初始化和相关操作设置,主要是查看了cpu/arm920t/s3c24x0/serial.c文件,因为S3C2440的串口设置与S3C2410完全一致不需要作任何更改啊,在经过了多次试验之后还是无法正常输出。
在仔细阅读了别人的移植文章,结全提供的Patch补丁文件,找出来可能是原因是系统时钟频率问题,能影响串口正常工作的也正是时钟频率问题。S3C2410在12MHz外部时钟的情况下,默认运行主频是200MHz左右,而S3C2440在正常情况下是运行在400MHz左右,这也是2440区别于2410的一个重点方面,另外2440在工业参数方面优于2410并且多了一个摄像头接口中。
目标明确,对系统时钟进行手工初始化,让它明明白白地按照我们的要求去运行。在U-Boot里系统的初始化有两部分,在start.S中有CPU的初始化,还有就是在切换到C语言函数下,也有一部分通过C语言来进行系统初始化的函数,分别进行修改。
在汇编文件中增加时钟初始化。打开cpu/arm920tstart.S,找到初始化系统中继的位置(注意,此时禁用中断相关代码也要做一定修改,参考数据手册),在其下方加入以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #define MPLLCON 0x4C000004 #define UPLLCON 0x4C000008 ldr r0, =UPLLCON ldr r1, =0x38022 str r1, [r0] ldr r0, =MPLLCON ldr r1, =0x7F021 str r1, [r0] ldr r0, =CLKDIVN mov r1, #5 str r1, [r0] |
第一段代码定义了相关寄存器,CLKDIVN前面已有定义;第二段设置了USB时钟频率48MHz;第三段设置了系统的主频405MHz;第四段设置了分频系数,将主频降频分配给系统总线,等其它慢速设备使用,基本原理跟PC上相似,串口时钟也从分频后的时钟中获得。具体的0×38022、0x7F021请各位参考S2C2440数据手册第7章Clock&Power Management。
C文件中的时钟初始化,打开board/samsung/mini2440/mini2440.c,修改M_MDIV、
M_PDIV、M_SDIV等几个值,在这里主要就是修改宏定义,改成与前面在汇编文件中寄存器设置的参数一致即可,USB口的频率设置无所谓,详细修改方案参照附件的Patch补丁文件。
做完了这几步,再次仔细确认了下所有相关文件。编译、下载,还是不能正常显示,不过有时会有乱码出来,那可能还是时钟问题,已经相当接近了。到了这一步,如果要解决问题,原则上是要把串口初始化代码及相关代码走读一遍的,但是我并没有这么做,而是直接参考了别人的Patch文件,原来要修改cpu/arm920t/s3c24x0/speed.c中的频率计算函数。2440中FCLK的计算与2410有一定的区别,是原2410计算值的2倍,另外已知前面设置的分频参数是FCLK:HCLK:PCLK=1:4:8,直接把HCKL设为FCLK的1/4,代码修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ulong get_FCLK(void) { ...... p = ((r & 0x003F0) >> 4) + 2; s = r & 0x3; if(pllreg == MPLL) return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s)); else return((CONFIG_SYS_CLK_FREQ * m) / (p << s)); } ulong get_HCLK(void) { return (get_FCLK()/4); } |
修改好后,编译下载,从串口成功输出了调试信息,你可以选择相应功能进行操作。从串口初始化代码中看到,串口初始化时需要根据波特率设置配置寄存器,而寄存器的设置值要通过HCLK与波特率计算得出,当调用了错误的get_HCLK()函数后当然是不能输出,或输出乱码,因此在移植的过程中一定要非常仔细,在没有头绪的时候,也可以根据Step2提供的LED点灯程序来定位问题出现的位置。
好了,U-Boot的移植就到此为止了,暂时也不想去做Nand Flash或网卡驱动的移植,那东西还是比较复杂的,下一步打算就是移植Linux,同样是通过Supervivi下载到内存中运行、调试。
读者有什么问题,可以在下面发表评论或给我留言,每个问题我都会认真阅读,需要回复的,请留下邮箱。
我崇拜你。。。
飘了。。。
您好!请教U-boot-2009-08的board下面有没有那个板子用的是PXA270或320的CPU啊?谢谢。还有用U-boot-2009需要配合那个版本的arm-linux-gcc?
首先到board目录下去找有没有pxa270相关的关键字:grep -r “pxa270″ *,没找到,缩短关键字“pxa”这回找到了,还不少。不过大部份都是:pxa250。再到网上去查250与270的区别,它们的区别类似于2410和2440之间的区别,应此,你可以选一个使用PXA250的,并且外围设备与你相近的Board使用。
不同版本的编译链,编译出来的结果是有所不同,可以新解压一个U-Boot,直接进行Config、Complie来验证编译链是否有问题,当然并不是说遇到问题就怀疑工具的问题,也要耐心地去看一个问题现象,尝试解决等。
你好!
我怎么没找到你说的patch呢?在哪里能不能发一个?
文章最底下有个链接的呀,http://www.stars625.com/wp-content/uploads/2009/05/u-boot-200903-mini2440.patch
谢谢回信!
你留的PATCH我解压总是不成功
我也在改我的uboot,串口一直没有输出。加的LED指示灯倒是都亮了,调
试工具不太熟悉。所以想看看你的speed.c这个文件,能不能传给我啊?
如果能给我留一下你的QQ之类可以即时沟通的工具就更好了
你好,我上传的Patch文件其实就是一个文本文件,你可以用文本编辑器打开。以“+”号开头的行就是新增的,以“-”号开头的行是删除的,耐心看一下应该能读懂。
Patch文件不能解压,应该用Patch命令打补丁,在网站的最下面有我的邮箱,是图片格式的,需要联系的话,麻烦你手动输一下吧。