bootargs简介
2014-02-11 20:48:03| 分类: 嵌入式工程师必备 |举报|字号 订阅
一、采用网口烧录二进制镜像
1. PC串口配置
推荐您使用Windows XP自带的串口工具:超级终端。
COM端口请根据您的PC机情况选择,其他配置如下:
波特率 : 115200
数据位 : 8
奇偶校验 : 无
停止位 : 1
数据流控制 : 无
2. 烧录方法
烧录方法有两种:
a. 通过网口烧录,网口烧录速度快,但需要配置IP地址;
b. 通过串口烧录,串口烧录速度慢,烧录1MB FLASH空间约需160秒;
单板上电后,在超级终端上立即按 Enter 或 CTRL + C 键进入boot,显示出boot
提示符就可以开始烧录程序了。如下:
boot #
3. 设置单板boot下的网络参数
setenv ethaddr 00:01:04:02:05:03 (设置MAC地址)
setenv ipaddr 10.85.180.95 (设置单板本身的ip地址)
setenv netmask 255.255.254.0 (设置子网掩码地址)
setenv gatewayip 10.85.180.1 (设置网关地址)
setenv serverip 10.85.180.216 (设置准备访问的tftp服务器的地址)
设置完毕,保存参数
saveenv
4. 在windows上启动tftp服务,在单板上ping通网络
首先,您必须先获取tftp工具,可以在网络上搜索,推荐使用tftpd32.exe工具。
启动tftp工具后,设置tftp工具的路径为烧写文件的路径,在boot下使用命令:
ping 10.85.180.216 (即 serverip 设置的地址)
显示出 10.85.180.216 is not alive,说明网络不通,请检查网线或IP是否冲突。
显示出 10.85.180.216 is alive,说明网络正常,可以使用tftp下载。
5. 烧录 boot
tftp 0x60c00000 boot2008.bin // 下载boot到内存地址 0x60c00000
sf erase 0 80000 // 擦除boot所在的flash空间
sf write 60c00000 0 $(filesize) // 把boot写到flash上
6. 烧录内核
tftp 0x60c00000 kernel-2.6.14.7 // 下载kernel到内存 0x60c00000
sf erase 120000 160000 // 擦除kernel所在的flash空间
sf write 60c00000 120000 $(filesize) // 把kernel写到flash上
注意:
1. 内核FLASH区间在bootargs中指定,如:
mtdparts=sfc:1152K(boot),1408K(kernel),4M(rootfs)
则内核FLASH区间起始地址为1152K(即0x120000),大小为1408K(即0x160000)。
7. 烧录文件系统
tftp 0x60c00000 rootbox.jffs2 // 下载文件系统到内存
sf erase 280000 400000 // 擦除文件系统所在的flash空间
sf write 60c00000 280000 $(filesize) // 把文件系统写到flash上
注意:
1. 文件系统FLASH区间在bootargs中指定,如:
mtdparts=sfc:1152K(boot),1408K(kernel),4M(rootfs)
则文件系统FLASH区间起始地址为1152K + 1408K(即0x280000),大小为4M(即
0x400000)。
2. 必须擦除整个文件系统FLASH区间,否则会因为rootfs区中有残留的数据,启动时
打印出类似如下的信息:
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x003f0000:
0x0ce5 instead
3. 根据rootbox.jffs2或rootbox.cramfs文件的大小配置rootfs区的大小,rootfs区
必须配置为比实际的文件大小还要大。
8. 设置单板的启动参数
设置内核启动地址,根据内核FLASH区间的起始地址和长度来设置:
setenv bootcmd 'sf read 60c00000 120000 160000;bootm 0x60c00000'
设置bootargs:
setenv bootargs 'mem=40M console=ttyAMA0,115200 root=/dev/mtdblock/2 rootfs
type=jffs2 mtdparts=hi_sfc:1152K(boot),1408K(kernel),4M(rootfs) bootstrap=softm
ce mmz=mmz_msg_buf,0x80000;mmz_pcmo_buf,0x10000;mmz_cpcm_buf,0x10000;mmz_frm_bu
f,0x260000;mmz_aud_pes,0x10000;mmz_vid_pes,0x60000;mmz_vo_osd0,0x4bf000;mmz_vo_
osd1,0x4bf000;mmz_vdcoef_buf,0x1000;others,0xb11000'
注意:
1. 请根据烧录的文件类型配置 bootargs 中的 rootfstype 选项
烧录 rootbox.jffs2 时配置 rootfstype=jffs2
烧录 rootbox.cramfs 时配置 rootfstype=cramfs
设置启动后的延时时间,单位为秒:
setenv bootdelay 1
设置完毕,保存参数:
saveenv
9. 根据上述关于boot、内核、文件系统的FLASH区间描述,
以下画出此平台16MB FLASH 空间示意图:
+-------------------+ 0x01000000
| |
| 未使用 |
| |
+-------------------+ 0x00680000
| |
| rootfs | 4MB
| |
+-------------------+ 0x00280000
| |
| kernel | 1408KB
| |
+-------------------+ 0x00120000
| MCE | 64KB
+-------------------+ 0x00110000
| LOGO | 64KB
+-------------------+ 0x00100000
| INFOBASICBAK | 64KB
+-------------------+ 0x000F0000
| INFOBASIC | 64KB
+-------------------+ 0x000E0000
| ***INFO | 64KB
+-------------------+ 0x000D0000
| ENV | 64KB
+-------------------+ 0x000C0000
| 备份LOADER | 256KB
+-------------------+ 0x00080000
| LOADER | 256KB
+-------------------+ 0x00040000
| Boot | 256KB
+-------------------+ 0x00000000
二、采用串口烧录二进制镜像
通过串口烧录程序,将使用 loady 命令。
用法:
loady 0x60c00000
传送指定文件到内存地址 0x60c00000。
使用Windows XP 超级终端时显示如下提示:
## Ready for binary (ymodem) download to 0x60C00000 at 115200 bps...
选择"传送"->"发送文件",协议选择"Ymodem",再选择指定的文件,点击确定。
1. 烧录 boot
loady 0x60c00000
传送boot2008.bin,等待文件传送完毕
sf erase 0 40000 // 擦除hiboot所在的flash空间
sf write 60c00000 0 $(filesize) // 把hiboot写到flash上
2. 烧录内核
loady 0x60c00000
传送kernel-2.6.14.7,等待文件传送完毕
sf erase 80000 80000 // 擦除kernel所在的flash空间
sf write 60c00000 80000 $(filesize) // 把kernel写到flash上
注意:
1. 内核FLASH区间在bootargs中指定,如:
mtdparts=sfc:512K(boot),512K(kernel),3M(rootfs)
则内核FLASH区间起始地址为512K(即0x80000),大小为512K(即0x80000)。
3. 烧录文件系统
loady 0x60c00000
传送rootbox.squashfs,等待文件传送完毕
sf erase 100000 300000 // 擦除文件系统所在的flash空间
sf write 60c00000 100000 $(filesize) // 把文件系统写到flash上
注意:
1. 文件系统FLASH区间在bootargs中指定,如:
mtdparts=sfc:512K(boot),512K(kernel),3M(rootfs)
则文件系统FLASH区间起始地址为512K + 512K(即0x100000),大小为3M(即
0x300000)。
2. 根据 rootbox.squashfs 文件的大小配置rootfs区的大小,rootfs区必须配置为
比实际的文件大小还要大。
4. 设置单板的启动参数
设置内核启动地址,根据内核FLASH区间的起始地址和长度来设置:
setenv bootcmd 'sf read 60A00000 80000 80000;bootm 0x60A00000'
设置bootargs:
setenv bootargs 'mem=12M console=ttyAMA0,115200 root=/dev/mtdblock/2 rootfs
type=squashfs mtdparts=sfc:512K(boot),512K(kernel),3M(rootfs) bootstrap=soft
mce mmz=mmz_pcmo_buf,0x10000;mmz_cpcm_buf,0x10000;mmz_frm_buf,0x260000;mmz_aud_
pes,0xC000;mmz_vid_pes,0x40000;mmz_vo_osd0,0x66000;others,0x60000'
设置启动后的延时时间,单位为秒:
setenv bootdelay 1
设置完毕,保存参数:
saveenv
5. 根据上述关于boot、内核、文件系统的FLASH区间的描述,
画出此平台4MB FLASH 空间示意图:
+-------------------+ 0x00400000
| |
| rootfs | 3MB
| |
+-------------------+ 0x00100000
| |
| kernel | 512KB
| |
+-------------------+ 0x00080000
| LOGO | 64KB
+-------------------+ 0x00070000
| INFOBASIC | 64KB
+-------------------+ 0x00060000
| STBINFO | 64KB
+-------------------+ 0x00050000
| ENV | 64KB
+-------------------+ 0x00040000
| LOADER | 128KB
+-------------------+ 0x00020000
| HiBoot | 128KB
+-------------------+ 0x00000000
三、启动参数介绍
1. 功能介绍
启动参数是boot传递给内核的信息,内核和驱动获取到后会根据参数情况分配内存、
FLASH分区。以下面的bootargs为例,分别对每个参数进行详细说明。
setenv bootargs 'mem=40M console=ttyAMA0,115200 root=/dev/mtdblock/2 rootfs
type=jffs2 mtdparts=sfc:1152K(boot),1408K(kernel),4M(rootfs) bootstrap=softm
ce mmz=mmz_msg_buf,0x80000;mmz_pcmo_buf,0x10000;mmz_cpcm_buf,0x10000;mmz_frm_bu
f,0x260000;mmz_aud_pes,0x10000;mmz_vid_pes,0x60000;mmz_vo_osd0,0x4bf000;mmz_vo_
osd1,0x4bf000;mmz_vdcoef_buf,0x1000;others,0xb11000'
2. mem
mem表示linux系统所使用的内存,例如mem=40M,表示分配给内核、驱动模块、应用程
序的内存总和是40M字节。
假设应用程序超大或在程序中malloc申请大量内存,就会出现内存不够导致应用程序
被kill掉的问题。此时,您就应该增加系统内存大小。
3. console
控制台名称和波特率,不需要修改。
4. bootstrap
快速开机选项。
5. mmz
mmz用于内核驱动启动后分配音视频、DEMUX、VO、JPEG等业务内存。mmz分配的内存加
上mem分配的系统内存总量不能超过实际单板内存大小,否则mmz内存会分配失败。
mmz_msg_buf: DEMUX数据缓冲池内存大小...。
6. rootfstype
rootfstype表明内核启动后要加载的文件系统类型;可以为 cramfs 或 jffs2;
如果是cramfs,表明要从Flash中加载只读压缩文件系统;
如果是jffs2,表明要从Flash中加载可写压缩文件系统;
7. mtdparts
mtdparts是Flash分区的参数,采用的格式为:
sfc:分区1大小(分区1名称),分区2大小(分区2名称),...,分区n大小(分区n名称),-
(最后一个分区的名称)
注:分区1对应的设备节点为 /dev/mtdblock/0
a) 整个Flash可以被分为很多分区,每个分区由整数个Flash的物理扇区组成;例如
boot是512K,就需要分配至少8个64K的扇区(或者4个128K的扇区);
注:分区的大小必须是物理扇区大小的整数倍,否则会出现分区失败问题。
所有分区大小的总和不能超过实际Flash大小,否则会出现分区失败。
b) 分区按照顺序,从左至右依次按照Flash中的低地址到高地址顺序排列。例如:
mtdparts=sfc:1152K(boot),1408K(kernel),4M(rootfs),-(app)
实际在Flash中的布局是:
0x00000000-0x00120000 : "boot"
0x00120000-0x00280000 : "kernel"
0x00280000-0x00680000 : "rootfs"
0x00680000-0x01000000 : "app"
c) 在应用程序中,可以通过访问/dev/mtdblock/(n)设备节点来对此分区进行读写(擦
除)。
8. root
root表示文件系统挂载点的位置。为Flash的某个分区, 例如/dev/mtdblock/2
1.如何对nand 分区。修改mtdparts环境变量就可以了么?
对于目前的U-boot而言,是的.而且, 设置了mtdparts变量之后,你可以在nand read/write/erase命令中直接使用分区的名字而不必指定分区的偏移位置.
set bootargs noinitrd console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2 mtdparts=nand_flash:128k(u-boot)ro,64k(u-boot envs),3m(kernel),30m(root.jffs2),30m(root.yaffs)
2 内核通过bootargs找到文件系统,bootargs中的mtdblockx即代表分区,block1,2,3代表哪个分区是如何确定的。
事实上,bootargs中的"root=/dev/mtdblockx"只是告诉内核,root fs从第x个(x=0,1,2...)MTD分区挂载,mtdblock0对应第一个分区,mtdblock1对应第二个分区,以此类推.至于这个分区对应MTD device(NAND Flash)的哪一段范围,取决于内核读到的MTD分区信息,这个分区信息可以通过:
1) 写死在MTD层的NAND Controller驱动或者内核其他部分代码里
2) 通过U-boot传递给内核的命令行中的mtdparts=...部分解析得出,解析的规则同u-boot中mtdparts变量的赋值规则
3) 其他可以让内核知道分区信息的任何办法
3 在u-boot中给nand分区后是否要对应修改kernel的代码?
如果你用的是通过内核命令行给MTD层传递u-boot中的MTD分区信息,那是不需要的,在这种情况下,内核读取到的分区信息始终和u-boot中的保持一致(推荐的做法)
如果你用的是把分区信息写死在内核源代码里的方法,那最好保证它和u-boot中的保持一致,即同步修改内核的相关部分代码