一:准备移植

1、从下面的官网下载最新的U-boot。用google英文版搜索最新的u-boot源码

 ftp://ftp.denx.de/pub/u-boot/

2、建立sourceinsight工程

 a、解压并在E:\colin weidongshan\transplant_u-boot-2012.04.01\u-boot-2012.04.01建立SI

 b、添加文件到SI工程

  1、点击"Add All",选中“Include top level sub-directories”和“Recursively add lower sub-directories”点击“OK”

  2、选中“Board”目录,点击“Remove Tree”,去掉总个目录

   进入“Board\Samsung\Smdk2410\”,点击"Add All"

  3、选中“Arch”目录,点击“Remove Tree”,去掉总个目录

   进入“Arch\Arm\Cpu\Arm920t\”,双击选中“Cpu.c”“Interrupts.c”“start.S”。

   进入“Arch\Arm\Cpu\Arm920t\S3c24x0\”,点击"Add All"

   进入“Arch\Arm\”,选中"Dts"目录,点击"Add Tree"

   进入“Arch\Arm\Include\Asm\Arch_s3c24x0”,点击"Add All"

   进入“Arch\Arm\Include\Asm\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件

   进入“Arch\Arm\Include\Asm\”,单击选中"Proc-armv",点击"Add Tree"

   进入“Arch\Arm\Lib\”,点击"Add All"

  4、选中“Include”目录,点击“Remove Tree”,去掉总个目录

   进入“Include\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件

   进入“Include\”,单击选中"Andestech",点击"Add Tree"

   进入“Include\”,单击选中"Asm-generic",点击"Add Tree"

   进入“Include\”,同上选中除"Configs"目录外的所有目录,点击"Add Tree"。"Configs"目录先不加,下面再议

   进入“Include\Configs\”,双击选中“Smdk2410.h”

  5、同步文件,完成

3、编译

尝试编译

   解压: book@book-desktop:/work/system$ tar xjf u-boot-2012.04.01.tar.bz2

     book@book-desktop:/work/system$ cd u-boot-2012.04.01/ 

   配置: book@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2410_config

   编译: book@book-desktop:/work/system/u-boot-2012.04.01$ make

   

编译不成功,因为版本太老

   查看版本: book@book-desktop:/work/system/u-boot-2012.04.01$ arm-linux-gcc -v

   拷贝解压: book@book-desktop:/work/system/u-boot-2012.04.01$ cd /work/tools/

  book@book-desktop:/work/tools$ mkdir tmp

  book@book-desktop:/work/tools$ tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C tmp/

  book@book-desktop:/work/tools$ cd tmp/

  book@book-desktop:/work/tools/tmp$ ls

  usr

  book@book-desktop:/work/tools/tmp$ cd usr/local/arm/4.3.2/

  book@book-desktop:/work/tools/tmp/usr/local/arm/4.3.2$ ls

  arm-none-linux-gnueabi  bin  lib  libexec  share

  book@book-desktop:/work/tools/tmp/usr/local/arm/4.3.2$ ls bin/

  

  解压到根目录:book@book-desktop:/work/tools$ sudo tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C /

  查看环境变量: book@book-desktop:/work/tools$ echo $PATH

  /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/other_board/gcc-3.4.5-glibc-2.3.6/bin

  设置环境变量:book@book-desktop:/work/tools$ export PATH=/usr/local/arm/4.3.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

  查看环境变量:book@book-desktop:/work/tools$ arm-linux-gcc  -v

 如果不想手动设置,你可以按如下方式修改:

   book@book-desktop:/work/tools$ sudo vi /etc/environment

   

  重新编译: book@book-desktop:/work/tools$ cd /work/system/u-boot-2012.04.01/

  book@book-desktop:/work/system/u-boot-2012.04.01$ make distclean

  book@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2410_config 

  Configuring for smdk2410 board...

  book@book-desktop:/work/system/u-boot-2012.04.01$ make

