主题 : 移植u-boot-2009.03到友善之臂mini2440开发板step1 复制链接 | 浏览器收藏 | 打印
会当凌绝顶,一览众山小!
级别: 总版主
UID: 2
精华: 18
发帖: 1656
金钱: 13915 两
威望: 5380 点
综合积分: 3672 分
注册时间: 2008-01-01
最后登录: 2026-07-25
楼主  发表于: 2009-11-26 10:09

 移植u-boot-2009.03到友善之臂mini2440开发板step1

管理提醒: 本帖被 qq2440 从 Linux技术交流专区 移动到本区(2010-02-08)
网上介绍U-Boot移植的文章已经有很多了,但大多数文章都只讲了在哪个地方修改什么东西,但并未讲明白如何知道要修改这个值,如何是正确的移步骤。那么作者根据自身移植经历,通过三篇文章告诉你一般的U-Boot移植过程,本文主要讲解了移植的基本思路、方法。

很多嵌入式系统开发的初学者都有过这样的经历,买了ARM开发板,了解了基础的Bootloader相关知识,也知道U-Boot在这方面的应用相当广泛,希望自己也能移植成功。接下来就是下载源码,照着网上教程做,结果大部分都失败了,但又不甘心,于是再找教程,东拼西凑还是不行,试了几次就失去信心,做不下去了;即使做成功了,但也不知道别人怎么知道要改哪个文件、哪个数据,这么多文件人家是怎么找出来的,下次自己遇到款新的芯片能不能也移植成功。

根据教程移植失败,原因是多方面的:教程里的开发板、U-Boot版本与自身的不一致,细微的差别(比如LED、串口的引脚分配等)都有可能导致失败,即使全都一样的情况下,大家的知识水平也不一样,有些Makefile的更改等,作者未加以说明导致编译出错。下面根据我的经历写一下移植过程,根据本文不能保证你一定能移植成功,本文重点讲解的是移植过程中的思路、方法。

在大三的时候买过一个S3C44B0的开发板,大四的时候用过一段时间的S3C2410的实验箱,都曾尝试在这两个平台上移植U-Boot,均以失败告终;最近买了一块性价比较高的友善之臂mini2440开发板,移植成功了。个人觉得做移植必需要有一定的前导知识:开发环境的配制,你可以使用Windows平台下的Cygwin,可以在Windows下使用虚拟机安装Linux,可以直接安装一个Linux PC作开发;相应的你需要了解GCC编译工具的使用,交叉编译环境的设置,了解Makefile相关内容;一定的文档阅读能力,包括各种帮助文件、Readme、MCU数据手册等;根据数据手册编写一定的硬件驱动,如果没有以上知识准备建议照着开发板的实验手册,把所有例程都跑一遍。

在移植的过程中主要参考了以下两篇文章,感谢作者分享。
http://blog.chinaunix.net/u1/34474/showart_487416.html
http://blog.chinaunix.net/u1/34474/showart.php?id=1877493

由于只是为了学习基本的移植方法、流程,下文只进行了LED的相关驱动和串口输出设置以及其它一些必要的更改,至于Nor Flash、Nand Flash、网卡、USB的移植并未涉及。开发环境的设置可以参考mini2440的用户手册,写得相当详细。

买回来的开发板已经安装好了Bootloader,官方使用的是Supervivi,在下面的过程中我们尽量不搞破坏,用最简洁的方式,完成学习目标:在PC是编译好U-Boot,生成Bin文件,将开发板与PC通过串口和USB口相连,把生成的Bin文件通过USB口下载到开发板上RAM里,从RAM里直接运行,查看串口是否按要求输出信息。

请同时关注以下两文章:
移植u-boot-2009.03到友善之臂mini2440开发板step2
http://www.stars625.com/portinguboottomini2440step2.html
移植u-boot-2009.03到友善之臂mini2440开发板step3
http://www.stars625.com/portinguboottomini2440step3.html

