第三篇主要是关于2440开发板时钟部分的描述,由于原作者的板子是mini2440,因此串口没有正常输出,作者对时钟部分做了调整,在这里我没有改动原文,保留在此作为日后参考。


原文

在前面两篇文章中,介绍了U-Boot的基本移植过程、LED驱动及宏定义的修改等,本文主要在此基础上导入串口输出的设置方法及系统运行频率的设置等。在串口移植成功后大家可根据自身需要修改Nand Flash、Net等其它驱动模块。

请同时关注以下两文章:

移植u-boot-2009.06-rc3到友善之臂matrix4开发板step1
http://lion3875.blog.51cto.com/2911026/532319


移植u-boot-2009.06-rc3到友善之臂matrix4开发板step2
http://lion3875.blog.51cto.com/2911026/532316

U-Boot提供了一个简单的功能菜单,有点像一个微型的Shell,它可以接收用户命令,执行相应的操作。默认情况下,菜单是通过第一个串口输出到上位机进行显示的,当然你也可以把菜单输出到其它串口或USB口或显示屏上,后面几种情况要求比较高,不在本文讨论之列。

在经过了Step2后,按理说应该能从串口正常输出了啦。

(至此,开始mini2440的相关调整工作)

再次确认了串口初始化和相关操作设置,主要是查看了cpu/arm920t /s3c24×0/serial.c文件,因为S3C2440的串口设置与S3C2410完全一致不需要作任何更改啊,在经过了多次试验之后还是无法正常输出。

在仔细阅读了别人的移植文章,结全提供的Patch补丁文件,找出来可能是原因是系统时钟频率问题,能影响串口正常工作的也正是时钟频率问题。 S3C2410在12MHz外部时钟的情况下,默认运行主频是200MHz左右,而S3C2440在正常情况下是运行在400MHz左右,这也是2440 区别于2410的一个重点方面,另外2440在工业参数方面优于2410并且多了一个摄像头接口中。

目标明确,对系统时钟进行手工初始化,让它明明白白地按照我们的要求去运行。在U-Boot里系统的初始化有两部分,在start.S中有CPU的初始化,还有就是在切换到C语言函数下,也有一部分通过C语言来进行系统初始化的函数,分别进行修改。

在汇编文件中增加时钟初始化。打开cpu/arm920tstart.S,找到初始化系统中继的位置(注意,此时禁用中断相关代码也要做一定修改,参考数据手册),在其下方加入以下代码:



第一段代码定义了相关寄存器,CLKDIVN前面已有定义;第二段设置了USB时钟频率48MHz;第三段设置了系统的主频405MHz;第四段设置了分频系数,将主频降频分配给系统总线,等其它慢速设备使用,基本原理跟PC上相似,串口时钟也从分频后的时钟中获得。具体的0×38022、 0×7F021请各位参考S2C2440数据手册第7章Clock&Power Management。

C文件中的时钟初始化,打开board/samsung/mini2440/mini2440.c,修改M_MDIV、
M_PDIV、M_SDIV等几个值,在这里主要就是修改宏定义,改成与前面在汇编文件中寄存器设置的参数一致即可,USB口的频率设置无所谓,详细修改方案参照附件的Patch补丁文件。

做完了这几步,再次仔细确认了下所有相关文件。编译、下载,还是不能正常显示,不过有时会有乱码出来,那可能还是时钟问题,已经相当接近了。到了这一步,如果要解决问题,原则上是要把串口初始化代码及相关代码走读一遍的,但是我并没有这么做,而是直接参考了别人的Patch文件,原来要修改 cpu/arm920t/s3c24×0/speed.c中的频率计算函数。2440中FCLK的计算与2410有一定的区别,是原2410计算值的2 倍,另外已知前面设置的分频参数是FCLK:HCLK:PCLK=1:4:8,直接把HCKL设为FCLK的1/4,代码修改如下:













修改好后,编译下载,从串口成功输出了调试信息,你可以选择相应功能进行操作。从串口初始化代码中看到,串口初始化时需要根据波特率设置配置寄存器,而寄存器的设置值要通过HCLK与波特率计算得出,当调用了错误的get_HCLK()函数后当然是不能输出,或输出乱码,因此在移植的过程中一定要非常仔细,在没有头绪的时候,也可以根据Step2提供的LED点灯程序来定位问题出现的位置。

好了,U-Boot的移植就到此为止了,暂时也不想去做Nand Flash或网卡驱动的移植,那东西还是比较复杂的,下一步打算就是移植Linux,同样是通过Supervivi下载到内存中运行、调试。