4、下载刚编译成功的u-boot.bin,发现重新启动,串口没有任何信息

二、分析u-boot: 通过链接命令分析组成文件、阅读代码分析启动过程

重新编译,只关心最后一条链接命令:

 book@book-desktop:/work/system/u-boot-2012.04.01$ rm u-boot

 book@book-desktop:/work/system/u-boot-2012.04.01$ make

里面有这句arm-linux-ld  -pie -T u-boot.lds -Bstatic -Ttext 0x0 $UNDEF_SYM arch/arm/cpu/arm920t/start.o

 book@book-desktop:/work/system/u-boot-2012.04.01$ vi u-boot.lds

通过链接脚本知道: . = 0x00000000;同时-Ttext 0x0,由此我们知道是从NOR flash开始运行,通过链接脚本还知道第一个运行的是arch/arm/cpu/arm920t/start.s

自己写bootload的总结的过程:

a. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH

b. 如果bootloader比较大,要把它重定位到SDRAM

c. 把内核从NAND FLASH读到SDRAM

d. 设置"要传给内核的参数"

e. 跳转执行内核

反汇编: book@book-desktop:/work/system/u-boot-2012.04.01$ arm-linux-objdump -D u-boot > u-boot.dis

 

新uboot的过程:  

2.1 set the cpu to SVC32 mode

2.2 turn off the watchdog

2.3 mask all IRQs by setting all bits in the INTMR

2.4 设置时钟比例

2.5 设置内存控制器

2.6 设置栈,调用C函数board_init_f

2.7 调用函数数组init_sequence里的各个函数

2.7.1 board_early_init_f : 设置系统时钟、设置GPIO

......

2.8 重定位代码:

2.8.1 从NOR FLASH把代码复制到SDRAM

2.8.2 程序的链接地址是0,访问全局变量、静态变量、调用函数时是使"基于0地址编译得到的地址"

      现在把程序复制到了SDRAM

      需要修改代码,把"基于0地址编译得到的地址"改为新地址

通过arm-linux-ld -pie可以找到SDRAM里链接地址的旧地址

存在链接脚本里的.rel和.dynsym

2.8.3 程序里有些地址在链接时不能确定,要到运行前才能确定:fixabs

2.9 clear_bss

2.10 调用C函数board_init_r:第2阶段的代码

   

  

book@book-desktop:/work/system/u-boot-2012.04.01$ arm-linux-ld --help | grep pie

  -pie, --pic-executable      Create a position independent executable

可以修改配置定义CONFIG_S3C2440

3. 修改U-BOOT代码

3.1 建一个单板(修改3个文件)

book@book-desktop:/work/system/u-boot-2012.04.01$ make distclean

book@book-desktop:/work/system/u-boot-2012.04.01$ cd board/samsung/

book@book-desktop:/work/system/u-boot-2012.04.01/board/samsung$ cp smdk2410 smdk2440 -rf

book@book-desktop:/work/system/u-boot-2012.04.01/board/samsung$ cd ../..

book@book-desktop:/work/system/u-boot-2012.04.01$ cd include/configs/

book@book-desktop:/work/system/u-boot-2012.04.01/include/configs$ cp smdk2410.h smdk2440.h

看看是否能编译通过:

book@book-desktop:/work/system/u-boot-2012.04.01/include/configs$ cd ../..

book@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2440_config

