uboot 在 ARM s3c2410 上移植过程.doc

上传人:土8路 文档编号:9979891 上传时间:2021-04-08 格式:DOC 页数:21 大小:102.50KB
返回 下载 相关 举报
uboot 在 ARM s3c2410 上移植过程.doc_第1页
第1页 / 共21页
uboot 在 ARM s3c2410 上移植过程.doc_第2页
第2页 / 共21页
uboot 在 ARM s3c2410 上移植过程.doc_第3页
第3页 / 共21页
uboot 在 ARM s3c2410 上移植过程.doc_第4页
第4页 / 共21页
uboot 在 ARM s3c2410 上移植过程.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《uboot 在 ARM s3c2410 上移植过程.doc》由会员分享,可在线阅读,更多相关《uboot 在 ARM s3c2410 上移植过程.doc(21页珍藏版)》请在三一文库上搜索。

1、uboot 在 ARM s3c2410 上移植过程总述u-boot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序,在LINUX下可以通过CVS来得到当前正在开发的u-boot软件。当前版本号:u-boot 1.0.2,见include/version.h中的定义。#cvs dserver::/cvsroot/u-boot login#cvs z3 d server::/cvsroot/u-boot checkout P u-boot本文讲述S3C2410中u-boot的移植过程:S3C2410的硬件配置是:l CPU:S3C2410l NOR: 16M,INTEL EP

2、28F128J3Al SDRAM:64M, MICRON 48LC16M16A2-75 Bl DM9000AVICOM (10/100M) 网卡l USB HOST一个配置自已的主板l 阅读Makefile文件,在Makefile文件中添加两行:s3c2410_config: unconfig ./mkconfig $(:_config=) arm arm920t s3c2410其中ARM是CPU的种类, arm920t是ARM CPU对应的代码目录,s3c2410是自已主板对应的目录。l 在board目录中建立s3c2410目录,复制smdk2410目录中的内容(cp smdk2410/*

3、s3c2410)。l 在include/configs/目录下复制smdk2410.h(cp smdk2410.h s3c2410.h)l 修改ARM编译器的目录名及前缀本人ARM编译器的目录是在:/opt/host/armv4l/bin/armv4l-unknown-linux-把CROSS-COMPILE = arm-linux- 改为实际目录:如CROSS-COMPILE = /opt/host/armv4l/bin/arm4l-unknown-linux-l 完成之后,可以测试一下你的配置: #make s3c2410_config #make 编译应该在processor.h中出错l

4、 修改processor.h中:union debug_insnu32 arm;u16 thumb;修改成:union debug_insnu32 arm_mode;u16 thumb_mode; l 编译成功,编译好的程序同smdk2410一样。l 注:如果第一次修改后编译没有在processor.h中出错,而在examples目录出错,认真检查以上修改(修改的内容不正确),并在 examples目录中运行touch命令(不运行touch还会出错,可能uboot Makefile没有写好,没查原因),再编译。生成最基本的u-boot, 没有功能,只能起动l 修改程序连接地址:在board/s

5、3c2410中有一个config.mk文件,用于设置程序连接的起始地址,因为会在u-boot中增加功能,所以留下6M的空间,修改33F80000为33A00000。l 为了以后能用uboot的GO命令执行修改过的用loadb或tftp下载的u-boot:在board/s3c2410的memsetup.S中标记符”0:”上加入五句:l mov r3, pcl ldr r4, =0x3FFF0000l and r3, r3, r4 /以上三句得到实际起动的内存地址l aad r0, r0, r3 /用GO命令调试uboot时,启动地址在RAMl add r2, r2, r3 /把初始化内存信息的地

6、址,加上实际起动地址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目录代换

7、原来的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

8、 #1 */2. #define CFG_FLASH_BASE PHYS_FLASH_13. #define CONFIG_AMD_LV400 1 4. #if 05. #define CONFIG_AMD_LV800 1 6. #endif 7. #define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */8. #ifdef CONFIG_AMD_LV8009. #define PHYS_FLASH_SIZE 0x00100000 /* 1MB */10. #define CFG_MAX_FLASH_SECT (19) /* m

9、ax number of sectors on one chip */11. #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x0F0000) /* addr of environment */12. #endif13. #ifdef CONFIG_AMD_LV40014. #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

10、(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_PROTECTION4. define CFG_FLASH_BASE PHYS_FLASH_15. #define CFG_MONITOR_BASE PHYS_FLASH_16. #define CFG_MAX_FLASH_BANKS 1/* max number of memory ba

11、nks */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 111. #define CFG_ENV_ADDR (PHYS_FLASH_1 + 0x20

12、000)12. #define CFG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */ CFG_ENV_ADDR+CFG_ENV_SIZE不能超过linux内核启动的起始地址!l 把cmd_mem.c中的cmd_get_data_size函数的default_size全改为1, 默认以字节显示,更直观,并且不会出现地址对齐错(data abort)。而在do_mem_mw()及mod_mem()中加入:if(addr2info(addr) != NULL)printf(“cant wirte or modify in flash!

13、 Use cp instead. ”);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。 实现网卡功能本人的网卡是DM9000,在uboot中没

