U-Boot之磁盤格式化分區命令實現


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM