⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 һ

📁 对linux下边的gzip的文件的分析的代码
💻
📖 第 1 页 / 共 2 页
字号:
(2) 开始 
由于没有接触过u-boot,因此第一步要做的就是google一些资料. 
u-boot官方网站:http://sourceforge.net/projects/u-boot(比较慢) 
http://u-boot.sourceforge.net/这个快一些. 

DENX U-Boot及Linux使用手册: http://coosign.blogchina.com/coosign/1318487.html, 这是一遍翻译的文档.主要介绍了u-boot编译及使用的命令.但没有涉及新板子的移植流程. 

根据上面手册中的说明,下载了最新的u-boot代码,命令: 
#cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login 
#cvs -z6 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot co -P u-boot 

到board目录查了一下: 
#cd u-boot 
#cd board 
#find . -exec grep -l 44B0 {} \; 
结果是: 
./dave/B2/B2.c 
B2网站是: http://www.dave-tech.it,初初看了B2开发板的介绍,但不详细.包括使用的网络芯片等都没有介绍. 

google "u-boot 移植"后查到一篇文章: 
"收集了一些关于U-BOOT的文章" 
http://www.bloghome.cn/index.php?op=ViewArticle&articleId=2111&blogId=390 

里面搜集了不少关于u-boot移植的问题. 
里面介绍了"U-Boot 在44B0X 开发板上的移植以及代码分析"的内容,仔细看了看.发现其移植的版本比较低,但对了解u-boot结构是满不错的,因为这个版本不支持44B0X,因此完全是支持新CPU的移植.了解到make XX_config是在Makefile中定义的. 
另外"MPC8xx的U-Boot移植体会(ZT) "这一篇对u-boot介绍满详细的.但对移植工作只做了理论性和经验性介绍,没有具体的操作步骤. 

"基于Atmel at91rm9200的armlinux的bootloader启动代码分析 " 
http://www.linuxfans.org/nuke/modules.php?name=News&file=print&sid=2765 
里面介绍了u-boot移植到at91rm9200上的情况,可以参考一下. 

另外就是仔细阅读u-boot下的README文件. 

(3) 编译一把 
看了相关的资料,心动不如行动.先编译一把看看情况.既然只有B2开发板是S3C44B0X CPU的,因此先编译一下B2开发板看看. 具体: 
#cd u-boot 
#make B2_config 
#make 
结果顺利,成功编译. 

(4) 开始动手移植 
我以B2板子的程序做为模板来做. 
#cd board 
#cp -r dave wx (自己取个公司名wx) 
#cd wx 
#mv B2 wx20 (自己取个板子名wx20) 
#cd wx20 
# mv B2.c wx20.c 
修改Makefile及wx20.c, 主要是B2改成wx20. 

增加配置文件: 
#cd include/configs 
#cp B2.h wx20.h 
修改Makefile配置文件,增加wx20_config. 
1432 wx20_config : unconfig 
1433 @./mkconfig $(@:_config=) arm s3c44b0 wx20 wx 
[注:前面的数字是文件行号,以下一样]. 
将board/wx目录下和wx20.h文件中的B2改成wx20或WX20. 

这里其实是最重要的步骤,就是根据硬件的情况来修改相关的参数.由于对硬件板子的情况不是太了解,因此此时最需要的就是耐心地看看硬件资料.主要修改的地方有: 
include/configs/wx20.h ---- 配置文件,大部分参数是这里配置的. 
board/wx/wx20/lowlevel_init.S -- 内存参数配置 
cpu/s3c44b0/serial.c -- 串口配置 
cpu/s3c44b0/start.S -- 程序入口 

如果此时配置全部正确了,那么我们就简单的很了.(如果你用我的patch的话,就是如此了!)那么我也就不会仔细再去研究u-boot其他部分了. 困难就是你学习的最好机会! 

(5) 开始编译 
经过简单的参数修改,编译成功.然后下载u-boot.bin(二进制格式). 此时你可以用nm看一下u-boot(elf格式)的内容,会有所收获的. 

