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

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

http://blog.csdn.net/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文件系统用的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值