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

发布了147 篇原创文章 · 获赞 41 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/YinShiJiaW/article/details/103480805