移植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 2 3 4 5 6 7 8 9 | OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { . = 0x00000000; . = ALIGN(4); ............. } |
第1行定义了生成文件的目标平台,第2行定义了程序的内口点_start,下面就是定义了段分配。
回到start.S文件,找到_start如下:
1 2 | .globl _start _start: b start_code |
一个简单跳转,继续找到start_code,那么此处就是启动代码的正式开始处了,加入以下LED驱动代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #define GPBCON 0x56000010 #define GPBDAT 0x56000014 #define GPBUP 0x56000018 ldr r0, =GPBUP ldr r1, =0x7FF str r1, [r0] ldr r0, =GPBCON ldr r1, =0x154FF str r1, [r0] ldr r0, =GPBDAT ldr r1, =0x1C0 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 2 | #ifndef CONFIG_SKIP_LOWLEVEL_INIT #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 2 3 4 5 6 7 | #include <s3c2410.h> S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO(); gpio->GPBCON = 0x00295551; gpio->GPBUP = 0x000007FF; gpio->GPBDAT = 0x00000180; |
将第1行加在文件头部,将下面几行加在你想控制LED亮灭的地方,这段代码会使LED1、LED2变亮。
至此,将编译出的u-boot.bin文件下载到内存0×0处运行可以看到开发板上LED根据我们的要求亮了起来。
下一篇我们将讨论,将U-Boot的调试信息从串口输出,关注《移植u-boot-2009.03到友善之臂mini2440开发板step3》。
应该是patch,我没找着
在第三篇最后:http://www.stars625.com/portinguboottomini2440step3.html
你好,你的PATH在哪能看见啊
你好,我按你的步骤把step3都做完了,但是串口终端还是打印不出东西,什么反应都没有,不知道是怎么回事?
博主你好,我将你做的补丁打好后,在内存中可以运行,但是我将#define CONFIG_SKIP_LOWLEVEL_INIT去掉后,烧入Nor Flash中不能运行,请问这是怎么回事呢?我用的也是mini2440, Nor Flash 是 39vf1601,谢谢!
可能是Flash型号不一样吧,具体可以先通过LED来确认U-Boot Relocate之前的部份运行是否正常,因为那一部份是直接在Flash中运行。就像第一篇中说的,不要纠结于具体的某个问题,因为环境各不相同,所以遇到的问题也会不一样,关键要找到一种解决问题的方法思路。
感谢你的回复,我自己再认真的看一下吧。
博主你好,我按照你的方法,做到step2的时候编译错误,错误显示s3c24x0_rtc.c文件中的S3C24X0_RTC未定义,这个文件前面包含了s3c2410.h头文件,但是没有语句包含s3c24x0.h这个文件,我查看到S3C24X0_RTC在s3c24x0.h中定义,就包含这个头文件,但编译还是出错,不知道什么原因呢,这2个头文件什么关系呢?
实际上是定义在s3c2410.h这个头文件里的,2440与2410大部份寄存器是一样的,在s3c24×0_rtc.c头部引用s3c2410.h
把35行改成:#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
你好,按照你说的修改,那里已经编译通过了,但是进入mini2440.c这个文件后出现错误,如下:
make[1]: 正在进入目录 `/home/k/workspace/source/u-boot-2009.08/board/samsung/mini2440′
arm-linux-gcc -g -Os -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DTEXT_BASE=0x33F80000 -I/home/k/workspace/source/u-boot-2009.08/include -fno-builtin -ffreestanding -nostdinc -isystem /home/k/workspace/opt/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/include -pipe -DCONFIG_ARM -D__ARM__ -marm -mabi=aapcs-linux -mno-thumb-interwork -march=armv4 -Wall -Wstrict-prototypes -fno-stack-protector -o mini2440.o mini2440.c -c
mini2440.c: In function ‘board_init’:
mini2440.c:89: error: ‘S3C24X0_GPIO’ has no member named ‘GPACON’
mini2440.c:90: error: ‘S3C24X0_GPIO’ has no member named ‘GPBCON’
mini2440.c:91: error: ‘S3C24X0_GPIO’ has no member named ‘GPBUP’
mini2440.c:92: error: ‘S3C24X0_GPIO’ has no member named ‘GPCCON’
mini2440.c:93: error: ‘S3C24X0_GPIO’ has no member named ‘GPCUP’
mini2440.c:94: error: ‘S3C24X0_GPIO’ has no member named ‘GPDCON’
mini2440.c:95: error: ‘S3C24X0_GPIO’ has no member named ‘GPDUP’
mini2440.c:96: error: ‘S3C24X0_GPIO’ has no member named ‘GPECON’
mini2440.c:97: error: ‘S3C24X0_GPIO’ has no member named ‘GPEUP’
mini2440.c:98: error: ‘S3C24X0_GPIO’ has no member named ‘GPFCON’
mini2440.c:99: error: ‘S3C24X0_GPIO’ has no member named ‘GPFUP’
mini2440.c:100: error: ‘S3C24X0_GPIO’ has no member named ‘GPGCON’
mini2440.c:101: error: ‘S3C24X0_GPIO’ has no member named ‘GPGUP’
mini2440.c:102: error: ‘S3C24X0_GPIO’ has no member named ‘GPHCON’
mini2440.c:103: error: ‘S3C24X0_GPIO’ has no member named ‘GPHUP’
make[1]: *** [mini2440.o] 错误 1
make[1]:正在离开目录 `/home/k/workspace/source/u-boot-2009.08/board/samsung/mini2440′
make: *** [board/samsung/mini2440/libmini2440.a] 错误 2
include/s3c24x0.h 部份宏定义也要作更改,这些都是基本的问题,在文中也提到解决办法了,靠得是自己的仔细,对于这种编译错误还是比较容易解决的,另外最好不要用中文环境。
你好,
make[1]: Entering directory `/home/cvtech/u-boot-2009.03/drivers/rtc’
make[1]: *** No rule to make target `.depend’, needed by `librtc.a’. Stop.
make[1]: Leaving directory `/home/cvtech/u-boot-2009.03/drivers/rtc’
make: *** [drivers/rtc/librtc.a] Error 2
[root@root u-boot-2009.03]#
在drivers/rtc/编译总是出错不知道是什么原因?
烦请指教下。。。。
其他的情况和上楼的一样,只是在drivers/rtc/下的s3c24x0_rtc.c 和librtc.a不知道怎么修改。。
这个问题应该还是头文件的问题,如果你不想去仔细找具体哪个宏定义的话,在头文件配置文件中,还是把CONFIG_S3C2410的定义加上吧。
把U-Boot目录 make clean 或 make distclean 下重新再编译。
你好,我按照你的patch 打了后,制作的u-boot.bin 烧入friendlyarm
mini2440 从nand 启动,看不到任何信息,并且led无任何反应。
你好,这个Patch是针对NorFlash启动用的,只包含基本的功能,因为没有添加对NandFlash的支持,所以从Nand启动有可能不成功。
U-Boot移植系列文章中也说明了,只是介绍一种方法,具体实践由于环境或知识水平各不相同,还需另外作一些修改。