make: *** No rule to make target `smdk2440_config'.  Stop.

make: *** [smdk2440_config] Error 1

编译通不过.怀疑是makefile的问题,搜索一下:

book@book-desktop:/work/system/u-boot-2012.04.01$ grep "smdk2410" * -nR

arch/arm/include/asm/mach-types.h:1644:# define machine_is_smdk2410()   (machine_arch_type == MACH_TYPE_SMDK2410)

arch/arm/include/asm/mach-types.h:1646:# define machine_is_smdk2410()   (0)

board/samsung/smdk2410/Makefile:28:COBJS        := smdk2410.o

board/samsung/smdk2440/Makefile:28:COBJS        := smdk2410.o

boards.cfg:65:smdk2410                     arm         arm920t     -                   samsung        s3c24x0

MAINTAINERS:750:        smdk2410        ARM920T

book@book-desktop:/work/system/u-boot-2012.04.01$ vi boards.cfg

在boards.cfg文件下复制65行,修改boards.cfg:

仿照

smdk2410                     arm         arm920t     -                   samsung        s3c24x0

添加:

smdk2440                     arm         arm920t     -                   samsung        s3c24x0

然后重新配置一下

book@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2440_config

然后重新编译一下

book@book-desktop:/work/system/u-boot-2012.04.01$ make

3.2 烧写看结果无法执行,下面按照第2节里面的分析启动过程

3.3 调试: 

a. 阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置

   ①处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置,如下面注释掉下面两行

   //writel(0xFFFFFF, &clk_power->locktime);

/* configure MPLL */

 //writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,

 //       &clk_power->mpllcon);

   

   编译出来的uboot非常大,可以先烧写主光盘里的u-boot.bin到nor,然后用这个uboot来烧写新的uboot

 先查看一下是不是刚下的烧写结果是不是有问题

   等待usb下载完:   OpenJTAG> usb 1 30000000   //1表示一直等待

   把flash的写保护去掉:  OpenJTAG> protect off all  //解除norflash写保护

   把flash擦除:开始和结束地址 OpenJTAG> erase 0 7FFFF    //擦除从0到0x7FFFF共0x80000个字节

   下载进flash:  OpenJTAG> cp.b 30000000 0 80000  //从内存0x30000000开始烧写程序到norflash的0地址去,烧写0X80000个字节

   反汇编:  book@book-desktop:/work/system/u-boot-2012.04.01$ arm-linux-objdump -D u-boot > u-boot.dis

 上面反汇编的目的是:查看call_board_init_f所在的汇编地址,开始执行这个函数的时候,说明cpu_init_crit已经执行完了,SDRAM已经初始化完了,我们现在就是想验证一下SDRAM是否初始化成功

 

    ②修改start.S里的代码

    # endif

/* 2. 设置时钟 */

 ldr r0, =0x4c000014

 // mov r1, #0x03;     // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1

 mov r1, #0x05;     // FCLK:HCLK:PCLK=1:4:8

 str r1, [r0]

/* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */

 mrc p15, 0, r1, c1, c0, 0  /* 读出控制寄存器 */ 

 orr r1, r1, #0xc0000000   /* 设置为“asynchronous bus mode” */

 mcr p15, 0, r1, c1, c0, 0  /* 写入控制寄存器 */

#define S3C2440_MPLL_400MHZ     ((0x5c<<12)|(0x01<<4)|(0x01))

/* MPLLCON = S3C2440_MPLL_200MHZ */

 ldr r0, =0x4c000004

 ldr r1, =S3C2440_MPLL_400MHZ

 str r1, [r0]

/* 启动ICACHE */

 mrc p15, 0, r0, c1, c0, 0 @ read control reg

 orr r0, r0, #(1<<12)

 mcr p15, 0, r0, c1, c0, 0   @ write it back

#endif /* CONFIG_S3C24X0 */

③把lowlevel_init.S里面的lowlevel_init函数里面

     SMRDATA:

    .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))

    .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))

    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))

    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))

    .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))

    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))

    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))

    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))

    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))

    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)

    .word 0x32

    .word 0x30

    .word 0x30

 替换为:

 SMRDATA:

     .long 0x22011110  //BWSCON

 .long 0x00000700  //BANKCON0

 .long 0x00000700  //BANKCON1

 .long 0x00000700  //BANKCON2

 .long 0x00000700  //BANKCON3  

 .long 0x00000700  //BANKCON4

 .long 0x00000700  //BANKCON5

 .long 0x00018005  //BANKCON6

 .long 0x00018005  //BANKCON7

 .long 0x008C04F4  // REFRESH

 .long 0x000000B1  //BANKSIZE

 .long 0x00000030  //MRSRB6

 .long 0x00000030  //MRSRB7

完成上面3步之后,编译生成新的uboot.bin,我们先用openjtag烧写原来的uboot,然后通过原来的uboot来下载新生成的uboot.bin

   等待usb下载完:   OpenJTAG> usb 1 30000000   //1表示一直等待

   把flash的写保护去掉:  OpenJTAG> protect off all  //解除norflash写保护

   把flash擦除:开始和结束地址 OpenJTAG> erase 0 7FFFF    //擦除从0到0x7FFFF共0x80000个字节

   下载进flash:  OpenJTAG> cp.b 30000000 0 80000  //从内存0x30000000开始烧写程序到norflash的0地址去,烧写0X80000个字节

   

   到这里可以用openjtag去验证一下内存设置有没有成功

 

3.4 乱码,查看串口波特率的设置,发现在get_HCLK里没有定义CONFIG_S3C2440

①更改get_HCLK里没有定义CONFIG_S3C2440

board_init_f

   init_sequence

      serial_init

         serial_init_dev

            _serial_setbrg

               get_PCLK

                  get_HCLK

    处理措施:include/configs/smdk2440.h: 去掉CONFIG_S3C2410

                                          #define CONFIG_S3C2440

②做完第一步后我们编译一下,发现错误,由于第一步的更改导致了第二步出现问题:

s3c2410_nand.c:72: error: dereferencing pointer to incomplete type

查看代码后解决:

book@book-desktop:/work/system/u-boot-2012.04.01$ vi drivers/mtd/nand/Makefile 

那我们就去掉这个宏:在smdk2440.h

#ifdef CONFIG_CMD_NAND

#define CONFIG_NAND_S3C2410

解决办法:暂时去掉如下行

                                          //#define CONFIG_CMD_NAND

③验证:先烧写1.1.6的uboot,然后重启开发板,烧写开发板

   等待usb下载完:   OpenJTAG> usb 1 30000000   //1表示一直等待

   把flash的写保护去掉:  OpenJTAG> protect off all  //解除norflash写保护

   把flash擦除:开始和结束地址 OpenJTAG> erase 0 7FFFF    //擦除从0到0x7FFFF共0x80000个字节

   下载进flash:  OpenJTAG> cp.b 30000000 0 80000  //从内存0x30000000开始烧写程序到norflash的0地址去,烧写0X80000个字节

下面是uboot输出:

U-Boot 2012.04.01 (Jul 29 2013 - 20:26:01)

CPUID: 32440001

FCLK:      400 MHz

HCLK:      100 MHz

PCLK:       50 MHz

DRAM:  64 MiB

WARNING: Caches not enabled

Flash: *** failed ***

### ERROR ### Please RESET the board ###

3.5 修改UBOOT支持NAND启动

    原来的代码在链接时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)"

    使得程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K)

3.5.1 去掉 "-pie"选项

book@book-desktop:/work/system/u-boot-2012.04.01$ grep "\-pie" * -nR

      arch/arm/config.mk:75:LDFLAGS_u-boot += -pie 去掉这行

      

3.5.2 参考"毕业班第1课"的start.S, init.c来修改代码

      把init.c放入board/samsung/smdk2440目录,修改init.c文件主要是加上static , 修改Makefile

      修改CONFIG_SYS_TEXT_BASE为0x33f80000

      修改start.S

3.5.3 修改board_init_f, 把relocate_code去掉

3.5.4 修改链接脚本: 把start.S, init.c, lowlevel.S等文件放在最前面

book@book-desktop:/work/system/u-boot-2012.04.01$ find -name "u-boot.lds"

      ./arch/arm/cpu/u-boot.lds:

      

      board/samsung/smdk2440/libsmdk2440.o

生成反汇编文件检查      

book@book-desktop:/work/system/u-boot-2012.04.01$ arm-linux-objdump -D u-boot > u-boot.dis

烧写:

OpenJTAG> usb 1 30000000

OpenJTAG> nand erase 0 80000

OpenJTAG> nand write 30000000 0 80000

把开关拨到nand重启有输出,说明现在支持了nand启动:

U-Boot 2012.04.01 (Jul 29 2013 - 22:08:35)

CPUID: 32440001

FCLK:      400 MHz

HCLK:      100 MHz

PCLK:       50 MHz

DRAM:  64 MiB

WARNING: Caches not enabled

Flash: *** failed ***

### ERROR ### Please RESET the board ###

在源码里面搜索“Flash:”,可以发现出现错误的原因,是由于board_init_r函数里面,

如果你的程序是从nand启动,那么会卡死,做如下修改:

# endif /* CONFIG_SYS_FLASH_CHECKSUM */

 } else {

  puts("0 KB\n\r");

  //puts(failed);

  //hang();

 }

3.6 修改UBOOT支持NOR FLASH

  drivers\mtd\jedec_flash.c 加上新的型号

  #define CONFIG_SYS_MAX_FLASH_SECT (128)

修复了重定时留下来的BUG:SP要重新设置

  

  SMDK2410 # loady 32000000

  SMDK2410 # protec off all

  SMDK2410 # erase 0 7ffff

  SMDK2410 # cp.b 32000000 0 80000

3.7 修改UBOOT支持NAND FLASH

    修改:include/configs/smdk2440.h: #define CONFIG_CMD_NAND

    

    把drivers\mtd\nand\s3c2410_nand.c复制为s3c2440_nand.c

分析过程:

nand_init

 nand_init_chip

  board_nand_init

   设置nand_chip结构体, 提供底层的操作函数

  nand_scan

   nand_scan_ident

    nand_set_defaults

     chip->select_chip = nand_select_chip;

     chip->cmdfunc = nand_command;

     chip->read_byte = busw ? nand_read_byte16 : nand_read_byte;

     

    nand_get_flash_type

     chip->select_chip

     chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);

       nand_command()  // 即可以用来发命令,也可以用来发列地址(页内地址)、行地址(哪一页)

        chip->cmd_ctrl

          s3c2440_hwcontrol

        

     chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);

     *maf_id = chip->read_byte(mtd);

     *dev_id = chip->read_byte(mtd);

烧写实验:

①烧写到NOR Flash

SMDK2410 # loady 30000000

SMDK2410 # protect off all

SMDK2410 # erase 0 7ffff

SMDK2410 # cp.b 30000000 0 80000

②烧写到NAND Flash

SMDK2410 # nand erase 0 80000

SMDK2410 # nand write 0 0 80000 把norflash 0地址里面的程序烧写到nand flash 0地址里面去,烧写80000

比较

SMDK2410 # nand read 30000000 0 80000

NAND read: device 0 offset 0x0, size 0x80000

 524288 bytes read: OK

SMDK2410 # cmp.b 0 30000000 80000

Total of 524288 bytes were the same

3.8 修改UBOOT支持DM9000网卡

①修改smdk2440.h使它支持网卡DM9000

#if 0

#define CONFIG_CS8900  /* we have a CS8900 on-board */

#define CONFIG_CS8900_BASE 0x19000300

#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */

#else

#define CONFIG_DRIVER_DM9000

#endif

然后编译出错:dm9000x.c:156: error: 'DM9000_DATA' undeclared (first use in this function)

查找原因:

book@book-desktop:/work/system/u-boot-2012.04.01$ grep "DM9000_DATA" * -nR

参考别人的代码:更改smdk2440.h和lowlevel_init.S里面的时序

还是有错误:看一下调用过程

 eth_initialize

  board_eth_init

   cs8900_initialize

*** ERROR: `ethaddr' not set