解压U-Boot,把里面的README好好看一下,里面已经基本介绍了整个移植过程和配置文件的选项,基本的移植步骤都包括以下三个步骤:

1、在U-Boot源码Board中找一款与目标开发板配置相近的文件夹,在这里我们进入board/samsung目录,把smdk2410复制一份并命名为mini2440,进入mini2440目录,将里面的smdk2410.c改成mini2440.c,同时Makefile中也要作相应的更改。

2、进入include/configs目录,将smdk2410.h复制一份并命名为mini2440.h。

3、打开U-Boot根目录下的Makefile文件,搜索smdk2410,定位到smdk2410_config : unconfig处,对照该格式在下面加两行:

复制代码
  1. mini2440_config :   unconfig
  2.     @$(MKCONFIG) $(@:_config=) arm arm920t mini2440 samsung s3c24x0


注意在@$(MKCONFIG)前要加入一个TAB这是Makefile文件规则规定的,在第二行的第一个arm表示MCU平台(包括:i386、ppc、mips、nios、m68k等);第二个arm920t表示arm内核版本(包括:arm7tdmi、arm10、arm11等);第三个mini2440对应开发板所在文件夹board/samsung/mini2440;第四个samsung对应开发板所在文件夹上层目录board/samsung,如果mini2440目录就直接放在board目录下,那么此处应写NULL;第五个s3c24×0对应MCU型号。

完成了上面三步,可以执行以下命令进行编译:

复制代码
  1. #make mini2440_config
  2. #make


如果成功编译出u-boot.bin,那么恭喜你,迈出了成功的第一步。

总结一下,移植U-Boot基本步骤有三:1、在board目录下创建开发板对应目录;2、在include/configs下创建开发板对应配置文件;3、在U-Boot根目录下的Makefile中加入开发板对应编译命令。


