




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一步打开u-boot主目录下的Makefile找到smdk2410_config仿照他的格式加上一下语句:ylp2440_config : unconfig $(MKCONFIG) $(:_config=) arm arm920t ylp2440 NULL s3c24x0各顶的意思如下:arm : CPU 的构架(ARCH)arm920t: CPU的类型(CPU),其对应于 cpu/arm920t 子目录。ylp2440: 开发板的型号(BOARD),对应于 board/ylp2440目录。NULL: 开发者/后经销商(vender)。s3c24x0 : 片上的系统(SOC)。此不是为了加入自己的开发板,也可以在现有的开发板基础上修改。找到 CROSS_COMPILE = arm-linux-修改 CROSS_COMPILE为自己的arm gcc编译器,也可以不用修改保存退出。在 board目录下建立自己的开发板 ylp2440目录 结构为 board/ylp2440。在 board目录下建立自己的开发板 ylp2440目录 结构为 board/ylp2440。然后,将smdk2410目录下的文件考入此目录中,并将其中的smdk2410.c改名为ylp2440.c同时还得修改 Makefile文件.COBJS := ylp2440.o flash.o.在 include/configs目录下建立头文件将smd2410.h复制一份在相同目录下。并改名为ylp2440.h回到u-boot主目录 , make ylp2440_config,在make,编译生成u-boot.bin成功。第二步第一阶段 :支持2440打开 cpu/arm920t/start.S删除下面这行:#include /*这是针对 AT91RM9200DK 开发板的,删掉*/增加变量定义:.globl _bss_end_bss_end: .word _end .globl PreLoadedONRAMPreLoadedONRAM: .word 0.说明:这个变量用来在通过ViVi 或OpenOCD等工具将U-boot直接下到内存运行后,能在U-boot运行出现菜单和引导kernel前将U-boot停下来。这个变量在这里定义为 0,如果将U-boot直接下到内存中运行,这个值会在后面被修改为1,在 Main.c 文件的 main_loop()函数中,如果检测到这个值为1,就会打印一段向导,然后跳出这个函数,进行死循环。继续删除下面的几行:这是针对AT91RM9200DK开发板的 bl coloured_LED_init bl red_LED_on#if defined(CONFIG_AT91RM9200DK) | defined(CONFIG_AT91RM9200EK)|defined(CONFIG_AT91RM9200DF) /* * relocate exception table */ ldr r0, =_start ldr r1, =0x0 mov r2, #16copyex: subs r2, r2, #1 ldr r3, r0, #4 str r3, r1, #4 bne copyex#endif接下来一段修改为:S3C2440的中断寄存器有改变,设置中断寄存器 /* turn off the watchdog */#if defined(CONFIG_S3C2400)# define pWTCON 0x15300000# define INTMSK 0x14400008 /* Interupt-Controller base addresses */# define CLKDIVN 0x14800014 /* clock divisor register */#elif defined(CONFIG_S3C2410) # define pWTCON 0x53000000# define INTMOD 0X4A000004 /* add for S3C2440 */# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */# define INTSUBMSK 0x4A00001C# define CLKDIVN 0x4C000014 /* clock divisor register */#endif继续,关开门狗和中断#if defined(CONFIG_S3C2400) | defined(CONFIG_S3C2410) /* 新加,因为上面去掉了这行 */ ldr r0, =pWTCON mov r1, #0x0 str r1, r0 /* * mask all IRQs by setting all bits in the INTMR - default */ mov r1, #0xffffffff ldr r0, =INTMSK str r1, r0# if defined(CONFIG_S3C2410) ldr r1, =0x3ff ldr r0, =INTSUBMSK str r1, r0# endif#if 0 /* 将时钟的修改去掉了,在后面的函数中修改 */ /* FCLK:HCLK:PCLK = 1:2:4 */ /* default FCLK is 120 MHz ! */ ldr r0, =CLKDIVN mov r1, #3 str r1, r0#endif#endif /* CONFIG_S3C2400 | CONFIG_S3C2410 */继续,CPU初始化.#ifndef CONFIG_SKIP_LOWLEVEL_INIT bl cpu_init_crit#endif说明:以前版本中这个地方会先判断U-boot是否在运行地址中,如果是就不进行CPU的初始化,现在改为任何时候都进行CPU的初始化了。删除 #ifndef CONFIG_AT91RM9200 以及其对应的 #endif,将下面设置堆栈的一段剪切来这里: /* Set up the stack */stack_setup: ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */ sub r0, r0, #CFG_MALLOC_LEN /* malloc area */ sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */#ifdef CONFIG_USE_IRQ sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)#endif sub sp, r0, #12 /* leave 3 words for abort-stack */设置好堆栈后,可以用C代码来设置时钟了。添加代码如下:这段C代码后面给出。#ifndef CONFIG_SKIP_LOWLEVEL_INIT bl clock_init#endif 到这里为止,完成的工作有:1:CPU进入管理模式;2:关看门狗和中断;3:CPU的初始化4:堆栈设置5:时钟的初始化至此,初始化工作告一段落,要搬运代码到内存中了(U-boot的运行地址),代码如下:#ifndef CONFIG_SKIP_RELOCATE_UBOOTrelocate: /* relocate U-Boot to RAM */. 如果代码已经在运行地址了,则不应该进行代码搬运,而直接跳到后面的代码运行,由于我们已经在前面设置了堆栈,设置堆栈的label到这段代码的前面去了,所以将跳转改为下面的label即可。. cmp r0, r1 /* dont reloc during debug */ beq clear_bss /* 原来这里为 stack_setup */.由于已经设置好了堆栈,可以采用直接读取NAND Flash的C语言代码来搬运代码,从而达到能从NAND Flash启动的目的。原来的汇编代码只能从NOR Flash搬运代码。修改的代码如下:. ldr r2, _armboot_start ldr r3, _bss_start sub r2, r3, r2 /* r2 - size of armboot */#if 1 bl CopyCode2Ram /* r0: source, r1: dest, r2: size */#else /* 下面的这部分代码被注释掉了 */ 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添加对 PreLoadedONRAM 的修改,如果直接在内存中运行,则将值修改为1:.clbss_l:str r2, r0 /* clear loop. */ add r0, r0, #4 cmp r0, r1 ble clbss_lSetLoadFlag: /* Set a global flag, PreLoadedONRAM */ adr r0, _start /* r0 LOCKTIME = 0xFFFFFF; /* configure MPLL */ clk_power-MPLLCON = (M_MDIV 12) + (M_PDIV UPLLCON = (U_M_MDIV 12) + (U_M_PDIV bd-bi_arch_number = MACH_TYPE_SMDK2410; else /* arch number of SMDK2440-Board */ gd-bd-bi_arch_number = MACH_TYPE_S3C2440; /* 782; */ /* adress of boot parameters */ gd-bd-bi_boot_params = 0x30000100; icache_enable();#if 0 dcache_enable();#endifsmdk2440.c修改完成。4):smdk2440目录修改:前面在Start.S中调用的C函数 clock_init 和 CopyCode2RAM 在新添加的文件 boot_init.c中,把这个文件放到这个目录,同时修改本目录下的makefile和u-boot.lds脚本。makefile修改:.COBJS := smdk2440.o flash.o.去掉flash.o,因为使用CFI接口的NOR Flash。,添加boot_init.o 。u-boot.lds修改:添加boot_init.o到text段的前面,修改后如下:. cpu/arm920t/start.o (.text) board/smdk2440/boot_init.o (.text).修改完成。第2阶段:u-boot移植dm9000的网卡驱动u-boot自带网卡驱动,所以只要做些设置即可。在 include/configs/smdk2440.h 中注释掉CS8900网口,添加DM9000网口驱动配置,如下:.#if 0#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */#define CS8900_BASE 0x19000300#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */#endif#if !defined(CONFIG_DRIVER_CS8900)#define CONFIG_DRIVER_DM9000 1#define CONFIG_DM9000_USE_16BIT 1#define CONFIG_DM9000_BASE 0x20000000#define DM9000_IO 0x20000000 #define DM9000_DATA 0x20000004#endif.将相关IP设置的注释去掉,并修改IP设置,顺便修改下启动参数的宏设置,如下:.#define CONFIG_BOOTDELAY 3#define CONFIG_BOOTARGS noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0#define CONFIG_ETHADDR 08:00:3e:26:0a:5b #define CONFIG_NETMASK #define CONFIG_IPADDR 8#define CONFIG_SERVERIP 60/*#define CONFIG_BOOTFILE elinos-lart */#define CONFIG_BOOTCOMMAND nand read 0x30007FC0 kernel; bootm 0x30007FC0.在网卡驱动中,drivers/net/dm9000.c,有一段程序试图连接网卡的MII接口,而实际MII接口并未使用,会有十秒的等待时间,然后报错,可以将此段程序注释掉。第3阶段:移植nand flash驱动首先,要说明一下 CFG_NAND_LEGACY 的使用。在u-boot的 drivers/mtd/下有两个目录,分别是nand和nand_legacy。在nand目录下的是nand的初始化函数和nand的操作读写函数,是使用linux的mtd构架。此目录下的文件,只有在定义了CFG_CMD_NAND宏和没有定义CFG_NAND_LEGACY宏的情况下才会被编译。在nand_leagcy目录下的文件也是是实现nand相关操作命令,如read,write等命令的功能,但不是使用linux的mtd构架。此目录下的文件,只有在定义了CFG_CMD_NAND和定义了CFG_NAND_LEGACY宏的情况下才会定义。此目录下的文件u-boot已不推荐使用。在本移植过程中采用不定义CFG_NAND_LEGACY的方式。1):在/include/configs/smdk2440.h 添加命令支持,如下:.#define CONFIG_CMD_ELF#define CONFIG_CMD_NAND /* 添加NAND falsh命令 */.同时添加nand flash参数设置。如下:/*- * NAND flash settings */#define CFG_NAND_BASE 0 /* NAND控制器基地址*/#define CFG_MAX_NAND_DEVICE 1 /* 最大nand flash设备数 */#define NAND_MAX_CHIPS 1 /* nand flash芯片数*/#define SECTORSIZE 512 /* 1页的大小 */#define ADDR_COLUMN 1 /* Column地址为1个字节 */#define ADDR_PAGE 3 /* 页块地址为3个字节 */#define ADDR_COLUMN_PAGE 4 /* 总地址为4字节 */#define NAND_ChipID_UNKNOWN 0x00 /* 未知芯片的ID号 */#define NAND_MAX_FLOORS 1 /* nand 最大层数 */#define CONFIG_MTD_NAND_VERIFY_WRITE 1 /* 进行写入校验 */.2):Nand 的初始化顺序为:lib_arm/board.c中start_armboot() - drivers/mtd/nand/nand.c中nand_init() -nand_init_chip() - cpu/arm920t/s3c24x0/nand.c中board_nand_init()完成Nand Flash的初始化。drivers/mtd/nand/nand.c中nand_init() - drivers/mtd/nand/nand_base.c中nand_scan() - nand_scan_ident() - nand_set_defaults()nand_scan_ident() - nand_get_flash_type() drivers/mtd/nand/nand_base.c中nand_scan() - nand_scan_tail()nand_scan_ident() :Nand Flash设备扫描。nand_scan_tail() :在nand_scan()中调用,用于填充所有的初始化函数指针和扫描坏块表是否适当。说明:此版的u-boot已自带board_nand_init(),此函数在/cpu/arm920t/s3c24x0/nand.c中实现。分析nand.c可以发现如果定义宏CFG_NAND_LEGACY,则直接报 #error U-Boot legacy NAND support not available for S3C2410的错误。因为S3C2410和S3C2440在FLASH控制器上,差别较大,驱动代码需要改写。改写主要在/cpu/arm920t/s3c24x0/nand.c中进行。实话实说,这个nand.c实现的比较糟糕,依葫芦画瓢,为S3C2440写个驱动。/cpu/arm920t/s3c24x0/nand.c修改过程:先加入S3C2440 NAND flash控制器的地址定义,修改后如下:.#if !defined(CONFIG_S3C2440)#define NF_BASE 0x4e000000#define NFCONF _REGi(NF_BASE + 0x0)#define NFCMD _REGb(NF_BASE + 0x4)#define NFADDR _REGb(NF_BASE + 0x8)#define NFDATA _REGb(NF_BASE + 0xc)#define NFSTAT _REGb(NF_BASE + 0x10)#define NFECC0 _REGb(NF_BASE + 0x14)#define NFECC1 _REGb(NF_BASE + 0x15)#define NFECC2 _REGb(NF_BASE + 0x16)#else #define NF_BASE 0x4e000000#define NFCONF _REGi(NF_BASE + 0x0)#define NFCONT _REGi(NF_BASE + 0x4)#define NFCMD _REGb(NF_BASE + 0x8)#define NFADDR _REGb(NF_BASE + 0xc)#define NFDATA _REGb(NF_BASE + 0x10)#define NFMECCD0 _REGi(NF_BASE + 0x14)#define NFMECCD1 _REGi(NF_BASE + 0x18)#define NFSECCD _REGi(NF_BASE + 0x1C)#define NFSTAT _REGb(NF_BASE + 0x20)#define NFSTAT0 _REGi(NF_BASE + 0x24)#define NFSTAT1 _REGi(NF_BASE + 0x28)#define NFMECC0 _REGi(NF_BASE + 0x2C)#define NFMECC1 _REGi(NF_BASE + 0x30)#define NFSECC _REGi(NF_BASE + 0x34)#define NFSBLK _REGi(NF_BASE + 0x38)#define NFEBLK _REGi(NF_BASE + 0x3c)#define S3C2440_NFCONT_nCE (1IO_ADDR_W值改写了,导致在写数据时出现错误。解决方法是使用一全局变量代替 chip-IO_ADDR_W。在 s3c2410_hwcontrol 函数上一行定义这个全局变量,然后修改 s3c2410_hwcontrol 函数,让它支持 S3C2440,修改后如下:.static void s3c2410_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl) struct nand_chip *chip = mtd-priv; DEBUGN(hwcontrol(): 0x%02x 0x%02xn, cmd, ctrl); #if !defined(CONFIG_S3C2440) if (ctrl & NAND_CTRL_CHANGE) /* ulong IO_ADDR_W = NF_BASE; */ IO_ADDR_W = NF_BASE; if (!(ctrl & NAND_CLE) IO_ADDR_W |= S3C2410_ADDR_NCLE; if (!(ctrl & NAND_ALE) IO_ADDR_W |= S3C2410_ADDR_NALE; /* chip-IO_ADDR_W = (void *)IO_ADDR_W; */ /* BUG , delete */ if (ctrl & NAND_NCE) NFCONF &= S3C2410_NFCONF_nFCE; else NFCONF |= S3C2410_NFCONF_nFCE; if (cmd != NAND_CMD_NONE) /* writeb(cmd, chip-IO_ADDR_W);*/ writeb(cmd,(void *)IO_ADDR_W); #else if (ctrl & NAND_CTRL_CHANGE) IO_ADDR_W = NF_BASE; if (!(ctrl & NAND_CLE) IO_ADDR_W |= S3C2440_ADDR_NALE; if (!(ctrl & NAND_ALE) IO_ADDR_W |= S3C2440_ADDR_NCLE; /* chip-IO_ADDR_W = (void *)IO_ADDR_W; */ if (ctrl & NAND_NCE) NFCONT &= S3C2440_NFCONT_nCE; else NFCONT |= S3C2440_NFCONT_nCE; if (cmd != NAND_CMD_NONE) writeb(cmd,(void *)IO_ADDR_W); #endif.board_nand_init 修改后如下:. clk_power-CLKCON |= (1 IO_ADDR_R = nand-IO_ADDR_W = (void *)0x4e00000c; /* read_buf and write_buf are default */ /* read_byte and write_byte are default */ /* hwcontrol always must be implemented */ nand-cmd_ctrl = s3c2410_hwcontrol; nand-dev_ready = s3c2410_dev_ready; #else DEBUGN(CONFIG_S3C2440n); twrph0 = 4; twrph1 = 2; tacls = 0; cfg = (tacls12)|(twrph08)|(twrph14); NFCONF = cfg; cfg = (16)|(14)|(01)|(1IO_ADDR_R = nand-IO_ADDR_W = (void *)0x4e000010; /* read_buf and write_buf are default */ /* read_byte and write_byte are default */ /* hwcontrol always must be implemented */ nand-cmd_ctrl = s3c2410_hwcontrol; nand-dev_ready = s3c2410_dev_ready; #endif.为了显示芯片型号,将drivers/mtd/nand/nand_base.c中的 nand_get_flash_type 函数结尾,修改 MTDDEBUG 为 printf.3):在Nand Flash中保存 u-boot 参数,(saveenv 功能)/include/configs/smdk2440.h 修改如下:.#define CONFIG_CMD_NAND#define CONFIG_CMD_ENV /* 添加saveenv命令的支持 */./* #define CONFIG_ENV_IS_IN_FLASH 1 */#define CONFIG_ENV_IS_IN_NAND 1#define CONFIG_ENV_OFFSET 0x40000 /* 参数在Nand Flash中的起始位置,为256K */#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector,128K */.为支持S3C2440的NAND Flash功能添加:#define CONFIG_S3C2440 1 /* support S3C2440 */第4阶段:u-boot支持烧写yaffs映像文件1):在/common/cmd_nand.c中do_nand函数中,加入代码,实现对nand write.yaffs命令的支持。在对jffs2操作的下面加入,如下:. if (!s | !strcmp(s, .jffs2) | !strcmp(s, .e) | !strcmp(s, .i) . else if(s != NULL & !strcmp(s, .yaffs) if(read) printf(nand read.yaffs is not provide!); else nand-writeoob = 1; ret = nand_write_skip_bad(nand,off,&size,(u_char *)addr); nand-writeoob = 0; .在 nand 的命令中加入对 nand write.yaffs 的描述,加入如下3行:.U_BOOT_CMD(nand, 5, 1, do_nand,. to/from memory address addr, skipping bad blocks.n nand write.yaffs - addr off|partition sizen write size bytes starting at offset offn to/from yaffs image in memory address addr, skipping bad blocks.n nand erase clean off size - erase size bytes fromn.2):在include/linux/mtd/mtd.h的 mtd_info 结构体定义中加入两个变量如下:.struct mtd_info u_char writeoob; u_char skipfirstblock;.3):在drivers/mtd/nand/nand_util.c的nand_write_skip_bad函数中加两段程序,一段是为了计算正常数据的长度,一段是为了在写入一段数据后,数据指针能正常跳到下一段数据,修改后如下:.int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length, u_char *buffer) int rval; size_t left_to_write = *length; size_t len_incl_bad; u_char *p_buffer = buffer; if(nand-writeoob=1) size_t oobsize = nand-oobsize; size_t datasize = nand-writesize; int datapages = 0; if (*length)%(nand-oobsize+nand-writesize) != 0) printf (Attempt to write error length data!n); return -EINVAL; datapages = *length/(datasize+oobsize); *length = datapages*datasize; left_to_write = *length; nand-skipfirstblock=1; /* Reject writes, which are not page aligned */ if (offset & (nand-writesize - 1) != 0 | (*length & (nand-writesize - 1) != 0) printf (Attempt to write non page aligned datan); return -EINVAL; len_incl_bad = get_len_incl_bad (nand, offset, *length); if (offset + len_incl_bad) = nand-size) printf (Attempt to write outside the flash arean); return -EINVAL; /*if (len_incl_bad = *length) rval = nand_write (nand, offset, length, buffer); if (rval != 0) printf (NAND write to offset %x failed %dn, offset, rval); return rval; */ while (left_to_write 0) size_t block_offset = offset & (nand-erasesize - 1); size_t write_size; if (nand_block_isbad (nand, offset & (nand-erasesize - 1) printf (Skip bad block 0x%08xn, offset & (nand-erasesize - 1); offset += nand-erasesize - block_offset; continue; if(nand-skipfirstblock=1) nand-skipfirstblock=0; printf (Skip the first good
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑工程电梯安装施工方案
- 2025秋季学期国开电大法律事务专科《刑法学(2)》期末纸质考试名词解释题库珍藏版
- 各类建筑施工安全防护方案
- 研学基地团队协作与合作能力培养方案
- 幕墙施工现场安全与环境管理方案
- 水电站防汛应急知识培训课件
- 正常人体解剖学躯干骨的骨性标志88课件
- 脂溶性维生素维生素D86课件
- 二零二五年度建筑废弃物资源化承包合同范本
- 2025版能源行业设备采购代理合同
- GB/T 43137-2023土方机械液压破碎锤术语和商业规格
- 京东集团员工手册-京东
- 2023年苏州市星海实验中学小升初分班考试数学模拟试卷及答案解析
- GB/T 37915-2019社区商业设施设置与功能要求
- GB/T 31298-2014TC4钛合金厚板
- GB/T 27746-2011低压电器用金属氧化物压敏电阻器(MOV)技术规范
- GB/T 22237-2008表面活性剂表面张力的测定
- GB/T 13667.3-2003手动密集书架技术条件
- 导轨及线槽项目投资方案报告模板
- 复旦大学<比较财政学>课程教学大纲
- 书法的章法布局(完整版)
评论
0/150
提交评论