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)