打印
[嵌入式linux]

【最新u-boot-2013.10移植】uboot移植(四)新单板时钟内存串口

[复制链接]
3525|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qyihan|  楼主 | 2013-12-10 16:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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的操作


相关帖子

沙发
chen499103| | 2014-5-1 21:59 | 只看该作者
学习了!TK!

使用特权

评论回复
板凳
outstanding| | 2014-5-13 08:46 | 只看该作者
uboot移植(四) 其它的呢?在论坛里面么?顶起

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:嵌入式软件成长。。。<*_*>

13

主题

284

帖子

0

粉丝