您的位置 首页 IC

移植最新uboot的总结

一:准备移植1、从下面的官网下载最新的U-boot。用google英文版搜索最新的u-boot源码ftp:ftpdenxdepubu-boot2、建立sourceinsight工

一:预备移植

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地址编译得到的地址”改为新地址
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);


//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


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]


mrcp15, 0, r1, c1, c0, 0
orrr1, r1, #0xc0000000
mcrp15, 0, r1, c1, c0, 0

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


ldr r0, =0x4c000004
ldr r1, =S3C2440_MPLL_400MHZ
str r1, [r0]


mrc p15, 0, r0, c1, c0, 0@ read control reg
orr r0, r0, #(1<<12)
mcrp15, 0, r0, c1, c0, 0 @ write it back

#endif

③把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为0x33f00000,u-boot.bin文件太大,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
} 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
#define CONFIG_CS8900_BASE0x19000300
#define CONFIG_CS8900_BUS16
#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

ldrr0, _TEXT_BASE
// r0=0, 代码基地址

subr9, r6, r0
// r9 = r6-r0 = 0x33f41000 – 0 = 0x33f41000

ldrr10, _dynsym_start_ofs
// r10 = 00073608

addr10, r10, r0
// r10 = 00073608 + 0 = 00073608

ldrr2, _rel_dyn_start_ofs
// r2=0006b568

addr2, r2, r0
// r2=r2+r0=0006b568

ldrr3, _rel_dyn_end_ofs
// r3=00073608

addr3, r3, r0
// r3=r3+r0=00073608

fixloop:
ldrr0, [r2]
1. r0=[0006b568]=00000020

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

ldrr1, [r2, #4]
1. r1=[0006b568+4]=00000017

andr7, r1, #0xff
1. r7=r1&0xff=00000017

cmpr7, #23
1. r7 == 23(0x17)

beqfixrel
cmpr7, #2

beqfixabs

bfixnext
fixabs:

movr1, r1, LSR #4

addr1, r10, r1

ldrr1, [r1, #4]

addr1, r1, r9

bfixnext
fixrel:

ldrr1, [r0]
1. r1=[00000020]=000001e0

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

fixnext:
strr1, [r0]
1. [0x33f41020] = 33F411E0

addr2, r2, #8
1. r2=r2+8=0006b568+8=6B570

cmpr2, r3
1.

blofixloop
#endif

=====================================================================================

1、下载、树立source insight工程、编译、烧写、假如无运转剖析原因

tar xjf u-boot-2012.04.01.tar.bz2

cd u-boot-2012.04.01

make smdk2410_config

make

因为arm-linux-gcc版别太低,编译犯错

arm-linux-gcc -v

下面来替换arm-linux-gcc到最新版别,以arm-linux-gcc-4.3.2.tar.bz2为例:

a、到服务器上装置东西链:

先创立暂时目录检查有什么内容:

mkdir tmp

tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C tmp/

再到bin/目录下能够看到各种东西链,到此刻阐明该文件(arm-linux-gcc-4.3.2.tar.bz2)能够运用

再回到根目录下,即和tmp文件夹在同一个目录下用以下指令解压到根目录下:

sudu tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C /

最终设置环境变量,当履行该指令时体系会到该目录下找到该指令履行:

检查环境变量指令,这个环境变量指定了去哪里找指令:echo $PATH

从头设置环境变量(该指令重启体系后失效,需求从头设置):

export

PATH=/usr/local/arm/4.3.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/g

ames

可用以下指令修正文件,重启体系后永久有用:

sudo vi /etc/environment

PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4.3.

2/bin”

b、设置好最新的编译器今后,先回到u-boot-2012.04.01目录下,履行:make distclean指令删去之前编译出

的文件,从头make smdk2410_config,再make

2. 剖析u-boot: 经过链接指令剖析组成文件、阅览代码剖析发动进程

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

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

c. 把内核从NAND FLASH读到SDRAM

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

e. 跳转履行内核

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地址编译得到的地址”改为新地址

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

2.9 clear_bss

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

能够修正装备界说CONFIG_S3C2440

3. 修正U-BOOT代码

3.1 建一个单板

cd board/samsung/

cp smdk2410 smdk2440 -rf

cd ../../include/configs/

cp smdk2410.h smdk2440.h

修正boards.cfg:

模仿

smdk2410 arm arm920t samsung s3c24x0

增加:

smdk2440 arm arm920t samsung s3c24x0

3.2 烧写看成果

3.3 调试:

a. 阅览代码发现缺乏:UBOOT里先以60MHZ的时钟核算参数来设置内存控制器,可是MPLL还未设置

处理办法: 把MPLL的设置放到start.S里,撤销board_early_init_f里对MPLL的设置

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

3.4 乱码,检查串口波特率的设置,发现在get_HCLK里没有界说CONFIG_S3C2440

处理办法:include/configs/smdk2440.h: 去掉CONFIG_S3C2410

#define CONFIG_S3C2440

//#define CONFIG_CMD_NAND

3.5 修正UBOOT支撑NAND发动

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

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

3.5.1 去掉 “-pie”选项

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

3.5.2 参阅”毕业班第1课”的start.S, init.c来修正代码

把init.c放入board/samsung/smdk2440目录, 修正Makefile

修正CONFIG_SYS_TEXT_BASE为0x33f00000,u-boot.bin文件太大,0x33f80000不行放

修正start.S

3.5.3 修正board_init_f, 把relocate_code去掉

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

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

board/samsung/smdk2440/libsmdk2440.o

3.6 修正UBOOT支撑NOR FLASH

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

#define CONFIG_SYS_MAX_FLASH_SECT (128)

修正了重守时留下来的BUG:SP要从头设置

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);

3.8 修正UBOOT支撑DM9000网卡

eth_initialize

board_eth_init

cs8900_initialize

*** ERROR: `ethaddr not set

set ipaddr 192.168.1.17

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

set serverip 192.168.1.3

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

内核打印出来的分区信息

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

烧写JFFS2

tftp 30000000 fs_mini_mdev.jffs2

nand erase.part rootfs

nand write.jffs2 30000000 0x00260000 5b89a8

set bootargs console=ttySAC0,115200 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_new.bin; protect off all; erase 0 3ffff; cp.b 30000000 0 40000

制造补丁:

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

剖析”重定位之修正代码为新地址”:

#ifndef CONFIG_SPL_BUILD

ldr r0, _TEXT_BASE

// r0=0, 代码基地址

sub r9, r6, r0

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

ldr r10, _dynsym_start_ofs

// r10 = 00073608

add r10, r10, r0

// r10 = 00073608 + 0 = 00073608

ldr r2, _rel_dyn_start_ofs

// r2=0006b568

add r2, r2, r0

// r2=r2+r0=0006b568

ldr r3, _rel_dyn_end_ofs

// r3=00073608

add r3, r3, r0

// r3=r3+r0=00073608

fixloop:

ldr r0, [r2]

1. r0=[0006b568]=00000020

add r0, r0, r9

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

1. r7 == 23(0x17)

beq fixrel

cmp r7, #2

beq fixabs

b fixnext

fixabs:

mov r1, r1, LSR #4

add r1, r10, r1

ldr r1, [r1, #4]

add r1, r1, r9

b fixnext

fixrel:

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

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

cmp r2, r3

1.

blo fixloop

#endif

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/263387.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部