分享
 
 
 

uboot 在 ARM s3c2410 上移植过程

王朝other·作者佚名  2006-03-08
窄屏简体版  字體: |||超大  

总述

u-boot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序,在LINUX下可以通过CVS来得到当前正在开发的u-boot软件。当前版本号:u-boot 1.0.2,见include/version.h中的定义。

#cvs –dserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login

#cvs –z3 –d server:anonymous@cvs.sourceforge.net:/cvsroot/u-boot checkout –P u-boot

本文讲述S3C2410中u-boot的移植过程:S3C2410的硬件配置是:

l CPU:S3C2410

l NOR: 16M,INTEL EP28F128J3A

l SDRAM:64M, MICRON 48LC16M16A2-75 B

l 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/* 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 修改processor.h中:

union debug_insn

{

u32 arm;

u16 thumb;

}

修改成:

union debug_insn

{

u32 arm_mode;

u16 thumb_mode;

}

l 编译成功,编译好的程序同smdk2410一样。

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。

实现网卡功能

本人的网卡是DM9000,在uboot中没有相应的驱动,所以自已写了一个网卡驱动。

1. 把驱动拷到drivers/dm9000.c

2. 在drivers/Makefile中加入dm9000.o

3. 在lib_arm/board.c中修改CS8900=>DM9000

4. 在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 shorts */

#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_USB_STORAGE

l #define CONFIG_USB_KEYBOARD

l #define CONFIG_DOS_PARTITION

l #define CFG_DEVICE_DEREGISTER

l #define CONFIG_SUPPORT_VFAT

l #define LITTLEENDIAN

3. 这时usb start 和 usb info等功能正常,而其它一些功能不正常。

4. 功能fatls 不正常,修改fs/fat/fat.c

l 没有把VFAT的UNICODE字符转换过来,加入UNICODE字符转换函数。Uni2ansi(), 增加slot2str()的cp936版, 增加一个toshort()。

l 加入#define cp936

l 在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:\n usb start\n usb info\n usb scan\n”);

5. 修改fs/fat/fat.c

get_cluster()函数中加入 if(size / FS_BLOCK_SIZE > 0), 以防读文件时不能成功读出。

引导LINUX

现在我们可以引导LINUX了。

l 要引导bzip2的linux核,把CFG_MALLOC_SIZE改为大于4M

l 把编译好的LINUX内存,通过uboot/tools/mkimage转换成uboot格式

1. mkimage -A arm -O linux -T kernel -C bzip2 -a 30000000 -e 30008000 -n 'linux kernel' -d vmlinux1.bz2 c

2. mkimage -A arm -O linux -T kernel -C gzip -a 30000000 -e 30008000 -n 'linux kernel' -d vmlinux.gz b

3. mkimage -A arm -O linux -T ramdisk -C gzip -a 0 -e 0 -n 'init ramdisk' -d ramdisk.image.gz ramdisk

l 在include/configs/s3c2410.h中加入:

1. #define CONFIG_BOOTARGS "initrd=0x30800000,0x200000 root=/dev/ram init=/linuxrc console=ttyS0,115200"

2. #define CONFIG_BOOTFILE "vmlinux_for_uboot.gz"

3. #define CONFIG_BOOTCOMMAND "bootm 0x80000 0x1a0000"

0x80000为内核在flash中的位置。

0x1a0000为ramdisk.image.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. data = 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.1

6. setenv ipaddr 192.168.0.56

7. setenv bootcmd ‘tftp 32000000 vmlinux; kgo 32000000’

8. saveenv: 保存环境变量

9. 在设置好环境变量以后, 保存变量值

10. tftp: tftp 32000000 vmlinux, 把server(IP=环境变量中设置的serverip)中/tftpdroot/ 下的vmlinux通过TFTP读入到物理内存32000000处。

11. kgo: 起动没有压缩的linux内核,kgo 32000000

12. bootm:起动UBOOT TOOLS制作的压缩LINUX内核, bootm 3200000

13. 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. 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.txt

21. 把USB中的aa.txt 读到物理内存0x32000000处!

22. flinfo: 列出flash的信息

23. loadb: 准备用KERMIT协议接收来自kermit或超级终端传送的文件。

24. nfs: nfs 32000000 192.168.0.2:aa.txt , 把192.168.0.2(LINUX 的NFS文件系统)中的NFS文件系统中的aa.txt 读入内存0x32000000处。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有