我的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差不多,感兴趣的可以仿照上面自己去看看
来源:https://www.cnblogs.com/YinShijia/p/12018460.html