现在可以用tftp下载代码了:

SMDK2410 # set ipaddr 192.168.1.17

SMDK2410 # set ethaddr 00:0c:29:4d:e4:f4

到这里先要在xp打开tptp服务器,服务器ip为192.168.1.50

SMDK2410 # set serverip 192.168.1.50

SMDK2410 # tftp 30000000 uImage

SMDK2410 # bootm 30000000

移植网卡搞定。

4. 易用性修裁剪及制作补丁

没有tftp时colin 下载uboot

SMDK2410 # loady 30000000

SMDK2410 # protect off all

SMDK2410 # erase 0 7ffff

SMDK2410 # cp.b 30000000 0 80000

tftp可ping通时colin 下载uboot:

SMDK2410 # tftp 30000000 u-boot_new.bin

SMDK2410 # protect off all

SMDK2410 # erase 0 3ffff

SMDK2410 # cp.b 30000000 0 40000

SMDK2410 # reset                       //重启

①环境变量的保存

重启uboot后,会打印:*** Warning - bad CRC, using default environment,这说明没有找到环境变量,需要使用默认的环境变量

在si中搜索,可以发现默认的参数修改

②裁剪

③以前在设置好了环境变量的时候一直不敢用save命令     

内核打印出来的分区信息

0x00000000-0x00040000 : "bootloader"

