参考资料:
移植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源码: 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行添加如下红色部分
#define FCLK_SPEED 2 //设置默认等于2,即下面红色代码部分有效
#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行添加如下红色部分
#define USB_CLOCK 2 //设置默认等于2,即下面红色代码部分有效
#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 修改为红色的
#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 #
阅读(3165) | 评论(0) | 转发(0) |