14、有相应的驱动,所以自已写了一个网卡驱动。1. 把驱动拷到drivers/dm9000.c2. 在drivers/Makefile中加入dm9000.o3. 在lib_arm/board.c中修改CS8900=DM90004. 在include/configs/s3c2410中加入以下几句#define CONFIG_DRIVER_DM9000 1 /* we have a CS8900 on-board */#define DM9000_BASE 0x08000000#define DM9000_BUS16 1 /* the Linux driver does accesses as shor

15、ts */#define CONFIG_ETHADDR 08:00:3e:26:0a:5b #define CONFIG_NETMASK 255.255.255.0#define CONFIG_IPADDR 192.168.2.120#define CONFIG_SERVERIP 192.168.2.122 实现USB功能1. 在include/configs/s3c2410中的CONFIG_COMMANDS中加入:l CFG_CMD_USB |l CFG_CMD_FAT |2. 并在文件中加入以下设置:l #define CONFIG_USB_OHCI l #define CONFIG_US

16、B_STORAGEl #define CONFIG_USB_KEYBOARDl #define CONFIG_DOS_PARTITIONl #define CFG_DEVICE_DEREGISTERl #define CONFIG_SUPPORT_VFATl #define LITTLEENDIAN3. 这时usb start 和 usb info等功能正常,而其它一些功能不正常。4. 功能fatls 不正常,修改fs/fat/fat.cl 没有把VFAT的UNICODE字符转换过来,加入UNICODE字符转换函数。Uni2ansi(), 增加slot2str()的cp936版, 增加一个to

17、short()。l 加入#define cp936l 在fat_getenv()中有一个对齐错误,修改fat.h使fatbuff字对齐。l 在do_fat_read()中加入两句,以消除列根目录错误。l 在board/cmd_fat.c中加入两句,以消除没有usb storage设备时的错误:if(!dev_desc)printf(“Not init storage usb device: usb start usb info usb scan ”);5. 修改fs/fat/fat.cget_cluster()函数中加入 if(size / FS_BLOCK_SIZE 0), 以防读文件时不能

18、成功读出。引导LINUX现在我们可以引导LINUX了。l 要引导bzip2的linux核,把CFG_MALLOC_SIZE改为大于4Ml 把编译好的LINUX内存,通过uboot/tools/mkp_w_picpath转换成uboot格式1. mkp_w_picpath -A arm -O linux -T kernel -C bzip2 -a 30000000 -e 30008000 -n linux kernel -d vmlinux1.bz2 c2. mkp_w_picpath -A arm -O linux -T kernel -C gzip -a 30000000 -e 300080

19、00 -n linux kernel -d vmlinux.gz b3. mkp_w_picpath -A arm -O linux -T ramdisk -C gzip -a 0 -e 0 -n init ramdisk -d ramdisk.p_w_picpath.gz ramdiskl 在include/configs/s3c2410.h中加入:1. #define CONFIG_BOOTARGS initrd=0x30800000,0x200000 root=/dev/ram init=/linuxrc console=ttyS0,1152002. #define CONFIG_BOO

20、TFILE vmlinux_for_uboot.gz 3. #define CONFIG_BOOTCOMMAND bootm 0x80000 0x1a00000x80000为内核在flash中的位置。0x1a0000为ramdisk.p_w_picpath.gz在flash中的内容。4. #define CFG_LOAD_ADDR 0x30800000 /* default load address */l 在lib_arm/armlinux.c的do_bootm_linux中加入:1. memcpy (char *)CFG_LOAD_ADDR, (char *)data, len);2. d