0x00040000-0x00060000 : "params"

0x00060000-0x00260000 : "kernel"

0x00260000-0x10000000 : "root"

以前是这么烧写:

nand erase 60000 200000

nand write 30000000 60000 200000

现在可以用分区名字代替:

tftp 30000000 uImage

nand erase.part kernel

nand write 30000000 kernel

set bootcmd 'nand read 30000000 kernel;bootm 30000000'

最后看看能不能烧写文件系统:

一:

烧写JFFS2

tftp 30000000 fs_mini_mdev.jffs2

nand erase.part rootfs

nand write.jffs2 30000000 0x00260000 5b89a8

set bootargs console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2

二:

烧写YAFFS

tftp 30000000 fs_mini_mdev.yaffs2 

nand erase.part rootfs

nand write.yaffs 30000000 260000  889bc0

更新UBOOT:

tftp 30000000 u-boot.bin; protect off all; erase 0 3ffff; cp.b 30000000 0 40000

colin 查看数据:

SMDK2410 # nand dump 260000

制作补丁:

book@book-desktop:/work/system/u-boot-2012.04.01$ make distclean

book@book-desktop:/work/system/u-boot-2012.04.01$ rm u-boot.dis

book@book-desktop:/work/system/u-boot-2012.04.01$ cd ..

