参考资料:
移植u-boot2009.08到OK2440V3开发板(2)---在SDRAM中运行
u-boot-2011.03在TQ2440上的移植(2)--初始化时钟嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一)1、环境说明:
主机:ubuntu10.10
交叉编译:arm-linux-gcc 4.5.1
开发板文件系统:root-2.6.33-qt.tar.bz2 打包好的
开发板内核 :linux-2.6.33-qt.tar.bz2
开发板:TQ2440 nandflash 256MB 东华3.5寸屏
uboot源码:
ftp://ftp.denx.de/pub/u-boot/ u-boot-2010.06-rc1.tar.bz2
CPU: S3C2440
SDRAM: 48LC16M16A 64MB
NOR FLASH EN29LV160AB 2MB
FLASH K9F2G08UDA 256MB
2.
u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;
arch/arm/cpu/arm920t/start.S
u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。
board/samsung/smdk2440/smdk2440.c
3、在include/configs/smdk2440.h头文件中添加CONFIG_S3C2440宏
vi include/configs/smdk2440.h 在第40行添加
#define CONFIG_S3C2440 1
4、增加对S3C2440的支持 修改 SDRAM配置
gedit board/sumsung/smdk2440/lowlevel_init.S
在文件54行
#define B1_BWSCON (DW16)//(DW32) IDE
#define B2_BWSCON (DW16)
#define B3_BWSCON (DW16 + WAIT + UBLB)
#define B4_BWSCON (DW16)
#define B5_BWSCON (DW8)//(DW16)
#define B6_BWSCON (DW32)
#define B7_BWSCON (DW32)
修改 lowlevel_init.S 文件第 126 行,设置为100MHZ
#define REFCNT 0x4F4 //100MHZ
//1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
5、stage1阶段的硬件设备初始化。
vi arch/arm/cpu/arm920t/start.S
去掉117,118行点亮AT91RM9200DK系列LED的代码
/*
bl coloured_LED_init
bl red_LED_on
*/
这里也可以加入 自己 LED支持 参考:
http://www.cublog.cn/u3/101649/showart.php?id=2105215
- 接下来,加入自己的LED 支持
- /*bl coloured_LED_init
//这两行是AT91RM9200DK开发板的LED初始化,注释掉
- bl red_LED_on*/
- 添加如下:
- #if defined(CONFIG_S3C2440)
//区别与其他开发板
- //根据TQ2440原理图可知LED分别由S3C2440的PB5、6、7、8口来控制,以下是PB端口寄存器基地址(查2440的DataSheet得知)
- #define GPBCON 0x56000010
- #define GPBDAT 0x56000014
- #define GPBUP 0x56000018
- //以下对寄存器的操作参照S3C2440的DataSheet进行操作
- ldr r0,
=GPBUP
- ldr r1,
=0x7FF //即:二进制11111111111,关闭PB口上拉
- str r1,
[r0]
- ldr r0,
=GPBCON //配置PB5、6、7、8为输出口,对应PBCON寄存器的第10-17位
- ldr r1,
=0x154FD //即:二进制010101010011111101
- str r1,
[r0]
- ldr r0,
=GPBDAT
- ldr r1,
=0x1C0 //即:二进制111000000,PB5设为低电平,6、7、8为高电平
- str r1,
[r0]
- #endif
- //此段代码使u-boot启动后,点亮开发板上的LED1,LED2、LED3、LED4不亮
6、在u-boot中添加对S3C2440一些寄存器的支持、添加中断禁止部分和时钟设置部分。
这里参考:http://www.52rd.com/blog/Detail_RD.Blog_liweikui_22249.html
arch/arm/cpu/arm920t/start.S 我把修改过的start.S
start.rar
- #ifdef CONFIG_S3C24X0
- /* turn off the watchdog
*/
- # if defined(CONFIG_S3C2400)
- # define pWTCON 0x15300000
- # define INTMSK 0x14400008 /* Interupt-Controller base addresses
*/
- # define CLKDIVN 0x14800014 /* clock divisor register
*/
- #else
- /*2410 和 2440 的寄存器地址是一致的,所以不需要修改*/
- # define pWTCON 0x53000000
- # define INTMSK 0x4A000008 /* Interupt-Controller base addresses
*/
- # define INTSUBMSK 0x4A00001C
- # define CLKDIVN 0x4C000014 /* clock divisor register
*/
- # endif
- ldr r0,
=pWTCON
- mov r1, #0x0
- str r1,
[r0]
- /*
- * mask all IRQs by setting all bits
in the INTMR
- default
- */
- mov r1, #0xffffffff
- ldr r0,
=INTMSK
- str r1,
[r0]
- # if defined(CONFIG_S3C2410)
- ldr r1,
=0x3ff
- ldr r0,
=INTSUBMSK
- str r1,
[r0]
- # endif
- # if defined(CONFIG_S3C2440)//添加s3c2440的中断禁止部分
- ldr r1,
=0x7fff
//根据2440芯片手册,INTSUBMSK寄存器有15位可用
- ldr r0,
=INTSUBMSK
- str r1,
[r0]
- # endif
- # if defined(CONFIG_S3C2440)
//添加s3c2440的时钟部分
- # define LOCKTIME 0x4C000000
- #define MPLLCON 0x4C000004
//系统主频配置寄存器基地址
- #define UPLLCON 0x4C000008
//USB时钟频率配置寄存器基地址
- # define CAMDIVN 0x4C000018
- //locktime用来在正常运行时更改时钟的时候保护时钟 ####注意这里
- ldr r0,=LOCKTIME
- mov r1,#0xffffff
- str r1,[r0]
- //清除摄像头分频寄存器值,这个值会影响HCLK
- ldr r0,=CAMDIVN
- mov r1,#0
- str r1,[r0]
- /***************/
- ldr r0,
=CLKDIVN
//设置分频系数FCLK:HCLK:PCLK
= 1:4:8
- mov r1, #5
- str r1,
[r0]
- //在2440的手册中写着若HDIVN不为0,则需要下面几句
- mrc p15, 0, r1, c1, c0,
0 //read ctrl register
- orr r1, r1, #0xc0000000
//Asynchronous
- mcr p15, 0, r1, c1, c0,
0 //write ctrl register
-
- ldr r0,
=UPLLCON
//设置USB时钟频率为48MHz
- ldr r1,
=0x38022
//这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分
- str r1,
[r0]
- //arm920t为5级流水线,延迟几个周期,使指令生效
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- //大于 400 MHZ 容易死机
- ldr r0,
=MPLLCON
//设置系统主频为400MHz 我自己设置主频 为 400MHZ
- ldr r1,
=0x5C011
//这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分
- str r1,
[r0]
-
- # else
- /* FCLK:HCLK:PCLK
= 1:2:4
*/
- /* default FCLK
is 120 MHz
! */
- ldr r0,
=CLKDIVN
- mov r1, #3
- str r1,
[r0]
- #endif 注意这里还有一个 #endif
- #endif /* CONFIG_S3C24X0
*/
7、S3C2440的时钟部分除了在start.S中添加外,还要分别在board/samsung/smdk2440/smdk2440.c和cpu/arm920t/s3c24x0/speed.c中修改或添加部分代码,如下:
vi board/samsung/smdk2440/smdk2440.c
时钟部分修改第34行和在45行添加如下红 {MOD}部分
#define FCLK_SPEED 2 //设置默认等于2,即下面红 {MOD}代码部分有效
#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elif FCLK_SPEED==1 /* Fout = 202.8MHz */
#define M_MDIV 0xA1
#define M_PDIV 0x3
#define M_SDIV 0x1
#elif FCLK_SPEED==2 /* Fout = 400MHz */
#define M_MDIV 0x5C //这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置
#define M_PDIV 0x1
#define M_SDIV 0x1
#endif
USB时钟部分修改第51行和在61行添加如下红 {MOD}部分
#define USB_CLOCK 2 //设置默认等于2,即下面红 {MOD}代码部分有效
#if USB_CLOCK==0
#define U_M_MDIV 0xA1
#define U_M_PDIV 0x3
#define U_M_SDIV 0x1
#elif USB_CLOCK==1
#define U_M_MDIV 0x48
#define U_M_PDIV 0x3
#define U_M_SDIV 0x2
#elif USB_CLOCK==2 /* Fout = 48MHz */
#define U_M_MDIV 0x38 //这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置
#define U_M_PDIV 0x2
#define U_M_SDIV 0x2
#endif
8、vi arch/arm/cpu/arm920t/s3c24x0/speed.c //根据设置的分频系数FCLK:HCLK:PCLK = 1:4:8修改获取时钟频率的函数
get_PLLCLK函数修改第66行如下
static ulong get_PLLCLK(int pllreg)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
ulong r, m, p, s;
if (pllreg == MPLL)
r = clk_power->MPLLCON;
else if (pllreg == UPLL)
r = clk_power->UPLLCON;
else
hang();
m = ((r & 0xFF000) >> 12) + 8;
p = ((r & 0x003F0) >> 4) + 2;
s = r & 0x3;
#if defined(CONFIG_S3C2440)
if(pllreg == MPLL)
{ //参考S3C2440芯片手册上的公式:PLL=(2 * m * Fin)/(p * 2s)
return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));
}
#endif
return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
}
修改84行get_HCLK函数为
/* return HCLK frequency */
ulong get_HCLK(void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
#if defined(CONFIG_S3C2440)
return(get_FCLK()/4);
#endif
return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
}
9.此,对s3c2440的支持(时钟配置部分)就算做好了,为了方便调试,可以利用开发板自带的u-boot文件烧写到内存中运行,此时还要修改一些配置:
修改arch/arm/cpu/arm920t/start.S文件的177行如下:
gedit arch/arm/cpu/arm920t/start.S
177行:
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
/* bl cpu_init_crit */
#endif
10.修改 0x33000000
gedit board/samsung/smdk2440/config.mk
为了调试方便
TEXT_BASE = 0x33000000 修改为红 {MOD}的
#TEXT_BASE = 0x33F80000
而且,使用DNW下载时,将地址设置为 0x33000000
错误:在处理过程中,我设置 TEXT_BASE = 0x30000000 ,经 DNW的地址也设置为 0x30000000,但是最后出错了,我把它修改为 0x33000000 ,就可以了。?????
10.
make mrproper
make smdk2440_config
make all
11.
- [7] Download Program
(uCOS-II
or TQ2440_Test)
to SDRAM
and Run it
- [8] Boot the system
- [9] Format the Nand Flash
- [0]
Set the boot parameters
- [a] Download User Program
(eg: uCOS-II
or TQ2440_Test)
- [b] Download LOGO Picture
(.bin)
to Nand Flash
- [l]
Set LCD Parameters
- [o] Download u-boot
to Nor Flash
- [r] Reboot u-boot
- [t] Test Linux Image
(zImage)
- [q] quit from menu
- Enter your selection: 7
- USB host is connected. Waiting a download.
- Now, Downloading
[ADDRESS:33000000h,TOTAL:98790]
- RECEIVED FILE SIZE: 98790
(96KB/S, 1S)
- ## Starting application at 0x33000000
...▲
- U-Boot 2010.06-rc1
( 4鏈?16 2011
- 13:24:25)
- DRAM: 64 MiB
- Flash: 512 KiB
- *** Warning
- bad CRC, using default environment
- In: serial
- Out: serial
- Err: serial
- Net: CS8900-0
- SMDK2410 #
阅读(1569) | 评论(0) | 转发(0) |
0
上一篇:
一个合格程序员的每天每周每月每年该做的事
下一篇:
UBOOT-2010.06 移植 建立自己的demo板 (二)
相关热门文章
评论热议