移植u-boot-2012.04----建立单板_修改时钟_

来源:互联网 发布:erp沙盘软件 编辑:程序博客网 时间:2024/05/16 16:21

ftp://ftp.denx.de/pub/u-boot/ 下载各种版本的u-boot

tar xjf u-boot-2012.04.01.tar.bz2cd u-boot-2012.04.01make smdk2410_configmake

可以支持2410的,现在修改配置支持2440!

source insight工具下打开文件start.s
(u-boot-2012.04.01\arch\arm\cpu\arm920t\start.s)
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
…………………………………………………………………………………….

3.1 建一个单板

cd /work/system/u-boot-2012.04.01 make distclean

清除

cd /work/system/u-boot-2012.04.01/board/samsung/cp smdk2410 smdk2440 -rfcd ../../include/configs/cp smdk2410.h smdk2440.h

拷贝

/work/system/u-boot-2012.04.01make smdk2440_config

建立新的配置

make: *** No rule to make target `smdk2440_config'.  Stop.make: *** [smdk2440_config] Error 1

错误提示
方法:
修改boards.cfg:
仿照

smdk2410                     arm         arm920t     -                   samsung        s3c24x0

添加:

smdk2440                     arm         arm920t     -                   samsung        s3c24x0
/work/system/u-boot-2012.04.01vi  boards.cfg:65  // 去65行    

复制修改为

smdk2440                     arm         arm920t     -                   samsung        s3c24x0 

重新配置编译

/work/system/u-boot-2012.04.01  make smdk2440_config    make 

pc和source insight修改如下:
01
这里写图片描述
02
这里写图片描述
03
这里写图片描述
04
这里写图片描述

接下来分析:start.s
(u-boot-2012.04.01\arch\arm\cpu\arm920t\start.s)

这里写图片描述

UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置
处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置。(注:board_init_f
涉及CPU时钟的设置)

修改:
u-boot-2012.04.01\arch\arm\cpu\arm920t\start.s

① start.s—- board_init_f (去定义arch\arm\lib) —-board_early_init_f (去定义board\samsung\ smdk2440\smdk2410.c)
注销

   /* to reduce PLL lock time, adjust the LOCKTIME register */        //writel(0xFFFFFF, &clk_power->locktime);            /* configure MPLL */        // writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,        //&clk_power->mpllcon);

②2012.04.01\arch\arm\cpu\arm920t\start.s删除以下几行:

 /* FCLK:HCLK:PCLK = 1:2:4 */   /* default FCLK is 120 MHz ! */     ldr    r0, =CLKDIVN     mov    r1, #3     str    r1, [r0]

修改为:

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

③搜索cpu_init_crit
cpu_init_crit—- lowlevel_init

 .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
修改为:
.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

windows下的
u-boot-2012.04.01/arch/arm/cpu/arm920t/start.s
u-boot-2012.04.01/board/samsung/smdk2440/lowlevel_init.S、smdk2410.c
复制替换为
linux虚拟机下的start.s、lowlevel_init.S、smdk2410.c

新的 u-boot 烧写到norflash
注:编译出来的uboot非常大,可以先烧写u-boot_all.bin到nor,然后用这个uboot来烧写新的uboot
串口下:
usb 1 30000000
打开dnw 传新的u-boot
protect off all
erase 0 7ffff
cp.b 30000000 0 80000
乱码!

原因分析:
这里写图片描述

查看串口波特率的设置,发现在get_HCLK里没有定义CONFIG_S3C2440
处理措施:include/configs/smdk2440.h: 去掉CONFIG_S3C2410
添加
#define CONFIG_S3C2440
注释掉
//#define CONFIG_CMD_NAND

重新编译烧写:

这里写图片描述

可以norflash启动了、

阅读全文
0 0