U-Boot之磁盘格式化分区命令实现

空扰寡人 提交于 2019-12-10 18:56:28

我的linux学习是建立在讯为的iTop-4412开发板上的,讯为开发板使用手册里面有教我们怎么利用U-Boot命令进行EMMC格式化分区,以前照着做是为了快速上手,但现在不行了,现在我要搞清楚它们到底是怎么实现的,下面开始我们的探索。

先看看格式化命令长什么样

fdisk -c 0
fatformat mmc 0:1
ext3format mmc 0:2
ext3format mmc 0:3
ext3format mmc 0:4

第一个命令fdisk -c 0,我利用vscode的全局搜索功能搜索fdisk,在cmd_mmc_disk.c这个文件中找到了一个相关的函数,如下所示

int do_fdisk(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    if ( argc == 3 || argc ==6 )
    {
        if ( strcmp(argv[1], "-c") == 0 )
            return create_mmc_fdisk(argc, argv);
        else if ( strcmp(argv[1], "-p") == 0 )
            return print_mmc_part_info(argc, argv);
    }
    else
    {
        printf("Usage:\nfdisk <-p> <device_num>\n");
        printf("fdisk <-c> <device_num> [<sys. part size(MB)> <user part size> <cache part size>]\n");
    }
    return 0;
}

一行注释也没有,但还好代码量不大,我们可以大概看出函数的意思:首先判断参数个数,然后判断参数的第二个参数是否为"-c",如果为"-c"就执行格式化分区命令,如果为"-p",就打印当前分区信息,如果参数个数不正确,就打印错误提示信息,结束。

当我们输入fdisk -c 0时,参数个数为3,满足要求,进入下一层判断,由于第二个参数为"-c",所以会执行格式化分区命令,可以自己试试看。也可以照着代码逻辑输入一些其它的命令,观察结果,应该和预料的是一样的。

那么分区具体是如何创建的,感兴趣的小伙伴可以自己进create_mmc_fdisk这个函数里面看看。

第二个命令是fatformat mmc 0:1,我利用vscode的全局搜索功能搜索fatformat,在cmd_fat.c这个文件中找到了一个相关的函数,如下所示

int do_fat_format(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    int dev = 0;
    int part = 1;
    char *ep;
    block_dev_desc_t *dev_desc = NULL;

    //判断参数个数是是否正确
    if (argc < 2) {
        printf ("usage : fatformat <interface> <dev[:part]>\n");
        return(0);
    }
    //获取设备区块号
    dev = (int)simple_strtoul (argv[2], &ep, 16);
    //获取设备号
    dev_desc = get_dev(argv[1], dev);
    
    //如果设备号不存在,则输出错误信息
    if (dev_desc == NULL) {
        puts ("\n ** Invalid boot device **\n");
        return 1;
    }
    //初始化设备
    init_part(dev_desc); //mj fixed the bug
    //这里需要先去上网了解一下simple_stroul的功能,ep指向":xxx"这样一个字符串,下面就是判断":"后面的数字是否满足要求
    if (*ep) {
        if (*ep != ':') {
            puts ("\n ** Invalid boot device, use 'dev[:part]' **\n");
            return 1;
        }
        part = (int)simple_strtoul(++ep, NULL, 16);
        if (part > 4 || part <1) {
            puts ("** Partition Number should be 1 ~ 4 **\n");
        }
    }
    //打印开始格式化提示信息
    printf("Start format MMC&d partition&d ...\n", dev, part);
    //开始格式化,如果对具体是如何格式化的感兴趣,可以去这个fat_format_device里面看看
    if (fat_format_device(dev_desc, part) != 0) {
        printf("Format failure!!!\n");
    }

    return 0;
}

代码量也不是大,在外面不方便,所以我在代码里面打注释了

下面的几个ext3format和fatformat差不多,感兴趣的可以仿照上面自己去看看

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!