原创文章,转载自 芷菁博客 [ http://www.stars625.com/ ]
本文链接地址:http://www.stars625.com/portinguboottomini2440step1.html
友善之臂淘宝直销店:http://shop34928758.taobao.com

手机:13560352861(杨工),QQ:10108270
会当凌绝顶,一览众山小!
级别: 总版主
UID: 2
精华: 18
发帖: 1656
金钱: 13915 两
威望: 5380 点
综合积分: 3672 分
注册时间: 2008-01-01
最后登录: 2026-07-25
1楼  发表于: 2009-11-26 10:12

 移植u-boot-2009.03到友善之臂mini2440开发板step2

在《移植u-boot-2009.03到友善之臂mini2440开发板step1》一文中已经介绍了,移植U-Boot的基本步骤,并且编译出了一个Bin文件,当然这个文件烧写到板子上是无任何反应的。眼见为实,在step2中将通过编写一个LED驱动来指示U-Boot的运行情况,以及宏定义的更改。

请同时关注以下两文章:
移植u-boot-2009.03到友善之臂mini2440开发板step1
http://www.stars625.com/portinguboottomini2440step1.html
移植u-boot-2009.03到友善之臂mini2440开发板step3
http://www.stars625.com/portinguboottomini2440step3.html

阅读本文你需要有以下基础知识:C语言宏定义的基本规则、运用;S3C24X0系列MCU的I/O配置、操作方法。说明一下《移植u-boot-2009.03到友善之臂mini2440开发板stepX》系列文章只是提供一个移植U-Boot的基本思路和方法,要求记者有一定的C语言基础和嵌入式开发经验。

编辑include/configs/mini2440.h,把CONFIG_S3C2410改成CONFIG_S3C2440;把CONFIG_SMDK2410改成CONFIG_MINI2440。U-Boot里有些驱动根据处理的型号的不同,配置的方法、参数各不相同,那么就是通过这个CONFIG_XXXXX来定义区分的。由于S3C2410和S3C2440的寄存器地址和参数设置基本是相同的,所以只需在定义CONFIG_S3C2410的地方加上CONFIG_S3C2440即可,CONFIG_MINI2440同理;如果处理器差异较大,那么在具体地置你就要根据该处的功能需要编写相应的驱动代码。

方法如下:在U-Boot根目录下用grep命令搜索所有包含CONFIG_S3C2410的文件,一般为#if defined (CONFIG_S3C2410)改成#if defined (CONFIG_S3C2410) || defined (CONFIG_S3C2440)。可以看到很多地方S3C2410和S3C2440都是引用同一头文件s3c2410.h的,详细修改位置大家可以查看我的Patch文件。

Patch文件是我将修改后的代码与原始文件进行diff比较生成的补丁文件,增加了什么内容,删除了什么内容大家可以根据前导符“+”或“-”区别。Patch可以用文本编辑器打开,里面的内容耐心看一看,基本上都能看懂的;当然也可以直接用patch命令打补丁到U-Boot源码里。

经过以上宏定义的修改,编译基本上是可以通过,如果有什么Error或Warning可以根据提示进行修改,最终是可以编译生成Bin文件的,此时的Bin文件下载到开发板还是没有任何反应的,下面我们就将LED代码加进去。

编辑cpu/arm920t/start.S,这个是U-Boot文件中第一个运行的程序,汇编格式,如何知道程序是从该文件开始运行的,还有从该文件哪一段代码开始运行的呢。一般在嵌入式系统软件开发中,在所有源码文件编译完成之后,链接器要读取一个链接分配文件,在该文件中定义了程序的入口点,代码段、数据段等如何分配等,这个文件就存在于board/samsung/mini2440/u-boot.lds,打开文件看到以下代码:

复制代码
  1. OUTPUT_ARCH(arm)
  2. ENTRY(_start)
  3. SECTIONS
  4. {
  5.     . = 0x00000000;
  6.     . = ALIGN(4);
  7.     .............
  8. }


第1行定义了生成文件的目标平台,第2行定义了程序的内口点_start,下面就是定义了段分配。

回到start.S文件,找到_start如下:

复制代码
  1. .globl _start
  2. _start: b        start_code


一个简单跳转,继续找到start_code,那么此处就是启动代码的正式开始处了,加入以下LED驱动代码:

复制代码
  1. #define GPBCON        0x56000010
  2. #define GPBDAT        0x56000014
  3. #define GPBUP        0x56000018
  4. ldr        r0, =GPBUP
  5. ldr        r1, =0x7FF
  6. str        r1, [r0]
  7. ldr        r0, =GPBCON
  8. ldr        r1, =0x154FF
  9. str        r1, [r0]
  10. ldr        r0, =GPBDAT
  11. ldr        r1, =0x1C0
  12. str        r1, [r0]


在以上向行代码分别定义了操作PB口的寄存器地址,关闭PB口上拉,设置PB5、6、7、8口为输出口(对应mini2440开发板上的4个LED),设PB5为低电平,PB6、7、8设为高电平,对应LED1高,其余不亮。关于此处寄存的设置请参考S3C2440用户手册第九章IO Ports,汇编代码可以参考上下文的写法依葫芦画瓢。

一般的Bootloader都有以下两个功能:上电首先初始化RAM;然后将自身复制到RAM中运行,提高运行速度。以上两点我们可以从start.S文件中start_code往下的两个宏看到:

复制代码
  1. #ifndef CONFIG_SKIP_LOWLEVEL_INIT
  2. #ifndef CONFIG_SKIP_RELOCATE_UBOOT


在前一篇文章中提到,我们直接通过现在Bootloader将U-Boot.bin文件下载到内存中运行,RAM初始化的动作已经由Supervivi做了,这里我们不需要再次进行初始化,而且如果进行初始化也会导致试验失败,因此一定要将LOWLEVEL_INIT功能关掉,你可以在这里把bl cpu_init_crit注释掉,也可以在include/configs/mini2440.h中增加一个宏定义:

复制代码
  1. #define CONFIG_SKIP_LOWLEVEL_INIT        1


我是采用的后一种方法。

如果你想在其它的C语言源文件中控制LED可以加入以下代码:

复制代码
  1. #include <s3c2410.h>
  2. S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
  3. gpio->GPBCON = 0x00295551;
  4. gpio->GPBUP  = 0x000007FF;
  5. gpio->GPBDAT = 0x00000180;


将第1行加在文件头部,将下面几行加在你想控制LED亮灭的地方,这段代码会使LED1、LED2变亮。

至此,将编译出的u-boot.bin文件下载到内存0×0处运行可以看到开发板上LED根据我们的要求亮了起来。

下一篇我们将讨论,将U-Boot的调试信息从串口输出,关注《移植u-boot-2009.03到友善之臂mini2440开发板step3》。
友善之臂淘宝直销店:http://shop34928758.taobao.com

手机:13560352861(杨工),QQ:10108270
会当凌绝顶,一览众山小!
级别: 总版主
UID: 2
精华: 18
发帖: 1656
金钱: 13915 两
威望: 5380 点
综合积分: 3672 分
注册时间: 2008-01-01
最后登录: 2026-07-25
2楼  发表于: 2009-11-26 10:13

 移植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/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,找到初始化系统中继的位置(注意,此时禁用中断相关代码也要做一定修改,参考数据手册),在其下方加入以下代码:

复制代码
  1. #define MPLLCON        0x4C000004
  2. #define UPLLCON        0x4C000008
  3. ldr r0, =UPLLCON
  4. ldr r1, =0x38022
  5. str r1, [r0]
  6. ldr r0, =MPLLCON
  7. ldr r1, =0x7F021
  8. str r1, [r0]
  9. ldr r0, =CLKDIVN
  10. mov r1, #5
  11. str r1, [r0]


第一段代码定义了相关寄存器,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,代码修改如下:

复制代码
  1. ulong get_FCLK(void)
  2. {
  3.     ......
  4.     p = ((r & 0x003F0) >> 4) + 2;
  5.     s = r & 0x3;
  6.     if(pllreg == MPLL)
  7.         return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));
  8.     else
  9.         return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
  10. }
  11. ulong get_HCLK(void)
  12. {
  13.     return (get_FCLK()/4);
  14. }


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

