对于嵌入式系统移植的简单总结
姓名:张猛
引用自:http://blog.csdn.net/dream_bin123/article/details/78001533
【嵌牛导读】:从最初的什么都不知道,到现在板子跑上系统,调通网口这一路上感觉也是挫折起伏,这里就把自己和队友在进行系统烧写过程的一些理解和一些资料总结了一下,分享出来,希望大家一起共同进步。
【嵌牛鼻子】:嵌入式,内核,u-boot
【嵌牛提问】:内核启动参数详解、参数为什么这么设置
【嵌牛正文】:
1查看内核启动参数
在uboot界面中输入printenv,即可查看启动参数。
示例:
jz2440:
1.OpenJTAG> printenv
2.bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0
3.bootdelay=2
4.baudrate=115200
5.ethaddr=08:00:3e:26:0a:5b
6.ipaddr=192.168.7.17
7.serverip=192.168.7.11
8.netmask=255.255.255.0
9.mtdids=nand0=nandflash0
10.mtdparts=mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root)
11.bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
12.bootatgs=noinitrd root=/dev/nfs nfsroot=192.168.7.21:/home/book/workspace/jz2440/systems/firstbusybox ip=192.168.7.17:192.168.7.21:192.168.7.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
13.console=ttySAC0
14.filesize=791340
15.bootargs=console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
16.stdin=serial
17.stdout=serial
18.stderr=serial
19.partition=nand0,0
20.mtddevnum=0
21.mtddevname=bootloader
22.Environment size: 742/131068 bytes
hi3518e淘宝:
1.hisilicon # printenv
2.baudrate=115200
3.bootfile="uImage"
4.da=mw.b 0x82000000 ff 1000000;tftp 0x82000000 u-boot.bin.img;sf probe 0;flwrite
5.du=mw.b 0x82000000 ff 1000000;tftp 0x82000000 user-x.cramfs.img;sf probe 0;flwrite
6.dr=mw.b 0x82000000 ff 1000000;tftp 0x82000000 romfs-x.cramfs.img;sf probe 0;flwrite
7.dw=mw.b 0x82000000 ff 1000000;tftp 0x82000000 web-x.cramfs.img;sf probe 0;flwrite
8.dc=mw.b 0x82000000 ff 1000000;tftp 0x82000000 custom-x.cramfs.img;sf probe 0;flwrite
9.up=mw.b 0x82000000 ff 1000000;tftp 0x82000000 update.img;sf probe 0;flwrite
10.ua=mw.b 0x82000000 ff 1000000;tftp 0x82000000 upall_verify.img;sf probe 0;flwrite
11.tk=mw.b 0x82000000 ff 1000000;tftp 0x82000000 uImage; bootm 0x82000000
12.dd=mw.b 0x82000000 ff 1000000;tftp 0x82000000 mtd-x.jffs2.img;sf probe 0;flwrite
13.ipaddr=192.168.1.10
14.serverip=192.168.1.107
15.netmask=255.255.255.0
16.ethaddr=00:12:12:22:b4:71
17.HWID=8043420004048425
18.bootargs=mem=38M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),3M(kernel),12M(rootfs)
19.bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x300000;bootm 0x82000000
20.bootdelay=5
21.stdin=serial
22.stdout=serial
23.stderr=serial
24.verify=n
25.ver=U-Boot 2010.06-svn (Mar 27 2014 - 11:56:37)
26.
27.Environment size: 1179/65532 bytes
hi3518e自己:
1.hisilicon # printenv
2.bootdelay=1
3.baudrate=115200
4.ethaddr=00:00:23:34:45:66
5.ipaddr=192.168.1.10
6.serverip=192.168.1.2
7.netmask=255.255.255.0
8.bootfile=uImage
9.bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000
10.bootargs=mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),9M(rootfs)
11.stdin=serial
12.stdout=serial
13.stderr=serial
14.verify=n
15.ver=U-Boot 2010.06 (Jun 01 2017 - 02:38:54)
16.
17.Environment size: 424/262140 bytes
2主要的启动参数有bootargs、bootcmd
2.1 bootargs
示例:jz2440:
bootargs=console=ttySAC0,115200root=/dev/mtdblock3 rootfstype=jffs2
bootatgs=noinitrdroot=/dev/nfsnfsroot=192.168.7.21:/home/book/workspace/jz2440/systems/firstbusybox
ip=192.168.7.17:192.168.7.21:192.168.7.1:255.255.255.0::eth0:offinit=/linuxrc console=ttySAC0
hi3518e淘宝:
bootargs=mem=38Mconsole=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2mtdparts=hi_sfc:1M(boot),3M(kernel),12M(rootfs)
hi3518e自己:
bootargs=mem=32Mconsole=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2mtdparts=hi_sfc:1M(boot),4M(kernel),9M(rootfs)
详解:
console=ttySAC0:
console=ttySAC0使用虚拟串口终端设备.
为什么是ttySAC0:
这个网址将的比较透彻:
ttySAC0与/dev/tts/0是否对应同一个物理设备串口0:http://blog.csdn.net/yiya1989/article/details/8253240
在内核中有一个串口驱动和我们的console参数比较的一个过程,所以两者要一致;
jz2440为什么是ttySAC0:
S3C2410的驱动文件drivers/serial/s3c2410.c中将串口驱动的名字定义为:.name = S3C24XX_SERIAL_NAME, //这个宏被定义为"ttySAC"
driver/serial/s3c2410.c有:#define
S3C24XX_SERIAL_NAME"ttySAC"
hi3518e为什么是ttyAMA0:
因为海思源码:drivers/tty/serial/amba-pl011.c中将串口驱动的名字定义为:.name = "ttyAMA",
mem:mem=xxM指定内存的大小,不是必须的
root=/dev/mtdblock2:
root=/dev/mtdx rw
root=/dev/mtdblockx rw
root=/dev/mtdblock/x rw
root=31:0x
就是说你的root分区在你flash的第几分区,在第几分区就是mtdblockx几,如:mtdblock3\mtdclock2;
hi3518e的板子设置mtdparts分区信息时,设置了三个分区第三个是root分区所以是root=/dev/mtdblock2
上面的这几个在一定情况下是通用的,当然这要看你当前的系统是否支持,不过mtd是字符设备,而mtdblock是块设备,有时候你的挨个的试到底当前的系统支持上面那种情况下,不过root=/dev/mtdblockx
rw比较通用。此外,如果直接指定设备名可以的话,那么使用此设备的设备号也是可以的。
root=/dev/nfs
在文件系统为基于nfs的文件系统的时候使用。当然指定root=/dev/nfs之后,还需要指定nfsroot=serverip:nfs_dir,即指明文件系统存在那个主机的那个目录下面
rootfstype=jffs2:
rootfstype设置文件系统类型rootfstype=jffs2;
这个选项需要跟root一起配合使用,一般如果根文件系统是ext2的话,有没有这个选项是无所谓的,但是如果是jffs2,squashfs等文件系统的话,就需要rootfstype指明文件系统的类型,不然会无法挂载根分区.
mtdparts=hi_sfc:1M(boot),4M(kernel),9M(rootfs):
flash分区信息;
要想这个参数起作用,内核中的mtd驱动必须要支持
按这个格式来设置:mtdparts=mtd-id:@(),@()
mtd-id必须要跟你当前平台的flash的mtd-id一致,不然整个mtdparts会失效
init:
init指定的是内核启起来后,进入系统中运行的第一个脚本,一般init=/linuxrc,或者init=/etc/preinit,preinit的内容一般是创建console,null设备节点,运行init程序,挂载一些文件系统等等操作。请注意,很多初学者以为init=/linuxrc是固定写法,其实不然,/linuxrc指的是/目录下面的linuxrc脚本,一般是一个连接罢了。
2.2 bootcmd参数
1.bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000
uboot引导完的最后一步就是调用bootcmd参数驱动内核:怎么启动呢,就是把在flash中的内核烧写到ram中,并运行那段代码;
前面有说过bootcmd是自动启动时默认执行的一些命令,因此你可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置bootcmd为你经常使用的那种参数。
3修改启动参数
其实打开uboot界面输入?,就会返回uboot下我们可以使用的命令,其中包括参数设置的相关参数。
修改:bootargs参数
YAFFS启动参数设置:
set bootargs
console=ttySAC0,115200 root=/dev/mtdblock3; save //实测有效
jffs2设置启动参数:
set bootargs
console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2; save
nfs系统启动:
改后的信息:setenv bootargs noinitrd root=/dev/nfs nfsroot=192.168.7.21:/home/book/workspace/jz2440/systems/firstbusybox ip=192.168.7.17:192.168.7.21:192.168.7.1:255.255.255.0::eth0:off init= /linuxrc console=ttySAC0
原信息:set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrcconsole=ttySAC0
saveenv
修改:bootcmd参数
1.setenv bootcmd'sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000'
1.saveenv
setenv bootargs
'mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2
mtdparts=hi_sfc:1M(boot),4M(kernel),9M(rootfs)'