• MTD之 UBOOT向内核传参


    一。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字节为一个扇区。

    1. #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)"
    2. #if (defined QPTSV2R2B10) /* 3516dv300 STM 门禁 16G emmc */
    3. #define BOOT_LOGO_SIZE 0x1000000 /* bootlogo 16M */
    4. #define PROGRAM_SIZE 0x16000000 /* program 352M */
    5. /* 多平台共用 */
    6. #define UBOOT_SIZE 0x100000 /* uboot 1M */
    7. #define KERNEL_SIZE 0x1000000 /* kernel 16M */
    8. #define KERNEL_BAK_SIZE KERNEL_SIZE /* kernel_bak 16M */
    9. #define CONFIG_SIZE 0x1000000 /* config 16M */
    10. #define CONFIG_BAK_SIZE CONFIG_SIZE /* config_bak 16M */
    11. #define CFG_CLINFO_DATA_SIZE 0x100000 /* cliinfo 1M */
    12. #define CFG_CLINFO_DATA_BAK_SIZE CFG_CLINFO_DATA_SIZE /* cliinfo_bak 1M */
    13. #define MTD_RUNTIME_SIZE 0x100000 /* mtd_runtime 1M */
    14. #define CALIBRATION_SIZE 0x2000000 /* calibration 32M */
    15. #define UPDATE_SIZE 0x80000 /* update 512K */
    16. /* 根据各分区大小计算起始地址 */
    17. #define UBOOT_START_ADDRESS 0
    18. #define BOOT_LOGO_ADDRESS (UBOOT_START_ADDRESS + UBOOT_SIZE)
    19. #define KERNEL_START_ADDRESS (BOOT_LOGO_ADDRESS + BOOT_LOGO_SIZE)
    20. #define KERNEL_BAK_START_ADDRESS (KERNEL_START_ADDRESS + KERNEL_BAK_SIZE)
    21. #define CONFIG_BAK_START_ADDRESS (CONFIG_START_ADDRESS + CONFIG_SIZE)
    22. #define CFG_CLINFO_DATA_ADDRESS (CONFIG_BAK_START_ADDRESS + CONFIG_BAK_SIZE)
    23. #define CFG_CLINFO_DATA_BAK_ADDRESS (CFG_CLINFO_DATA_ADDRESS + CFG_CLINFO_DATA_SIZE)
    24. #define MTD_RUNTIME_START_ADDRESS (CFG_CLINFO_DATA_BAK_ADDRESS + CFG_CLINFO_DATA_BAK_SIZE)
    25. #define CALIBRATION_START_ADDRESS (MTD_RUNTIME_START_ADDRESS + MTD_RUNTIME_SIZE)
    26. #define UPDATE_START_ADDRESS (CALIBRATION_START_ADDRESS + CALIBRATION_SIZE)
    27. #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 解释为:

    对于__init、__initdata和__exit、__exitdata; 上述宏定义的作用是告诉编译器将这些函数或者数据放入相应的section中,  比如:如果函数的定义中带有__init,那么这个函数的所有代码会被放入.init.text的section中,   如果函数的定义中带有__initdata,那么这个函数的所有代码会被放入.init.data的section中。 上述宏定义的详细定义如下:  比如上述提到的boot的参数吗,其实就是放在 init.data段中。
    1. #define __initdata __section(.init.data)
    2. #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) 

  • 相关阅读:
    【SpringBootStarter】自定义全局加解密组件
    RabbitMq
    Elasticsearch:Metadata fields - 元数据字段介绍
    打假Yolov7的精度,不是所有的论文都是真实可信
    git 提交代码,解决分支冲突,合并分支
    openssl中SM2、SM3、SM4使用实例
    webpack优化系列三:vue子目录路径更改---publicPath
    wcdma基站的重选和切换
    OpenAI Kubernetes 相关博文读后笔记
    演讲回顾 | 龙智专家分享“支撑、共享与安全:芯片开发中的数字资产管理”
  • 原文地址:https://blog.csdn.net/maliangwen_12138/article/details/125594687