21、ata = CFG_LOAD_ADDR;把ramdisk复制到0x30800000位置的RAM中3. 定义以下配置,把信息传入LINUX核心的TAG区#define CONFIG_SETUP_MEMORY_TAGS#define CONFIG_INITRD_TAG#define CONFIG_CMDLINE_TAG 常用U-BOOT命令介绍 1. ?得到所有命令列表2. help: help usb, 列出USB功能的使用说明3. ping:注:只能开发板PING别的机器4. setenv: 设置互环境变量:5. setenv serverip 192.168.0.16. setenv ipa

22、ddr 192.168.0.567. setenv bootcmd tftp 32000000 vmlinux; kgo 320000008. saveenv: 保存环境变量9. 在设置好环境变量以后, 保存变量值10. tftp: tftp 32000000 vmlinux, 把server(IP=环境变量中设置的serverip)中/tftpdroot/ 下的vmlinux通过TFTP读入到物理内存32000000处。11. kgo: 起动没有压缩的linux内核,kgo 3200000012. bootm:起动UBOOT TOOLS制作的压缩LINUX内核, bootm 32000001

23、3. protect: 对FLASH进行写保护或取消写保护, protect on 1:0-3(就是对第一块FLASH的0-3扇区进行保护),protect off 1:0-3取消写保护14. erase: 删除FLASH的扇区, erase 1:0-2(就是对每一块FLASH的0-2扇区进行删除)15. cp: 在内存中复制内容, cp 32000000 0 40000(把内存中0x32000000开始的0x40000字节复制到0x0处)16. mw: 对RAM中的内容写操作, mw 32000000 ff 10000(把内存0x32000000开始的0x10000字节设为0xFF)17.

24、md: 修改RAM中的内容, md 32000000(内存的起始地址)18. usb: l usb start: 起动usb 功能l usb info: 列出设备l usb scan: 扫描usb storage(u 盘)设备19. fatls:列出DOS FAT文件系统, 如:fatls usb 0列出第一块U盘中的文件20. fatload: 读入FAT中的一个文件,如:fatload usb 0:0 32000000 aa.txt21. 把USB中的aa.txt 读到物理内存0x32000000处!22. flinfo: 列出flash的信息23. loadb: 准备用KERMIT协议接

25、收来自kermit或超级终端传送的文件。24. nfs: nfs 32000000 192.168.0.2:aa.txt , 把192.168.0.2(LINUX 的NFS文件系统)中的NFS文件系统中的aa.txt 读入内存0x32000000处。首先声明本移植文档大部文来自韦东山大哥的一书,特此声明!。首先介绍一下开发板用的优龙的fs2410开发板。硬件资源有:BANK0外接容量为2M,位宽为16的NOR FLASH 芯片 SST39VF1601。BANK3外结10M网卡芯片CS8900A,位宽为16。通过NAND FLASH的控制器外接容量为64MB,位宽为8的NAND FLASH芯片k

26、9f1208u0m。BANK6外接两片容量为32MB,位宽为16的SDRAM芯片K4S561632,组成容量为64MB,位宽为32的内存。由于UBOOT的SMDK2410本身支持了NORFLASH AM29LV800,但我们的是SST39VF1601,这里我们可以直接修改这个文件,或者在源码里找到SST39VF1601的驱动。这里我们都尝试作一下。然后就是支持NAND FLASH的读写,和支持yaffs文件系统镜像的烧写。并支持xmodem协议。我们将在开发板SMDK2410的基础上进行移植1。新建一个开发板的相应目录和文件。为了不破坏源代码,将关于SMDK2410相关的文件和目录都拷贝一份。

27、并且设置好交叉编译器的环境变量。这里将board/smdk2410复制拷贝一份为board/fs2410。然后将board/fs2410/smdk2410.c文件修改为board/fs2410/fs2410.c,并将include/configs/smdk2410.h复制拷贝一份为include/configs/fs2410.h。修改顶层Makefile,添加如下两行:可以在:smdk2410_config : unconfig $(MKCONFIG) $(:_config=) arm arm920t smdk2410 NULL s3c24x0后添加:fs2410_config : uncon

