l 注:如果第一次修改后编译没有在processor.h中出错,而在examples目录出错,认真检查以上修改(修改的内容不正确),并在examples目录中运行touch命令(不运行touch还会出错,可能uboot Makefile没有写好,没查原因),再编译。 生成最基本的u-boot, 没有功能,只能起动 l 修改程序连接地址: 在board/s3c2410中有一个config.mk文件,用于设置程序连接的起始地址,因为会在u-boot中增加功能,所以留下6M的空间,修改33F80000为33A00000。 l 为了以后能用uboot的GO命令执行修改过的用loadb或tftp下载的u-boot:在board/s3c2410的memsetup.S中标记符”0:”上加入五句: l mov r3, pc l ldr r4, =0x3FFF0000 l and r3, r3, r4 //以上三句得到实际起动的内存地址 l aad r0, r0, r3 //用GO命令调试uboot时,启动地址在RAM l add r2, r2, r3 //把初始化内存信息的地址,加上实际起动地址 u 0标记符0, 原来存在的标记符) l 用SJF软件通过jtag口下载编译的u-boot, 启动!读取环境块时CRC出错,然后进入SMDK#。 l 把MIZI vivi中的PrintHexWord, PrintWord拷过来, 这样可以在调试汇编时可以打印一些信息,但其中有的PrintHexNibble中有缺陷,ldr r0, [r2, r0] 应改为ldrb r0, [r2, r0],这样可以在四字节对齐的系统中使用。 INTEL nor flash操作功能 l INTEL 的28F128,在board目录中找到CMI主板有此FLASH,把cmi中flash.c拷到s3c2410目录代换原来的flash.c。 l cmi中的flash.c在写入时要交换字节,所以删除它的write_short()和wirte_buff()函数,把ep7312主板目录中flash.c的wirte_word()和wirite_buff()函数复制过来。把flash.c中的FLASH_BASE0_PRELIM改为CFG_FLASH_BASE。把FLASH_BLOCK_SIZE改为0x20000,(E28F128J3A flash中块的大小是128K)。 l 把s3c2410.h中的flash内容由原来的: 1. #define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */ 2. #define CFG_FLASH_BASE PHYS_FLASH_1 3. #define CONFIG_AMD_LV400 1 4. #if 0 5. #define CONFIG_AMD_LV800 1 6. #endif 7. #define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */ 8. #ifdef CONFIG_AMD_LV800 9. #define PHYS_FLASH_SIZE 0x00100000 /* 1MB */ 10. #define CFG_MAX_FLASH_SECT (19) /* max number of sectors on one chip */ 11. #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x0F0000) /* addr of environment */ 12. #endif 13. #ifdef CONFIG_AMD_LV400 14. #define PHYS_FLASH_SIZE 0x00080000 /* 512KB */ 15. #define CFG_MAX_FLASH_SECT (11) /* max number of sectors on one chip */ 16. #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x070000) 改为: 1. #define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */ 2. #define PHYS_FLASH_SIZE 0x01000000 /* 16 MB */ 3. ##define CFG_FLASH_PROTECTION 4. define CFG_FLASH_BASE PHYS_FLASH_1 5. #define CFG_MONITOR_BASE PHYS_FLASH_1 6. #define CFG_MAX_FLASH_BANKS 1/* max number of memory banks */ 7. #define CFG_MAX_FLASH_SECT 128/* max number of sectors on one chip */ 8. #define CFG_FLASH_ERASE_TOUT (2*CFG_HZ) /* Timeout for Flash Erase */ 9. #define CFG_FLASH_WRITE_TOUT (2*CFG_HZ) /* Timeout for Flash Write */ 10. #define CFG_ENV_IS_IN_FLASH 1 11. #define CFG_ENV_ADDR (PHYS_FLASH_1 + 0x60000) 12. #define CFG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */ l 把cmd_mem.c中的cmd_get_data_size函数的default_size全改为1, 默认以字节显示,更直观,并且不会出现地址对齐错(data abort)。而在do_mem_mw()及mod_mem()中加入: if(addr2info(addr) != NULL) { printf(“can’t wirte or modify in flash! Use cp instead.\n”); return 0; } 以使mw和mm命令不能修改flash中的数据,而只开放cp修改flash中的数据。 l 改board/s3c2410/flash.c中的flash_erase(),把start = get_timer(0)移到for(), 以去掉flash_erase timeout 错误。 设置FLASH和SDRAM时序 根据28F128J3A-150,这是一150ns的flash, 所以把flash时序设为最慢。把s3c2410设成202.8MHZ, 并且工作在异步模式, 修改memsetup.S。
|