本帖最后由 qyihan 于 2013-12-10 16:51 编辑
【最新u-boot-2013.10移植】uboot移植(一)、(二)、(三)
【最新u-boot-2013.10移植】uboot移植(四):新建单板和时钟内存串口的设置
一、新建一个单板qyh2440
1、新建一个单板文件夹
cd /root/work/arm9_study/linux/u-boot-2013.10/board/samsung
cp -rf smdk2410/ qyh2440
2、新建一个配置文件
cd include/configs/
cp smdk2410.h qyh2440.h
3、修改boards.cfg
先执行make distclean,把无关的东西去掉,然后执行grep "smdk2410" ./ -nr
搜索到在boards.cfg中有关于smdk2410的配置:
Active arm arm920t s3c24x0 samsung - smdk2410
然后我们也添加一句:
Active arm arm920t s3c24x0 samsung - qyh2440
然后执行配置:make qyh2440_config
通过了,然后在执行编译:make
竟然也通过了,但是肯定还是无法运行的
4、修改文件名
修改board/samsung/qyh2440下的smdk2410.c为qyh2440.c
搜索得到:
./board/samsung/qyh2440/Makefile:12:COBJS := smdk2410.o
修改为qyh2440.o
在进行配置和编译,同样可以编译通过。
二、修改时钟和内存配置
这里依据韦东山视频“移植最新u-boot-2012.04”
阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置
处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置
用韦东山视频“自己写bootloader”里的时钟设置和内存设置的代码替换原来的。
注释掉board/samsung/qyh2440.c里的board_early_init_f函数中关于时钟的设置:
/* 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);
/* some delay between MPLL and UPLL */
//pll_delay(4000);
这些代码加入start.S,替换原来设置时钟分频的三句话,设置时钟和启动ICACHE的代码:
*****************************************************************************************************
/* 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_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02))
#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
*****************************************************************************************************
替换board/samsung/qyh2440/lowlevel_init设置内存的代码:
*****************************************************************************************************
.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
*****************************************************************************************************
三、修改串口设置
把上面的修改后,进行编译和烧写,发现串口输出乱码,查看串口波特率的设置,发现在get_HCLK里没有定义CONFIG_S3C2440
具体跟踪代码如下:
init_sequence数组里的函数-->timer_init-->get_PCLK( )-->get_HCLK( )-->发现没有定义#ifdef CONFIG_S3C2440
注意:以上的代码跟踪的路径都是与arm920t和s3c24x0有关的。
处理措施(1):include/configs/qyh2440.h: 去掉CONFIG_S3C2410,添加#define CONFIG_S3C2440
编译错误,提示的错误:s3c2410_nand.c:59:4: error: dereferencing pointer to incomplete type
这是一个关于2410的nandflash的操作,为了验证串口,先不编译这部分代码,到drivers/mtd/nand下的Makefile查询它的依赖,这也是一个调试技巧。
看过之后,有这样一句:COBJS-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o。发现它依赖于CONFIG_NAND_S3C2410,在qyh2440.h中有如下语句:
/*
* NAND configuration
*/
#ifdef CONFIG_CMD_NAND
#define CONFIG_NAND_S3C2410
#define CONFIG_SYS_S3C2410_NAND_HWECC
#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE 0x4E000000
#endif
处理措施(2)://#define CONFIG_CMD_NAND,去掉关于nand的操作
还提示有错误:yaffs_uboot_glue.c:181:19: error: 'CONFIG_SYS_MAX_NAND_DEVICE' undeclared (first use in this function)
它用到了CONFIG_SYS_MAX_NAND_DEVICE,而我们上面把它去掉了,所以索性把这个函数也先不编译。
处理措施(3)://#define CONFIG_YAFFS2
编译通过
四、调试
遇到难题,不管是u-boot-2013.10还是u-boot-2012.04.01都是到这一步,串口没有输出,
接下来先分析一下,tq2440自带的u-boot源码吧
(这里的原因找到了,原来用的交叉编译器是友善之臂提供的针对arm11的4.5.1的,换为天嵌提供的针对arm9的4.3.3的可以了,估计总计浪费了4个小时的时间吧)
五、结果
通过jlink烧写到NOR Flash,启动,串口打印出如下信息:
U-Boot 2013.10 (Dec 10 2013 - 00:07:52)
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 ###
下一步移植nand flash的操作
|