28、fig $(MKCONFIG) $(:_config=) arm arm920t fs2410 NULL s3c24x0将:ifeq ($(ARCH),arm)CROSS_COMPILE = arm-linux-endif修改为:ifeq ($(ARCH),arm)CROSS_COMPILE = arm-softfloat-linux-gnu- (arm gcc 为3.4.5)endif然后修改board/fs2410/Makefile,修改如下:COBJS := smdk2410.o flash.o修改为:COBJS := fs2410.o flash.o2.修改SDRAM的配置SDRAM的

29、初始化在第一阶段完成,就是在board/fs2410/lowlevel_init.S文件中设置存储控制器。由于我们的SDRAM外接在BANK6上,所以检查一下BANK6的设置:位宽为32,宏 B6_BWSCON 为 (DW32),32位,另外还要根据HCLK设置SDRAM的刷新参数,主要是REFCNT寄存器。由于本开发板使用的HCLK为100MHz,需要SDRAM芯片的具体参数重新计算REFCNT的数值:#define REFCNT 1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */改为:(参考K4S561632手册“8192 refr

30、esh cycles / 64ms”可知刷新的周期为:7.8125us)#define REFCNT 1268 /* period=7.8125us, HCLK=100Mhz, (2048+1-7.8125*100) */对于BANK3外接了CS8900A,原来的配置是符合的,无须更改,而对于BANK1,BANK2,BANK4,BANK5,BANK7,没有使用,所以在UBOOT也不用关心。3。时钟的配置在board/fs2410/fs241.c的board_init函数,首先修改为异步总线模式:具体修改在clk_power-LOCKTIME = 0xFFFFFF;之前加上:_asm_ (mrc

31、 p15,0,r1,c1,c0,0n orr r1,r1,#0xc0000000n mcr p15,0,r1,c1,c0,0n :r1 ); 这里的设置在手册里说明了:如果HDIVN1,CPU的总线模式应该从the fast bus mode变为the asynchronous bus mode,可以通过上述指令完成,如果HDIVN1,而CPU的总线模式仍为the fast bus mode,则CPU的工作频率将自动变为HCLK,而不再是FCLK。4。串口的初始化在UBOOT的第二阶段lib_arm/board.c中start_armboot函数调用serial_init函数(cpu/arm9

32、20t/s3c24x0/serial.c)初始化串口时,会调用get_PCLK函数( cpu/arm920t/s3c24x0/speed.c),这里把时钟设置好就行了。如果你是在移植s3c2440,这个地方是需要修改的。主要频率是不一样的。 至此,编译执行make fs2410_config & make CROSS_COMPILE=arm-softfloat-linux-gnu-编译生成的u-boot.bin,下载到板子的NOR FLASH,就有答应信息了。下面介绍怎么样支持SST39VF1601 NOR FLASH和怎么样支持NAND FLASH的读写和支持串口xmodem协议。U-Boo

33、t 1.3.4 (Oct 30 2009 - 16:21:38)DRAM: 64 MBFlash: 512 kB* Warning - bad CRC, using default environmentIn: serialOut: serialErr: serialSMDK2410 # 5。支持NOR FLASH(SST39VF1601)现在还无法通过UBOOT的命令来烧写NOR FLASH,在配置文件include/configs/fs2410.h里默认的信号是AM29LV400,而我们的是SST39VF1601。修改如下(include/configs/fs2410.h):添加:#def

34、ine CONFIG_SST_39VF1601 1#define CFG_MAX_FLASH_BANKS 1 #define PHYS_FLASH_SIZE 0x200000 /* 2MB */#define CFG_MAX_FLASH_SIZE (512) /* max number of sectors on one chip */#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x40000) /* addr of environment */并将关于AM29LV400和AM29LV800的信息全部注释掉。NOR FLASH的操作函数在board/fs241

35、0/flash.c中实现。它支持AM29LV400和AM29LV800.为了了解NORFLASH的操作,我们直接修改这个文件。首先我们的板子已经有了一个UBOOT,但由于烧写的问题,我们这里启动一个调试方法,具体就是在配置文件include/configs/fs2410.h里定义:#define CONFIG_SKIP_LOWLEVEL_INIT,这个宏用于cpu/arm920t/start.S里,主要是对CPU和存储控制器的初始化,所以调试阶段跳过初始化。然后修改board/fs2410/config.mk:将TEXT_BASE = 0x33F80000暂时修改为:TEXT_BASE = 0

