Chinaunix首页 | 论坛 | 博客
  • 博客访问: 84462
  • 博文数量: 29
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-07 19:35
文章分类
文章存档

2015年(11)

2014年(18)

我的朋友

分类: LINUX

2014-11-21 10:51:09

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中的保持一致,即同步修改内核的相关部分代码

 
阅读(3441) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~