book@book-desktop:/work/system$ mv u-boot-2012.04.01 u-boot-2012.04.01_100ask

book@book-desktop:/work/system$ tar xjf u-boot-2012.04.01.tar.bz2

book@book-desktop:/work/system$ diff --help

book@book-desktop:/work/system$ diff -urN u-boot-2012.04.01 u-boot-2012.04.01_100ask > u-boot-2012.04.01_100ask_colin.patch

diff -urN u-boot-2012.04.01 u-boot-2012.04.01_100ask > u-boot-2012.04.01_100ask.patch

怎么用这个补丁:

book@book-desktop:/work/system$ cd u-boot-2012.04.01

book@book-desktop:/work/system/u-boot-2012.04.01$ patch -p1 < ../u-boot-2012.04.01_100ask_colin.patch

book@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2440_config

book@book-desktop:/work/system/u-boot-2012.04.01$ make

最重要的一点:

修改NFS.C里面的#define NFS_TIMEOUT (10*2000UL)

这样可以解决

SMDK2410 # nfs 32000000 192.168.1.51:/work/nfs_root/uImage_new

dm9000 i/o: 0x20000000, id: 0x90000a46 

DM9000: running in 16 bit mode

MAC: 08:00:3e:26:0a:5b

could not establish link

Using dm9000 device

File transfer via NFS from server 192.168.1.51; our IP address is 192.168.1.17

