ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:21.40KB ,
资源ID:8522786      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8522786.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于s3c2410的uboot120的分析以及移植下篇.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于s3c2410的uboot120的分析以及移植下篇.docx

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