U-boot2010.06移植--阶段一

2011-02-24 23:14:57

我今天的移植将分如下3步。加上写记录文档,预计时间3小时。
一,不改变源码,完成编译。
二,修改源码,搭建一个U-boot的框架,完成编译。
三,修改源码,完成编译,下载到板上nandflash,驱动LED。

环境说明:主机win7,虚拟机WMware6.0.2( unt.10)+ unt.10默认配置的arm-linux-gcc.

烧录是在主机上完成,编译是在虚拟机完成。

实现第一步:(目标:对smdk2410的相关源码进行了验证可以通过编译,并且熟悉了编译过程。结果:成功。)
我的压缩包放在/linux/boot中,解压源码
#tar -jxvf u-boot-2010.06.tar.bz2
make smdk2410_config

接着就出现了问题一[已解决]

make: *** 没有规则可以创建目标“smdk2410_config”。 停止。

解决问题一:
自己感觉是没用arm-linux-gcc的问题,打开U-boot的README文件。
If you are not using a native environment, it is assumed that you
have GNU cross compiling tools available in your path. In this case,
you must set the environment variable CROSS_COMPILE in your shell.
Note that no changes to the Makefile or any other source files are
necessary. For example using the ELDK on a 4xx CPU, please enter:

 $ CROSS_COMPILE=ppc_4xx-
 $ export CROSS_COMPILE

我需要先配置环境变量。

于是:
export CROSS_COMPILE=arm-linux-
make smdk2410_config
后还是出现如下问题?
make: *** 没有规则可以创建目标“smdk2410_config”。 停止。
又想了一下,突然想到我解压完后,应该要进入解压目录的。
于是:
cd u-boot-2010.06
make smdk2410_config
成功。然后再

make
就在u-boot-2010.06文件夹下生成了U-boot.bin文件。

实现第二步:(目标:完成U-boot框架搭建。结果:成功)
根据README文件的指导
1.  Add a new configuration option for your board to the toplevel
    "Makefile" and to the "MAKEALL" script, using the existing
    entries as examples. Note that here and at many other places
    boards and other names are listed in alphabetical sort order. Please
    keep this order.
2.  Create a new directory to hold your board specific code. Add any
    files you need. In your board directory, you will need at least
    the "Makefile", a "<board>.c", "flash.c" and "u-boot.lds".
3.  Create a new configuration file "incl?/configs/<board>.h" for
    your board等等

我就不在虚拟机里完成了。我直接在主机改为后,去虚拟的 untu下编译。
1,在MAKEALL文件中的LIST_ARM9=,按字母排序添加apple2440 \并保存。

2,在Makefile文件中,找到
ap946es_config: unconfig
 @board/armltd/integrator/split_by_variant.sh ap $@
添加如下代码并保存:
apple2440_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t apple2440 samsung s3c24x0

3,在\u-boot-2010.06\board\samsung文件夹下,创建一个新的文件夹名为 apple2440,并把smdk2410下的文件都copy到apple2440文件夹下,把smdk2410.c更名为apple2440.c。但是没找到u-boot.lds文件。奇怪了,readme中说要有的,为什么smdk2410中没有呢?后来想起来昨天分析源码的时候,u-boot.lds应该在\arm\cpu\arm920t里有。

4,编辑apple2440下的Makefile文件(参考网络上移植成功的教程,否则我不知该哪里,呵呵)
COBJS := smdk2410.o flash.o改为
COBJS := apple2440.o flash.o

5,在u-boot-2010.06\incl?\configs文件夹下复制一个smdk2410.h,更名为apple2440.h。

好了,激动人心的时候就要到了。
make apple2440_config

 

make

 

就和README文件说的,会产生3个文件。

Finally, type "make all", and you should get some working U-Boot
images ready for download to / installation on your system:

- "u-boot.bin" is a raw binary image
- "u-boot" is an image in ELF binary format
- "u-boot.srec" is in Motorola S-Record format
不过这3个文件目前烧录到板子中也不能起作用。只是搭了一个框架,之后就是往里面增加内容或修改内容。

实现第三步(目标:修改源码,完成编译,下载到板上实现LED点亮。结果:成功。)

    应该先修改什么呢?(按照先前裸奔代码的经验,应该确定先修改启动文件。但是保险起见,要在U-boot中寻找依据。)

    先解释一下lds文件的作用:一般在嵌入式系统软件开发中,在所有源码文件编译完成之后,链接器要读取一个链接分配文件,在该文件中定义了程序的入口点,代码段、数据段等分配情况等。
是不是有答案了。打开arch\arm\cpu\arm920t下的u-boot.lds重点看如下:

ENTRY(_start)         //说明程序的入口点是从_start函数。
    .text :
    {
        cpu/arm920t/start.o    (.text)    //程序执行的第一个文件
        *(.text)
    }
    现在可以确定先修改的文件是arch\arm\cpu\arm920t下的start.S。打开此文件,自己看代码准备修改。
先看此段。
start_code:
 /*
  * set the cpu to SVC32 mode
  */
 mrs r0, cpsr         //读状态寄存器到r0
 bic r0, r0, #0x1f    //r0的低5位清0
 orr r0, r0, #0xd3    //或上110 10011,即禁止IRQ和FRQ,并且设置为超级用户模式。
 msr cpsr, r0         //r0写入状态寄存器
问题:干嘛要用SVC模式?
查了下。原理超级用户模式(SVC 模式),主要用于 SWI(软件中断)和 OS(操作系统)。这个模式有额外的特权,允许你进一步控制计算机。例如,你必须进入超级用户模式来读取一个插件(podule)。这不能在用户模式下完成。
我之前裸奔没操作系统所有不需要用SVC模式,但是U-boot需要加载OS,所以选SVC。

接着看到
 bl coloured_LED_init
 bl red_LED_on
找了led初始化和led on的函数觉得有点复杂。没找清楚。这个今后掌握了单步调试后研究一下。
于是把这两行注释掉。
在其下面加入
#if defined(CONFIG_S3C2440)
#define GPBCON 0x56000010
#define GPBDAT 0x56000014
#define GPBUP  0x56000018    

    ldr r0, =GPBUP
    ldr r1, =0x7FF    /*关闭上拉*/
    str r1, [r0]

    ldr r0, =GPBCON   /*配置PB5、6、7、8为输出口,对应PBCON寄存器的第10-17位*/
    ldr r1, =0x015400 
    str r1, [r0]

    ldr r0, =GPBDAT
    ldr r1, =0x79F    /*对应二进制11110011111,PB5,6设为低电平,点亮LED*/
    str r1, [r0]

#endif

接着在config/apple2440.h中加入一条宏定义。
#define CONFIG_S3C2440 1 /* on a SAMSUNG apple2440 Board  */

make apple2440_config
make
下载到nandflash中,看看结果.
PB5和PB6点亮,PB7和PB8不点亮。
0x79F改成0x6BF看看灯的变化吧!是不是变成了PB8和PB6,PB7和PB5不亮啊!验证正确。

明天要配置clk等然后实现串口通信显示。另外,我需要补充一下makefile的知识以及学习linux下调试源码。

猜你喜欢

转载自www.cnblogs.com/AppleCai/p/10777937.html