Filename '/work/nfs_root/uImage_new'.

Load address: 0x32000000

Loading: #################################################################

         #################################################################

         #################################################################

         #################################################################

         #################################################################

         #################################################################

         #################################################################

         ##############T T *** ERROR: Cannot umount

分析"重定位之修改代码为新地址":

#ifndef CONFIG_SPL_BUILD

 /*

  * fix .rel.dyn relocations

  */

 ldr r0, _TEXT_BASE  /* r0 <- Text base */

 // r0=0, 代码基地址

 

 sub r9, r6, r0  /* r9 <- relocation offset */

 // r9 = r6-r0 = 0x33f41000 - 0 = 0x33f41000

 

 ldr r10, _dynsym_start_ofs /* r10 <- sym table ofs */

 // r10 = 00073608

 

 add r10, r10, r0  /* r10 <- sym table in FLASH */

 // r10 = 00073608 + 0 = 00073608

 

 ldr r2, _rel_dyn_start_ofs /* r2 <- rel dyn start ofs */

 // r2=0006b568

 

 add r2, r2, r0  /* r2 <- rel dyn start in FLASH */

 // r2=r2+r0=0006b568

 

 ldr r3, _rel_dyn_end_ofs /* r3 <- rel dyn end ofs */

 // r3=00073608

 

 add r3, r3, r0  /* r3 <- rel dyn end in FLASH */

 // r3=r3+r0=00073608

 

