我的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差不多,感興趣的可以仿照上面自己去看看