uboot启动时向kernel传参之 logo显示(2)

一。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 

                

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:Age of Ai 设计师:meimeiellie 返回首页
评论

打赏作者

Martin_良文

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值