fixloop:

 ldr r0, [r2]  /* r0 <- location to fix up, IN FLASH! */

 1. r0=[0006b568]=00000020

 

 add r0, r0, r9  /* r0 <- location to fix up in RAM */ 修改代码为新地址

 1. r0=r0+r9=00000020 + 0x33f41000 = 0x33f41020

 

 ldr r1, [r2, #4]

 1. r1=[0006b568+4]=00000017

 

 and r7, r1, #0xff

 1. r7=r1&0xff=00000017

 

 cmp r7, #23   /* relative fixup? */

 1. r7 == 23(0x17)

 

 beq fixrel

 cmp r7, #2   /* absolute fixup? */

 

 beq fixabs

 /* ignore unknown type of fixup */

 b fixnext

fixabs:

 /* absolute fix: set location to (offset) symbol value */

 mov r1, r1, LSR #4  /* r1 <- symbol index in .dynsym */

 

 add r1, r10, r1  /* r1 <- address of symbol in table */

 

 ldr r1, [r1, #4]  /* r1 <- symbol value */

 

 add r1, r1, r9  /* r1 <- relocated sym addr */

 

 b fixnext

fixrel:

 /* relative fix: increase location by offset */

 ldr r1, [r0]

 1. r1=[00000020]=000001e0

 

 add r1, r1, r9

 1. r1=r1+r9=000001e0 + 0x33f41000 = 33F411E0

 

fixnext:

 str r1, [r0]

 1. [0x33f41020] = 33F411E0

 

 add r2, r2, #8  /* each rel.dyn entry is 8 bytes */

 1. r2=r2+8=0006b568+8=6B570

 

 cmp r2, r3

 1. 

 

 blo fixloop

#endif

转自kuangdoushi

(嵌入式开发)移植最新uboot的更多相关文章

  1. 移植最新Uboot到JZ2440开发板

        下载最新版U-boot,建立Source Insight工程,在建立工程的时候注意,去掉一些很明显不属于硬件的分支代码.      例如,arch目录下面的除开arm子目录之外的其他目录,都可 ...

  2. 移植最新u-boot(裁剪和修改默认参数)之韦东山笔记

    1.下载.建立source insight工程.编译.烧写.如果无运行分析原因 tar xjf u-boot-2012.04.01.tar.bz2 cd u-boot-2012.04.01 make ...

  3. 移植最新u-boot(裁剪和修改默认参数)

    [参考]韦东山 教学笔记 ================================================== 最简单的bootloader的编写步骤: 1. 初始化硬件:关看门狗.设 ...

  4. 小白自制Linux开发板 二. u-boot移植

    上一篇:小白自制Linux开发板 一. 瞎抄原理图与乱画PCB  中我们做了一个小型而没用的开发板,用的是Licheepi Nano的镜像,那从本篇开始我们开始自己构建它的灵魂吧. 我们都知道,PC在 ...

  5. 【4412嵌入式开发板学习笔记】认识uboot

    转自迅为讨论群:http://www.topeetboard.com 重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的.所以我试了一下笔记上的uboot命令, ...

  6. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel

    经过若干天的反复测试,搜索.终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核.如下详细解释整个构建过程. 准备环境 运行环境:Ubuntu 16.04 需要的虚拟 ...

  7. 用vs2013+velt-0.1.4进行嵌入式开发 进行海思平台 UBOOT 开发

    1.1    什么是VELT VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件 ...

  8. 专访Linux嵌入式开发韦东山操作系统图书作者--转

    CSDN学院讲师韦东山:悦己之作,方能悦人 发表于2015-04-28 08:09| 6669次阅读| 来源CSDN| 24 条评论| 作者夏梦竹 专访Linux嵌入式开发韦东山操作系统图书作者 摘要 ...

  9. 应聘linux/ARM嵌入式开发岗位

    **************************************************************** 因为发在中华英才和智联招聘没有人采我所以我 在这里发布我的个人简历希望 ...

随机推荐

  1. 机器学习Python实现AdaBoost

    adaboost是boosting方法多个版本号中最流行的一个版本号,它是通过构建多个弱分类器.通过各个分类器的结果加权之后得到分类结果的.这里构建多个分类器的过程也是有讲究的,通过关注之前构建的分类 ...

  2. POJ 3039 搜索??? (逼近)

    思路: 抄的题解 这叫搜索? 难以理解 我觉得就是枚举+逼近 //By SiriusRen #include <cmath> #include <cstdio> #includ ...

  3. log大全

    http://www.iconfont.cn/search/index?q=%E6%88%91%E7%9A%84&page=3

  4. java(运算符,控制流程语句,函数 )

    运算符 数据类型转换: 小数据类型-------->大数据类型(自动类型转换) 大数据类型--------->小数据类型(强制类型转换) 强制类型转换的格式: 小数据类型  变量名 = ( ...

  5. 小的时候.by小雷

    小的时候,总是有很多想法.   想去做,却做不成.   因为,自己小,被父母约束着,被学校圈着,被老师教育着. 想买个小霸王游戏机,没钱.在父辈的眼中,"游戏" ,游戏室,电脑游戏 ...

  6. apache 使用 mod_fcgid.so模块时 配置指令

    FcgidBusyScanInterval指令 说明:扫描繁忙超时进程的间隔 语法: FcgidBusyScanInterval seconds 默认:FcgidBusyScanInterval 12 ...

  7. JavaScript中的*top、*left、*width、*Height具体解释

    来源:http://www.ido321.com/911.html html代码 1: <body> 2: <div class="father" id=&quo ...

  8. android图片特效处理之锐化效果

    这篇将讲到图片特效处理的锐化效果.跟前面一样是对像素点进行处理,算法是通用的. 算法原理: 一.简单算法:分别获取当前像素点和八个周围像素点的RGB值,先求出当前像素点的RGB值与八个像素点RGB值的 ...

  9. js刷新页面有哪几种方法

    js刷新页面有哪几种方法 一.总结 一句话总结:location属性的reload方法即可:document.location.reload() 1.页面刷新有哪常见的8种方法? 1,history. ...

  10. NVM安装nodejs的方法

    安装nodejs方式有很多种. 第一种:官网下载  通过nodejs官网下载安装 ,但有个缺陷,不同版本的nodejs无法顺利的切换. 第二种: NVM安装  NVM可以帮助我们快速切换 node版本 ...