您的位置:首页 > 编程语言 > Qt开发

最具体的u-boot移植到QT2410E开发板的过程1

2009-06-23 14:34 471 查看

最具体的u-boot移植到QT2410E开发板的过程

U-Boot能够支持多种体系结构的处理器,支持的开发板也越来越多。以S3C2410处理器的开发板为例,我们可以基于SMDK2410移植。
开始移植之前,需要先分析一下U-Boot已经支持的开发板,比较出硬件配置最接近的开发板。选择的原则是,首先处理器相同,其次处理器体系结构相同,然后是以太网接口等外围接口。推荐使用官方FTP下载UBOOT源码。http://www.icdev.com.cn/batch.viewlink.php?itemid=1694
移植U-Boot的基本步骤如下:

1创建开发板目录

(1) 在board目录下创建自己的工作目录,将smdk2410目录下的内容全部拷贝到qt2410e目录下。
(2) cd u-boot-1.2.0/board
(3) mkdir qt2410e
(4) cd qt2410e
(5) cp ../smdk2410/* .
(6) mv smdk2410.c qt2410e.c
(7) vi Makefile并把COBJS更改为:COBJS := qt2410e.o flash.o nand_read.o
(8) cd ../..
(9) cp include/configs/smdk2410.h include/configs/qt2410e.h
(10) vi Makefile顶层Makefile中1924行填加如下两行:
qt2410e_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t qt2410e null s3c24x0

2添加nand_read_ll读写函数

start.S文件中需要使用的nand_read_ll读写函数,用来将uboot拷贝到内存里去。在/board/qt2410e目录下需要添加nand_read.c文件,主要实现了nand_read_ll读写函数。
(1) cd board/qt2410e
(2) vi nand_read.c创建此文件
(3) 阅读并分析nand_read_ll函数,将其添加到nand_read.c中,代码如下:
(1) #include <config.h>
(2)
(3) #define __REGb(x) (*(volatile unsigned char *)(x))
(4) #define __REGi(x) (*(volatile unsigned int *)(x))
(5) #define NF_BASE 0x4e000000
(6) #define NFCONF __REGi(NF_BASE + 0x0)
(7) #define NFCMD __REGb(NF_BASE + 0x4)
(8) #define NFADDR __REGb(NF_BASE + 0x8)
(9) #define NFDATA __REGb(NF_BASE + 0xc)
(10) #define NFSTAT __REGb(NF_BASE + 0x10)
(11)
(12) #define BUSY 1
(13) inline void wait_idle(void) {
(14) int i;
(15)
(16) while(!(NFSTAT & BUSY))
(17) for(i=0; i<10; i++);
(18) }
(19)
(20) #define NAND_SECTOR_SIZE 512
(21) #define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
(22)
(23)
(24) int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
(25) {
(26) int i, j;
(27)
(28) if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
(29) return -1;
(30) }
(31)
(32)
(33) NFCONF &= ~0x800;
(34) for(i=0; i<10; i++);
(35)
(36) for(i=start_addr; i < (start_addr + size);) {
(37)
(38) NFCMD = 0;
(39)
(40)
(41) NFADDR = i & 0xff;
(42) NFADDR = (i >> 9) & 0xff;
(43) NFADDR = (i >> 17) & 0xff;
(44) NFADDR = (i >> 25) & 0xff;
(45)
(46) wait_idle();
(47)
(48) for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
(49) *buf = (NFDATA & 0xff);
(50) buf++;
(51) }
(52) }
(53) NFCONF |= 0x800;
(54) return 0;
(55) }

3 修改start.S

(1) vi ../../cpu/arm920t/start.S
(2) 在vi编辑器的命令模式下输入如下命令找到选择FLASH启动部分代码,命令如下:
(3) /RELOCATE
(4) 这时将看到如下代码为NOR的重定向代码:
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup

ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
add r2, r0, r2 /* r2 <- source end address */

copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0] */
stmia r1!, {r3-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end addreee [r2] */
ble copy_loop
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */
(5) 可以将上述代码注释掉或删除,或者直接不予以理会,我们这里将光标移至#ifndef CONFIG_SKIP_RELOCATE_UBOOT行并执行18dd命令直接将其删除。
(6) 删除部分将替换为NAND FLASH的初始化代码,并由此代码最终调用nand_read.c的函数。代码如下:
#ifdef CONFIG_S3C2410_NAND_BOOT
@ reset NAND
mov r1, #NAND_CTL_BASE
ldr r2, =0xf830 @ initial value
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONF]
bic r2, r2, #0x800 @ enable chip
str r2, [r1, #oNFCONF]
mov r2, #0xff @ RESET command
strb r2, [r1, #oNFCMD]

mov r3, #0 @ wait
nand1:
add r3, r3, #0x1
cmp r3, #0xa
blt nand1

nand2:
ldr r2, [r1, #oNFSTAT] @ wait ready
tst r2, #0x1
beq nand2

ldr r2, [r1, #oNFCONF]
orr r2, r2, #0x800 @ disable chip
str r2, [r1, #oNFCONF]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: