一。uboot下的logo显示功能中的flash的读取:
mmc read dev_num, addr, flash_addr_start, flash_read_size
mmc read 0 ADDR, (BOOT_LOGO_ADDRESS >> 9), (BOOT_LOGO_SIZE >> 9)
即mmc read有四个参数,从前到后分别是
flash设备的编号;
读取的目标内存地址;
读取的flash的起始扇区的地址
读取的flash的扇区数量
之所以>>9 即除以512, 目的是512字节为一个扇区。
- #define CONFIG_BOOTARGS "mem=512M logosize=5M console=ttyAMA0,115200 blkdevparts=mmcblk2:1M(boot),16M(bootlogo),16M(kernel),16M(kernel_bak),16M(config),16M(config_bak),1M(cliinfo),1M(cliinfo_bak),1M(mtd_runtime),32M(calibration),512K(update),352M(program),352M(cache),-(data)"
-
- #if (defined QPTSV2R2B10) /* 3516dv300 STM 门禁 16G emmc */
- #define BOOT_LOGO_SIZE 0x1000000 /* bootlogo 16M */
- #define PROGRAM_SIZE 0x16000000 /* program 352M */
-
- /* 多平台共用 */
- #define UBOOT_SIZE 0x100000 /* uboot 1M */
- #define KERNEL_SIZE 0x1000000 /* kernel 16M */
- #define KERNEL_BAK_SIZE KERNEL_SIZE /* kernel_bak 16M */
- #define CONFIG_SIZE 0x1000000 /* config 16M */
- #define CONFIG_BAK_SIZE CONFIG_SIZE /* config_bak 16M */
- #define CFG_CLINFO_DATA_SIZE 0x100000 /* cliinfo 1M */
- #define CFG_CLINFO_DATA_BAK_SIZE CFG_CLINFO_DATA_SIZE /* cliinfo_bak 1M */
- #define MTD_RUNTIME_SIZE 0x100000 /* mtd_runtime 1M */
- #define CALIBRATION_SIZE 0x2000000 /* calibration 32M */
- #define UPDATE_SIZE 0x80000 /* update 512K */
-
-
- /* 根据各分区大小计算起始地址 */
- #define UBOOT_START_ADDRESS 0
- #define BOOT_LOGO_ADDRESS (UBOOT_START_ADDRESS + UBOOT_SIZE)
- #define KERNEL_START_ADDRESS (BOOT_LOGO_ADDRESS + BOOT_LOGO_SIZE)
- #define KERNEL_BAK_START_ADDRESS (KERNEL_START_ADDRESS + KERNEL_BAK_SIZE)
- #define CONFIG_BAK_START_ADDRESS (CONFIG_START_ADDRESS + CONFIG_SIZE)
- #define CFG_CLINFO_DATA_ADDRESS (CONFIG_BAK_START_ADDRESS + CONFIG_BAK_SIZE)
- #define CFG_CLINFO_DATA_BAK_ADDRESS (CFG_CLINFO_DATA_ADDRESS + CFG_CLINFO_DATA_SIZE)
- #define MTD_RUNTIME_START_ADDRESS (CFG_CLINFO_DATA_BAK_ADDRESS + CFG_CLINFO_DATA_BAK_SIZE)
- #define CALIBRATION_START_ADDRESS (MTD_RUNTIME_START_ADDRESS + MTD_RUNTIME_SIZE)
- #define UPDATE_START_ADDRESS (CALIBRATION_START_ADDRESS + CALIBRATION_SIZE)
- #define PROGRAM_START_ADDRESS (UPDATE_START_ADDRESS + UPDATE_SIZE)
注意: 上述各个模块在磁盘上的地址是从零开始的。而且各个模块占用的大小相对固定。

指定上述分区如何划分的代码位于uboot下,具体在uboot环境变量的 bootargs字段里面,一般情况下为 blkdevparts 或者 mtdparts :
blkdevparts=mmcblk2:1M(boot),16M(bootlogo),16M(kernel),16M(kernel_bak),16M(config),16M(config_bak),1M(cliinfo),1M(cliinfo_bak),1M(mtd_runtime),32M(calibration),512K(update),304M(program),304M(cache),-(data)
mtdparts=rk29xxnand:0x00000040@0x00000000(gpt),0x00000800@0x00004000(uboot),0x00008000@0x00004800(bootlogo),0x00008000@0x0000C800(boot),0x00008000@0x00014800(boot_bak),0x00008000@0x0001C800(config),0x00008000@0x00024800(config_bak),0x00000800@0x0002C800(cliinfo),0x00000800@0x0002D000(cliinfo_bak),0x00000800@0x0002D800(mtd_runtime),0x00010000@0x0002E000(calibration),0x00000400@0x0003E000(update),0x000B0000@0x0003E400(program),0x000B0000@0x000EE400(cache),-@0x0019E400(data:grow)
Mstar: "mtdparts=nand0:4M(uboot),5M(kernel),200M(program),1M(cliinfo),1M(mtd_runtime),8M(config),8M(cfgbak),3M(calibration),512K(update),\
-(other) root=ubi0:program rw rootflags=sync rootfstype=ubifs ubi.mtd=2 LX_MEM=0x003FFE0000 mma_heap=mma_heap_name0,miu=0,sz=0x30000000 mma_heap=mma_heap_ipu,miu=0,sz=0x164000 cma=2M "
两者的格式不一样,但是生效的原理大致相同,即内核会解析上述参数,并且在dev下生成对应的块设备节点,然后我们在启动脚本里方便的将各个节点挂载到根文件系统上。
mstar用的也是mtdparts形式的参数
验证:
在海思的hi3516dv300.h的bootargs中添加mlwmlw分区,系统启动后,会在/dev/下生成对应的mmcblk2p15(15是bootargs中的顺序),然后在S30ambrwfs脚本中用 mount命令 将节点挂载到新建的目录上mlwmlw,注意用mount可df -h均可查看其大概内容:
mem=512M logosize=5M console=ttyAMA0,115200 blkdevparts=mmcblk2:1M(boot),16M(bootlogo),16M(kernel),16M(kernel_bak),16M(config),16M(config_bak),1M(cliinfo),1M(cliinfo_bak),1M(mtd_runtime),32M(calibration),512K(update),352M(program),352M(cache),48M(mlwmlw),-(data)
1. s30ambrwfs脚本中的挂载命令如下:============
MLWMLW_MTD=mmcblk2p14
ln -sf /dev/$MLWMLW_MTD /dev/mtd_mlwmlw
mkdir -p /mlwmlw
mount -t ext4 /dev/$MLWMLW_MTD -o sync,noatime /mlwmlw
if [ $? != 0 ]; then
mkfs.ext4 /dev/$MLWMLW_MTD
mount -t ext4 /dev/$MLWMLW_MTD -o sync,noatime /mlwmlw
echo "recover cache " >> /mlwmlw/ext4_recover
fi
2. df-h的执行结果如下:
root@root:/etc/init.d# df -h
Filesystem Size Used Available Use% Mounted on
tmpfs 250.0M 8.0K 250.0M 0% /var
tmpfs 250.0M 4.0K 250.0M 0% /dev
tmpfs 399.9M 3.4M 396.6M 1% /tmp
/dev/mmcblk2p12 341.0M 269.7M 64.2M 81% /program
/dev/mmcblk2p5 14.5M 1.3M 12.0M 10% /config
/dev/mmcblk2p6 14.5M 700.0K 12.7M 5% /cfgbak
/dev/mmcblk2p10 27.0M 396.0K 24.4M 2% /calibration
/dev/mmcblk2p15 13.5G 34.9M 12.7G 0% /data
/dev/mmcblk2p14 42.5M 979.0K 38.2M 2% /mlwmlw
/dev/mmcblk2p13 332.9M 2.7M 308.6M 1% /cache
3. mount的执行结果:
rootfs on / type rootfs (rw,size=245720k,nr_inodes=61430)
tmpfs on /var type tmpfs (rw,relatime)
proc on /proc type proc (rw,nosuid,nodev,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,relatime)
tmpfs on /dev type tmpfs (rw,relatime)
tmpfs on /tmp type tmpfs (rw,relatime,size=409540k)
devpts on /dev/pts type devpts (rw,relatime,mode=600,ptmxmode=000)
/dev/mmcblk2p12 on /program type ext4 (ro,sync,noatime,data=ordered)
/dev/mmcblk2p5 on /config type ext4 (rw,sync,noatime,data=ordered)
/dev/mmcblk2p6 on /cfgbak type ext4 (rw,sync,noatime,data=ordered)
/dev/mmcblk2p10 on /calibration type ext4 (ro,sync,noatime,data=ordered)
/dev/mmcblk2p15 on /data type ext4 (rw,sync,noatime,data=ordered)
/dev/mmcblk2p14 on /mlwmlw type ext4 (rw,sync,noatime,data=ordered)
/dev/mmcblk2p13 on /cache type ext4 (rw,sync,noatime,data=ordered)
即mount命令执行时,并不会指定其中分区大小的参数,应该是mount命令自动判断其大小:
======================================
mount的选项以及具体实现:
/bin/mount -> busybox 即 mount是对busybox的链接。
mount以及umonut的源码分为位于 busybox/util-linux目录下的 mount.c和umount.c中。
===============根文件系统编译进内核==============
内核选项: Initial RAM filesystem and RAM disk (initramfs/initrd) support
=================boot向内核传递参数的过程=================
uboot向内核传递的参数在内核启动阶段会收到,即 start_kernel----parse_early_param 函数,
其中涉及到一个全局变量: char * __initdata boot_command_line
其中的__initdata 解释为:
- #define __initdata __section(.init.data)
- #define __exitdata __section(.exit.data)
==================uboot向内核传参end ====================
==================mmc设备和nand设备的区别================
mmc设备的mmc节点以及对应的额mtd的链接关系如下:
1. mmc设备:
brw-rw-rw- 1 root root 179, 0 Jul 1 20:29 mmcblk2
brw-rw---- 1 root root 179, 8 Jul 1 20:29 mmcblk2boot0
brw-rw---- 1 root root 179, 16 Jul 1 20:29 mmcblk2boot1
brw-rw-rw- 1 root root 179, 1 Jul 1 20:29 mmcblk2p1
brw-rw---- 1 root root 259, 2 Jul 1 20:29 mmcblk2p10
brw-rw---- 1 root root 259, 3 Jul 1 20:29 mmcblk2p11
brw-rw---- 1 root root 259, 4 Jul 1 20:29 mmcblk2p12
brw-rw---- 1 root root 259, 5 Jul 1 20:29 mmcblk2p13
brw-rw---- 1 root root 259, 6 Jul 1 20:29 mmcblk2p14
brw-rw---- 1 root root 259, 7 Jul 1 20:29 mmcblk2p15
brw-rw-rw- 1 root root 179, 2 Jul 1 20:29 mmcblk2p2
brw-rw-rw- 1 root root 179, 3 Jul 1 20:29 mmcblk2p3
brw-rw-rw- 1 root root 179, 4 Jul 1 20:29 mmcblk2p4
brw-rw-rw- 1 root root 179, 5 Jul 1 20:29 mmcblk2p5
brw-rw-rw- 1 root root 179, 6 Jul 1 20:29 mmcblk2p6
brw-rw-rw- 1 root root 179, 7 Jul 1 20:29 mmcblk2p7
brw-rw-rw- 1 root root 259, 0 Jul 1 20:29 mmcblk2p8
brw-rw-rw- 1 root root 259, 1 Jul 1 20:29 mmcblk2p9
brw-rw---- 1 root root 179, 24 Jul 1 20:29 mmcblk2rpmb
2. mmc设备的连接(一般是启动脚本中会建立的软连接)一般会在init.d的Sambrwfs脚本中对上述节点创建软连接,软连接的名字以及分布如下:
lrwxrwxrwx 1 root root 14 Jul 1 20:29 mtd_bootlogo -> /dev/mmcblk2p2
lrwxrwxrwx 1 root root 15 Jul 1 20:29 mtd_cache -> /dev/mmcblk2p13
lrwxrwxrwx 1 root root 15 Jul 1 20:29 mtd_calibration -> /dev/mmcblk2p10
lrwxrwxrwx 1 root root 14 Jul 1 20:29 mtd_cfgbak -> /dev/mmcblk2p6
lrwxrwxrwx 1 root root 14 Jul 1 20:29 mtd_clinfo -> /dev/mmcblk2p7
lrwxrwxrwx 1 root root 14 Jul 1 20:29 mtd_config -> /dev/mmcblk2p5
lrwxrwxrwx 1 root root 15 Jul 1 20:29 mtd_data -> /dev/mmcblk2p15
lrwxrwxrwx 1 root root 14 Jul 1 20:29 mtd_kernel -> /dev/mmcblk2p3
lrwxrwxrwx 1 root root 15 Jul 1 20:29 mtd_mlwmlw -> /dev/mmcblk2p14
lrwxrwxrwx 1 root root 15 Jul 1 20:29 mtd_program -> /dev/mmcblk2p12
lrwxrwxrwx 1 root root 14 Jul 1 20:29 mtd_runtime -> /dev/mmcblk2p9
lrwxrwxrwx 1 root root 14 Jul 1 20:29 mtd_uboot -> /dev/mmcblk2p1
lrwxrwxrwx 1 root root 15 Jul 1 20:29 mtd_updateinfo -> /dev/mmcblk2p11
3. RK设备在内核引导时(start_kernel)打印的boot传进来的cmdline:
Kernel command line: user_debug=31 storagemedia=mtd androidboot.storagemedia=mtd androidboot.mode=normal uboot_version=65541 androidboot.slot_suffix= androidboot.serialno=229c8a227dfdc6dc coherent_pool=64K earlycon=uart8250,mmio32,0xff570000 console=ttyFIQ0 ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs snd_aloop.index=7 usbcore.old_scheme_first=1 mtdparts=spi-nand0:0xa0000@0x0(gpt),0x200000@0xa0000(uboot),0x200000@0x2a0000(bootlogo),0x400000@0x4a0000(boot),0x8400000@0x8a0000(program),0x900000@0x8ca0000(config),0x80000@0x95a0000(cliinfo),0x80000@0x9620000(mtd_runtime),0x80000@0x96a0000(update),0x6840000@0x9720000(data)