ARM+LINUX移植攻略(十三)一些需要注意的问题

哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处

http://blog.youkuaiyun.com/woshixingaaa/archive/2011/02/24/6205353.aspx

注意的问题总结:

1.内核参数传递

内核中的参数是内核提供的,在配置内核时指定,而u-boot提供的则在u-boot启动时传递到内核取代内核提供的。u-boot的参数传递利用了三个通用寄存器R0,R1,R2u-boot在启动的过程中把参数放到3个寄存器中,到内核启动时再把寄存器中的参数取出。一般我们需要通过u-boot/tools/目录下的mkimage制作uImage,使用bootm命令进行加载,注意go命令是不传递内核参数的。

mkimage[-x]-A arch-O os-T type-C comp-a addr-e ep-n name-d data_file[:data_file...]image

选项:
-Aset architecture to'arch'//用于指定CPU类型,比如ARM
-Oset operatingsystemto'os'//用于指定操作系统,比如Linux
-Tset image type to'type'//用于指定image类型,比如Kernel
-Cset compression type'comp'//指定压缩类型
-aset load address to'addr'(hex)//指定image的载入地址
-eset entry point to'ep'(hex)//内核的入口地址,一般为image的载入地址+0x40(信息头的大小)
-nset image name to'name'//image在头结构中的命名
-duse image data from'datafile'//无头信息的image文件名
-xset XIP(execute in place)//设置执行位置

例如:
mkimage-n'linux-2.6.30.4'-A arm-O linux-T kernel-C none-a 0x30008000-e 0x30008040-d zImage uImage.img

注意内核的加载地址是内存的起始地址+0x8000,0x4064k的头部,是mkimage加上去的,0x30008040是内核第一条指令所在的地址。u-boot参数链表在内存中的地址是0x30000100r0的值是0r1u-boot传递过来的机器码,r2是参数链表在内存中的物理地址。

修改u-boot中我们的开发板的配置文件/include/configs/TE2440II.h,增加如下宏定义,使其能向内核传递参数(在这里主要是console参数,否则无法在控制台看到启动信息):
#define CONFIG_SETUP_MEMORY_TAGS
#define CONFIG_INITRD_TAG
#define CONFIG_CMDLINE_TAG
#define CONFIG_BOOTARGS "
noinitrd root=/dev/mtdblock3 init=/linuxrc mem=64M devfs=mount console=tty0 console=ttySAC0,115200"

上面的操作完成后,重新编译u-boot,下载到nand中,重新启动u-boot后,把我们编译生成的uImage文件下载到内存的0x30008000地址处,就可以用bootm命令来手动引导内核了(执行bootm 0x30008000)

2.机器码

内核会在编译链接过程中,将各种处理器内核描述符组合成表,接着从机器描述符表中查询有无r1寄存器指定的机器码,如果没有就将退出,所以这也说明了为什么在u-boot中机器码一定要和内核中的机器码一致,否则内核就无法启动。

先看看u-boot的机器码和linux的机器码是由什么地方决定的,u-boot中的机器码在u-bootboard/samsung/TE2440II/TE2440II.c中决定。

/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

查看u-boot/include/asm-arm/mach-type.h文件有:

#define MACH_TYPE_SMDK2410 193
#define MACH_TYPE_S3C2440 362

Linux中决定机器码的就是下面那个机器描述符。

MACHINE_START(SMDK2440,"SMDK2440")
/* Maintainer: Ben Dooks <ben@fluff.org> */
.phys_io=S3C2410_PA_UART,
.io_pg_offst=(((u32)S3C24XX_VA_UART)>>18)&0xfffc,
.boot_params=S3C2410_SDRAM_PA+0x100,//注意:这个地址就是与u-boot中参数链表在内存中的物理地址相对应

.init_irq=s3c24xx_init_irq,
.map_io=smdk2440_map_io,
.init_machine=smdk2440_machine_init,
.timer=&s3c24xx_timer,
MACHINE_END

查看内核目录下的arch/arm/tools/mach-types.h文件,有:
smdk2410 ARCH_SMDK2410 SMDK2410 193
s3c2440 ARCH_S3C2440 S3C2440 362
smdk2440 MACH_SMDK2440 SMDK2440 1008

关键字是s3c2440,所以我们上面看到的是0x000000a8362)。
所以,我们这里不去修改内核,而是直接修改u-boot board/samsung/ok2440v3/ok2440v3.c文件,如下:
/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;

3.

[/u@/h /W]#

进入控制台,/u会显示成root/h会显示成hostname/w会显示成当前路径。

4. Hit any key to stop autoboot:

doc/README.autoboot里说得很清楚,自动引导只有需要最基本的两个配置:CONFIG_BOOTDELAYCONFIG_BOOTCOMMAND
The basic autoboot configuration options are documented in the main
U-Boot README. See it for details. They are:
bootdelay
bootcmd
CONFIG_BOOTDELAY
CONFIG_BOOTCOMMAND
根目录下的Readme文件里对这几个参数有说明:
Boot Delay: CONFIG_BOOTDELAY - in seconds
Delay before automatically booting the default image;
set to -1 to disable autoboot.
bootcmd see CONFIG_BOOTCOMMAND
Autoboot Command:
CONFIG_BOOTCOMMAND
Only needed when CONFIG_BOOTDELAY is enabled;
define a command string that is automatically executed
when no character is read on the console interface
within "Boot Delay" after reset.
由此,我们只需要在自已的开发板的配置文件里/include/configs/TE2440II.h

#define CONFIG_BOOTDELAY 5
#define CONFIG_BOOTCOMMAND "nand read 0x30008000 0x00500000 0x00300000; bootm 0x30008000"

重新编译u-bootOK了,嘿嘿。

6.如果tftp出现T#,那是tftp不断重启,据说是网卡还没准备好的,所以将tftp超时的时间加大。

net/tftp.c中,修改这句:

#define TIMEOUT 200000UL /* Millisecs to timeout for lost pkt */

7.我使用的命令

1printprintenv可以打印出环境变量

2)setenv bootargs 'noinitrd root=/dev/mtdblock3 init=/linuxrc mem=64M devfs=mount console=tty0,ttySAC0,115200'

这样使用setenv 可以设置环境变量

3)setenv bootargs 这样使用setenv 直接加环境变量的名字可以删除环境变量

4)saveenv 保存环境变量,否则复位后,上次用setenv设置的环境变量就不在了。

5)tftp 0x30008000 192.168.1.101:u-boot.bin

从IP地址为192.168.1.101的tftp服务器处下载 u-boo.bin文件到0x30008000处。

6)nand erase 0x0 0x30000

擦除0x0到0x30000范围的nandflash

7)nand write 0x30008000 0x0 0x30000

从0x30008000将数据传到0x0,长度为0x30000

8)nand scrub

擦除整个nandflash,先按y,再按回车

9)nand write.yaffs2 0x30008000 0x00800000 0x03c00000

写yaffs2文件系统用的

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值