好了,U-Boot的移植就到此为止了,暂时也不想去做Nand Flash或网卡驱动的移植,那东西还是比较复杂的,下一步打算就是移植Linux,同样是通过Supervivi下载到内存中运行、调试。
友善之臂淘宝直销店:http://shop34928758.taobao.com

手机:13560352861(杨工),QQ:10108270
级别: 新手上路
UID: 4380
精华: 0
发帖: 10
金钱: 60 两
威望: 18 点
综合积分: 20 分
注册时间: 2009-03-12
最后登录: 2012-05-17
3楼  发表于: 2009-11-26 20:47
讲的还算清楚,就是功能有点太简单了~~
级别: 新手上路
UID: 22330
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2010-05-30
最后登录: 2012-09-25
4楼  发表于: 2010-06-21 16:56
你好在按你说的做完了第二步,但是make却出现了一个问题,不知道是怎么回事,麻烦指导一下,谢谢..
错误提示是:
arm-linux-ld: cannot find board/micro2440/lowlevel_init.o
make: *** [u-boot] Error 1
级别: 侠客
UID: 7944
精华: 0
发帖: 76
金钱: 400 两
威望: 99 点
综合积分: 152 分
注册时间: 2009-08-03
最后登录: 2018-02-08
5楼  发表于: 2010-06-30 17:21
为什么我的使用make 会出现
mini2440.c: in function 'board_init':
mini2440.c 89 err: 's3240x0_gpio 'has no member named 'bpacon"
级别: 侠客
UID: 7944
精华: 0
发帖: 76
金钱: 400 两
威望: 99 点
综合积分: 152 分
注册时间: 2009-08-03
最后登录: 2018-02-08
6楼  发表于: 2010-06-30 19:04
图片:
怎么会有这个问题呢我是按你的这个方法做的。