36、x33E00000。最后将u-boot.bin下载到这个地址,然后 从这个地址启动u-boot即可。修改以上步骤以后,接下来我们修改board/fs2410/flash.c:将:#define MAIN_SECT_SIZE 0x10000 /* 64 KB */修改为:#define MAIN_SECT_SIZE 0x1000 /* 4 KB */(按sector操作)将:#define MEM_FLASH_ADDR1 (*(volatile u16 *)(CFG_FLASH_BASE + (0x00000555 1)#define MEM_FLASH_ADDR2 (*(volatile u1

37、6 *)(CFG_FLASH_BASE + (0x000002AA 1)修改为:#define MEM_FLASH_ADDR1 (*(volatile u16 *)(CFG_FLASH_BASE + (0x000005555 1)#define MEM_FLASH_ADDR2 (*(volatile u16 *)(CFG_FLASH_BASE + (0x000002AAA 1)这个参数参看SST39VF1601的手册可以得到。在flash_init函数里仿照:if defined(CONFIG_AMD_LV400) (AMD_MANUFACT & FLASH_VENDMASK) | (AMD_

38、ID_LV400B & FLASH_TYPEMASK);添加对SST39VF1601厂商ID和DEVICE ID的设置:添加:#if defined (CONFIG_SST_39VF1601) (SST_MANUFACT & FLASH_VENDMASK) (SST_ID_xF1601 & FLASH_TYPEMASK);由于SST39VF1601每个SECTOR的大小都是一样的。所以修改:将:for (j = 0; j flash_infoi.sector_count; j+) if (j = 3) /* 1st one is 16 KB */ if (j = 0) flash_infoi.

39、startj = flashbase + 0; .修改为:for (j = 0; j flash_id & FLASH_VENDMASK) != (AMD_MANUFACT & FLASH_VENDMASK) return ERR_UNKNOWN_FLASH_VENDOR;修改为:if (info-flash_id & FLASH_VENDMASK) != (SST_MANUFACT & FLASH_VENDMASK) return ERR_UNKNOWN_FLASH_VENDOR;将以前的块的擦出操作的内容修改为:首先看一下SST39VF1601的datasheet,看第3页可以知道:Dat

40、a# Polling (DQ7) When the SST39LF/VF160 are in the internal Programoperation, any attempt to read DQ7 will produce the com-plement of the true data. Once the Program operation iscompleted, DQ7 will produce true data. Note that eventhough DQ7 may have valid data immediately following thecompletion of

41、 an internal Write operation, the remainingdata outputs may still be invalid: valid data on the entiredata bus will appear in subsequent successive Readcycles after an interval of 1 s. During internal Erase opera-tion, any attempt to read DQ7 will produce a 0. Once theinternal Erase operation is com

42、pleted, DQ7 will produce a1. The Data# Polling is valid after the rising edge of fourthWE# (or CE#) pulse for Program operation. For Sector-,Block- or Chip-Erase, the Data# Polling is valid after the ris-ing edge of sixth WE# (or CE#) pulse. See Figure 5 forData# Polling timing diagram and Figure 16

43、 for a flowchart.TOggle bit (DQ6)During the internal Program or Erase operation, any con-secutive attempts to read DQ6 will produce alternating 1sand 0s, i.e., toggling between 1 and 0. When the internalProgram or Erase operation is completed, the DQ6 bit willstop toggling. The Toggle Bit is valid a

44、fter the rising edge offourth WE# (or CE#) pulse for Program operation. For Sec-tor-, Block- or Chip-Erase, the Toggle Bit is valid after therising edge of sixth WE# (or CE#) pulse. See Figure 6 forToggle Bit timing diagram and Figure 16 for a flowchart.和一个时序操作图参看第6页可以得到。通过这些信息,在我们的驱动里进行相应的修改,具体如下: for (sect = s_first; sect = s_last & !ctrlc (); sect+) printf (Erasing sector %2d . , sect); /* arm simple, non interrupt dependent timer */ reset_timer_masked ();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1