然后用armsys的bootloader将u-boot.bin调入到内存0xc100000运行.结果可想而知,串口没有任何显示,而且死机.bootloader也必须断电重起. 

(6) u-boot流程 
原因是比较明显的,就是参数和硬件没有符合.因此接下来做的事情就是仔细阅读S3C44B0 CPU的硬件资料,包括内存配置,串口配置这些.我觉得要让串口出信息,最主要的就是CPU的初始化,内存配置和串口配置.另外就是了解u-boot程序运行流程,这个对了解需要设置的参数是非常有帮助的.我这里大致说一下u-boot运行流程. 

入口: cpu/s3c44b0/start.S 
主要是CPU初始化( cpu_init_crit ), 调内存配置函数( lowlevel_init ), 然后判断u-boot是否从flash运行,如果是就把u-boot代码拷贝到TEXT_BASE定义的地方.然后转到start_armboot. 

start_armboot: lib_arm/board.c 
进行各种初始化设置,主要有: 
cpu_init CPU相关的设置, 具体在./cpu/s3c44b0/cpu.c中. 
board_init 板子相关的设置, 具体在board/wx/wx20/wx20.c 中 
interrupt_init中断设置,我们没有用,具体在./cpu/s3c44b0/interrupts.c中 
env_init 初始化环境变量, 具体要看用什么介质来存储环境变量,如果用flash来存贮, 程序在common/env_flash.c中. 
init_baudrate 设置baud参数 
serial_init 串口初始化, 具体在cpu/s3c44b0/serial.c. 
console_init_f 控制台设置, 具体在./common/console.c 

display_banner 显示标题. 
dram_init 可用内存配置, 具体在./board/wx/wx20/wx20.c. 
flash_init flash初始化,具体./drivers/cfi_flash.c. 

接下来就是环境变量初始化, 网络初始化,最后到main_loop,可以运行各种命令. 
(7) 主要参数修改 
经过一段时间调试,终于串口出东西了,这段时间犯了一个小错误,走了一段冤枉路.其实配置参数可能早已正确,但串口老是乱码,原因是自己的u-boot.bin传下来时目录搞错了,结果老是运行错误的u-boot.bin.这段时间里主要改的参数有: 

include/configs/wx20.h: 
#define CONFIG_S3C44B0_CLOCK_SPEED 64 
CPU主频,armsys板的是64M 
#define PHYS_SDRAM_1 0x0c000000 /* SDRAM Bank #1 */ 
B2板子里的定义是错误的.还有RAM大小,flash大小需要修改,跟B2板不同. 

#define CONFIG_DRIVER_RTL8019 
#define RTL8019_BASE 0x08000000 
配置rtl8019AS网络芯片. 

#define CFG_LOAD_ADDR 0x0c008000 /* default load address */ 
uclinux运行入口地址 

lowlevel_init.S: 
MEMORY_CONFIG: 
.long 0x11010102 
.long 0x600 
.long 0x7ffc 
.long 0x7ffc 
.long 0x7ffc 
.long 0x7ffc 
.long 0x2610 
.long 0x18000 
.long 0x18000 
.long 0x960459 
.long 0x10 
.long 0x20 
.long 0x20 
由于对armsys硬件不是太了解,没有办法,只得看armsys bootloader程序,但每个版本又有差别.因此是用AXD调试看bootlaoder启动后0x1c80000中的值定的. 

cpu/s3c44b0/serial.c: 
#elif CONFIG_S3C44B0_CLOCK_SPEED==64 
divisor = 34; 
串口设置,这个也是根据bootloader里的公式计算出来的.这里只定义了115200得值,其他没有去设置. 

cpu/s3c44b0/start.S: 
ldr r1, =PLLCON 

