1、基于s3c2410的uboot120的分析以及移植下篇8 分析到此告一段落,下面进入uboot的具体移植(1)创建自己的工作目录。在board目录下创建自己的工作目录,将smdk2410目录下的内容全部拷贝到tc2410目录下。cd boardmkdir tc2410cp -fr board/smdk2410 board/tc2410cp include/configs/smdk2410.h include/configs/tc2410.h修改tc2410目录下相关的文件名以及makefile,。在这个目录下需要添加nand_read.c文件,可以从vivi里面拷贝过来,nand_read.c
2、文件主要实现了start.S文件中的nand_read_ll读写函数,用来将uboot拷贝到内存里去。需要修改的地方:mv smdk2410.c tc2410.c COBJS := tc2410.o flash.o nand_read.o修改顶层makefile,添加自己的信息:tc2410_config : unconfig $(MKCONFIG) $(:_config=) arm arm920t tc2410 null s3c24x0(2)修改start.S禁止中断部分也要修改# if defined(CONFIG_S3C2410) ldr r1, =0x7ff /根据2410芯片手册,I
3、NTSUBMSK有11位可用, /vivi也是0x7ff,不知为什么UBoot一直没改过来。 ldr r0, =INTSUBMSK str r1, r0# endif将以下UBoot的重定向语句替换:这段relocate代码只对从norflash中启动的设备有效,因此可以去掉#ifndef CONFIG_SKIP_RELOCATE_UBOOTrelocate: /* relocate U-Boot to RAM */ adr r0, _start /* r0 - current position of code */ ldr r1, _TEXT_BASE /* test if we run f
4、rom flash or RAM */ cmp r0, r1 /* dont 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 tar
5、get address r1 */ cmp r0, r2 /* until source end addreee r2 */ ble copy_loop#endif /* CONFIG_SKIP_RELOCATE_UBOOT */替换成:#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,
6、#oNFCONF mov r2, #0xff RESET command strb r2, r1, #oNFCMD mov r3, #0 waitnand1: add r3, r3, #0x1 cmp r3, #0xa blt nand1nand2: 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 get read to call C functions (for nand_read()
7、 ldr sp, DW_STACK_START setup stack pointer mov fp, #0 no previous frame, so fp=0 copy U-Boot to RAM ldr r0, =TEXT_BASE mov r1, #0x0 mov r2, #0x20000 bl nand_read_ll 这个函数在nand_read.c中实现 tst r0, #0x0 beq ok_nand_readbad_nand_read:loop2: b loop2 infinite loopok_nand_read: verify mov r0, #0 ldr r1, =TE
8、XT_BASE mov r2, #0x400 4 bytes * 1024 = 4K-bytes,这句话的意思在start.S中已注释。go_next: ldr r3, r0, #4 ldr r4, r1, #4 teq r3, r4 bne notmatch subs r2, r2, #4 beq stack_setup bne go_nextnotmatch:loop3: b loop3 infinite loop#endif CONFIG_S3C2410_NAND_BOOT在 “ _start_armboot: .word start_armboot ” 后加入: .align 2DW_
9、STACK_START: .word STACK_BASE+STACK_SIZE-4start.S文件修改到此结束。(3)在include/configs/tc2410.h头文件中添加nandflash的初始化信息,这个文件与板子密切相关,需要修改的地方也很多。具体添加信息/*/添加的内容/#define CFG_ENV_IS_IN_FLASH 1 #define CFG_ENV_IS_IN_NAND 1 #define CFG_ENV_OFFSET 0x020000 #define CFG_NAND_BASE 0x4E000000 #define CMD_SAVEENV #define CF
10、G_NAND_LEGACY #define CFG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */ #define CFG_MONITOR_BASE PHYS_SDRAM_1 #if (CONFIG_COMMANDS & CFG_CMD_NAND) #define CFG_NAND_BASE 0x4E000000 /* NandFlash控制器在SFR区起始寄存器地址 */ #define CFG_MAX_NAND_DEVICE 1 /* 支持的最在Nand Flash数据 */ #define SECTORSIZE 512 /*
11、 1页的大小 */ #define NAND_SECTOR_SIZE SECTORSIZE #define NAND_BLOCK_MASK 511 /* 页掩码 */ #define ADDR_COLUMN 1 /* 一个字节的Column地址 */ #define ADDR_PAGE 3 /* 3字节的页块地址!*/ #define ADDR_COLUMN_PAGE 4 /* 总共4字节的页块地址! */ #define NAND_ChipID_UNKNOWN 0x00 /* 未知芯片的ID号 */ #define NAND_MAX_FLOORS 1 #define NAND_MAX_CHI
12、PS 1 /* Nand Flash命令层底层接口函数 */ #define WRITE_NAND_COMMAND(d, adr) rNFCMD = d; #define WRITE_NAND_ADDRESS(d, adr) rNFADDR = d; #define WRITE_NAND(d, adr) rNFDATA = d; #define READ_NAND(adr) (rNFDATA) #define NAND_WAIT_READY(nand) while(!(rNFSTAT&(10); #define NAND_DISABLE_CE(nand) rNFCONF |= (111); #
13、define NAND_ENABLE_CE(nand) rNFCONF &= (1 %08lX BSS: - %08lXn, _armboot_start, _bss_start, _bss_end); printf (U-Boot code: %08lX - %08lX BSS: - %08lXn,输出_armboot_start地址信息 _armboot_start, _bss_start, _bss_end); #ifdef CONFIG_MODEM_SUPPORT debug (Modem Support enabledn);#endif#ifdef CONFIG_USE_IRQ de
14、bug (IRQ Stack: %08lxn, IRQ_STACK_START); debug (FIQ Stack: %08lxn, FIQ_STACK_START);#endif return (0);(7)修改common/env_nand.c,具体nandflash的擦写需要使用nand_legacy_erase等函数实现,而不是nand-erase()函数.#ifdef CONFIG_INFERNO#error CONFIG_INFERNO not supported yet#endifint nand_legacy_rw (struct nand_chip* nand, int c
15、md, size_t start, size_t len, size_t * retlen, u_char * buf);extern struct nand_chip nand_dev_descCFG_MAX_NAND_DEVICE;extern int nand_legacy_erase(struct nand_chip *nand, size_t ofs, size_t len, int clean);/* info for NAND chips, defined in drivers/nand/nand.c */extern nand_info_t nand_infoCFG_MAX_N
16、AND_DEVICE;.#else /* ! CFG_ENV_OFFSET_REDUND */int saveenv(void) ulong total; int ret = 0; puts (Erasing Nand.); /if (nand_erase(&nand_info0, CFG_ENV_OFFSET, CFG_ENV_SIZE)if (nand_legacy_erase(nand_dev_desc + 0, CFG_ENV_OFFSET, CFG_ENV_SIZE, 0) return 1; puts (Writing to Nand. ); total = CFG_ENV_SIZ
17、E; /ret = nand_write(&nand_info0, CFG_ENV_OFFSET, &total, (u_char*)env_ptr);ret = nand_legacy_rw(nand_dev_desc + 0,0x00 | 0x02, CFG_ENV_OFFSET, CFG_ENV_SIZE,&total, (u_char*)env_ptr); if (ret | total != CFG_ENV_SIZE) return 1; puts (donen); return ret;.#else /* ! CFG_ENV_OFFSET_REDUND */* The legacy
18、 NAND code saved the environment in the first NAND device i.e.,* nand_dev_desc + 0. This is also the behaviour using the new NAND code.*/void env_relocate_spec (void)#if !defined(ENV_IS_EMBEDDED) ulong total; int ret; total = CFG_ENV_SIZE; /ret = nand_read(&nand_info0, CFG_ENV_OFFSET, &total, (u_cha
19、r*)env_ptr); ret = nand_legacy_rw(nand_dev_desc + 0, 0x01 | 0x02, CFG_ENV_OFFSET, CFG_ENV_SIZE, &total, (u_char*)env_ptr);(8)在/board/tc2410/tc2410.c文件的末尾添加对Nand Flash 的初始化函数(在后面Nand Flash的操作都要用到)u-boot运行至第二阶段进入start_armboot()函数。其中nand_init()函数是对nand flash的最初初始化函数。Nand_init()函数在两个文件中实现。其调用与CFG_NAND_L
20、EGACY宏有关,如果没有定义这个宏,系统调用 drivers/nnd/nand.c中的nand_init();否则调用board/smdk2410/smdk2410.c中的nand_init()函数。这里我选择第二种方式。#if (CONFIG_COMMANDS & CFG_CMD_NAND)typedef enum NFCE_LOW,NFCE_HIGH NFCE_STATE;static inline void NF_Conf(u16 conf)S3C2410_NAND * const nand = S3C2410_GetBase_NAND();nand-NFCONF = conf;sta
21、tic inline void NF_Cmd(u8 cmd)S3C2410_NAND * const nand = S3C2410_GetBase_NAND();nand-NFCMD = cmd;static inline void NF_CmdW(u8 cmd)NF_Cmd(cmd);udelay(1);static inline void NF_Addr(u8 addr)S3C2410_NAND * const nand = S3C2410_GetBase_NAND();nand-NFADDR = addr;static inline void NF_SetCE(NFCE_STATE s)S3C2410_NAND * const nand = S3C2410_GetBase_NAND();switch (s) case NFCE_LOW:nand-NFCONF &= (1NFCONF |= (1NFSTAT & (1NFDATA = data;static inline u8 NF_Read(void)S3C2410_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1