#if CONFIG_S3C44B0_CLOCK_SPEED==66 
ldr r0, =0x34031 /* 66MHz (Quartz=11MHz) */ 
#elif CONFIG_S3C44B0_CLOCK_SPEED==75 
ldr r0, =0x610c1 /*B2: Xtal=20mhz Fclk=75MHz */ 
#elif CONFIG_S3C44B0_CLOCK_SPEED==64 
ldr r0, =((M_DIV<<12)+(P_DIV<<4)+S_DIV) //Fin=8MHz,Fout=64MHz 
#else 
# error CONFIG_S3C44B0_CLOCK_SPEED undefined 
#endif 
PLLCON的值,也是根据bootlaoder的公式. 

board/wx/wx20/wx20.c 
主要是PORT配置,具体我不知道有没有影响. 


(8) 关于u-boot入口的疑问 
由于开始串口没有出内容,因此对u-boot入口产生怀疑.在网上也找到一个帖子,碰到同样疑问的人: 
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=embedded&Number=563322&page=0&view=collapsed&sb=5&o=0&fpart= 

"链接得到的起始地址为什么是TEXT_BASE,而不是0呢,所以现在只能够下载到ram中运行,但是无法烧写道flash中跑,这是怎么回事呢?u-boot中应该是start.S中的这段代码在flash中运行吧,后面就把自身拷贝到ram中TEXT_BASE地址处,为什么在链接文件中指定的_start的起始地址为0x00000000呢? " 

后来我理解了: 
“链接得到的起始地址为什么是TEXT_BASE,而不是0呢,” 
因为u_boot如果从flash运行的话,那么它会将自己的代码拷贝到RAM中,然后运行。u-boot开始部分代码与编译的入口没有关系,而主要的代码是在RAM中运行,因此编译的入口地址是TEXT_BASE.因此u-boot既可以flash运行,也可以ram运行。 

“为什么在链接文件中指定的_start的起始地址为0x00000000呢?” 
lds文件中的起始地址为0x00000000是不起作用的,由-TTEXT_BASE参数替代的。 

刚开始比较疑惑的原因是对: 
126 relocate: /* relocate U-Boot to RAM */ 
127 adr r0, _start /* r0 <- current position of code */ 
adr这条指令没有理解正确,因为把它想成mv r0,_start了,实际上adr这里的_start是相对的,如果从flash运行的话,r0就是0, 如果从ram运行的话,r0就是C100000。 

(9) u-boot显示信息 
经过上面的努力,我们终于可以看到u-boot的庐山真面目了.当然这还不是最终的结果.但至少离胜利不远了.现在我们可以用printf来调试了.此时全部是通过armsys bootloader下载u-boot.bin到0xc100000运行. 

现在显示信息是: 
Plese wait a moment to start running...i am samfei! 
iamsam! 


U-Boot 1.1.3 (Jul 1 2005 - 13:46:03) 

U-Boot code: 0C100000 -> 0C11A73C BSS: -> 0C11ECF4 
RAM Configuration: 
Bank #0: 0c000000 8 MB 
[flash_get_size, 224] Entering ... 
[flash_get_size, 232] value=bf 
[flash_get_size, 255] value=234b 
Flash: 2 MB 
*** Warning - bad CRC, using default environment 

In: serial 
Out: serial 
Err: serial 
MAC: 26:26:26:26:26:26 
Hit any key to stop autoboot: 0 
=> 

(10) 希望环境变量存贮到flash 
B2板缺省的定义是把环境变量存贮到EEPROM上,虽然armsys上也有,但我也搞不清楚它的硬件配置,因此希望把环境变量存贮到flash上. 

增加配置: include/configs/wx20.h (从evb4510.h中学来!) 
79 #define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \ 
80 CFG_CMD_DATE | \ 
81 CFG_CMD_ELF | \ 
82 CFG_CMD_NET | \ 
83 CFG_CMD_ENV|CFG_CMD_FLASH ) 
173 #define CFG_ENV_IS_IN_FLASH 
174 #undef CFG_ENV_IS_NOWHERE 
175 
176 #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x20000) /* environment start address */ 
177 #define CFG_ENV_SECT_SIZE 0x10000 /* Total Size of Environment Sector */ 

编译运行, 并操作setenv, saveenv, printenv. 看起来正常. 
=> setenv ipaddr 192.168.1.100 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -