本文共 6427 字,大约阅读时间需要 21 分钟。
三星公司uboot模式下更改分区(EMMC)大小fdisk命令
一、分区
三星平台一般把它分为四个区:
(1)、fat分区,作为sd卡用;
(2)、系统分区,相当为电脑c 盘,用来安装android系统;
(3)、userdata分区;
(4)、cache分区。
二、分区更改操作过程
1, 更改uboot中代码/common/cmd_mmc_fdisk.c
在这个文件中我们可以看到对四个分区大小的定义:
#define BLOCK_SIZE 512#define BLOCK_END 0xFFFFFFFF#define _10MB (10*1024*1024)#define _100MB (100*1024*1024)#define _300MB (300*1024*1024)#define _8_4GB (1023*254*63)#define _1GB (1024*1024*1024)#define DISK_START RAW_AREA_SIZE//mj (16*1024*1024) //same as raw area size#define SYSTEM_PART_SIZE _1GB //_300MB#define USER_DATA_PART_SIZE _1GB //_300MB //_1GB#define CACHE_PART_SIZE _300MB#define CHS_MODE 0#define LBA_MODE !(CHS_MODE)
2、重新分区 fdisk -c 0 命令
3、分区格式法
3.1、输入如下命令 fatformat mmc 0:1
3.2、输入如下命令fatformat mmc 0:2
3.3、输入如下命令fatformat mmc 0:3
3.4、输入如下命令fatformat mmc 0:4
3.5在超级终端中输入“fastboot”
4、把整个系统重新烧录
在PC机上运行“USB_fastboot_tool”-->“platform-tools”文件夹中的文件
“cmd.exe”(cmd.exe可执行文件是Windows自带的命令行工具,光盘里面的是Win7下
的,如果提示版本不兼容,请使用你自己系统里面的cmd.exe工具)
- fastboot.exe flash bootloader u-boot-iTOP-4412.bin
- fastboot.exe flash kernel zImage
- fastboot.exe flash ramdisk ramdisk-uboot.img
- fastboot.exe flash system system.img
-
三、fdisk 命令分析
- 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 data part size> <cache part size>]\n");
- }
- return 0;
- }
2、do_fdisk的实现函数
我们平时用的fdisk -c 0 格式化inand ,fdisk -p 0 查看分区信息,在这里可以看到对这两条命令的解析:
- 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 data part size> <cache part size>]\n");
- }
- return 0;
- }
3、如果为fdisk -c 0进,进入 create_mmc_fdisk,我们再分析这个函数
- int create_mmc_fdisk(int argc, char *argv[])
- {
- int rv;
- int total_block_count;
- unsigned char mbr[512];
- memset(mbr, 0x00, 512);
- total_block_count = get_mmc_block_count(argv[2]);
- if (total_block_count < 0)
- return -1;
-
- make_mmc_partition(total_block_count, mbr, (argc==6?1:0), argv);
-
- rv = put_mmc_mbr(mbr, argv[2]);
- if (rv != 0)
- return -1;
-
- printf("fdisk is completed\n");
-
- argv[1][1] = 'p';
- print_mmc_part_info(argc, argv);
- return 0;
- }
4、我们看下格式化函数make_mmc_partition是怎么实现的吧。
这里面有两上参考比较重要:block_start 、block_offset;每个区块的开始和大小(偏移量),我们画个图来更好的表示这个吧。
在这里我们可以看到
#define SYSTEM_PART_SIZE _1GB //_300MB#define USER_DATA_PART_SIZE _1GB //_300MB //_1GB#define CACHE_PART_SIZE _300MB
这几宏的应用,block_start= calc_unit(CFG_PARTITION_START, sdInfo),计算分区大小
- int make_mmc_partition(int total_block_count, unsigned char *mbr, int flag, char *argv[])
- {
- int block_start = 0, block_offset;
-
- SDInfo sdInfo;
- PartitionInfo partInfo[4];
- memset((unsigned char *)&sdInfo, 0x00, sizeof(SDInfo));
- get_SDInfo(total_block_count, &sdInfo);
-
-
- block_start = calc_unit(CFG_PARTITION_START, sdInfo);
- if (flag)
- block_offset = calc_unit((unsigned long long)simple_strtoul(argv[3], NULL, 0)*1024*1024, sdInfo);
- else
- block_offset = calc_unit(SYSTEM_PART_SIZE, sdInfo);
-
- partInfo[0].bootable = 0x00;
- partInfo[0].partitionId = 0x83;
-
- make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[0]);
-
-
- block_start += block_offset;
- if (flag)
- block_offset = calc_unit((unsigned long long)simple_strtoul(argv[4], NULL, 0)*1024*1024, sdInfo);
- else
- block_offset = calc_unit(USER_DATA_PART_SIZE, sdInfo);
-
- partInfo[1].bootable = 0x00;
- partInfo[1].partitionId = 0x83;
-
- make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[1]);
-
-
- block_start += block_offset;
- if (flag)
- block_offset = calc_unit((unsigned long long)simple_strtoul(argv[5], NULL, 0)*1024*1024, sdInfo);
- else
- block_offset = calc_unit(CACHE_PART_SIZE, sdInfo);
-
- partInfo[2].bootable = 0x00;
- partInfo[2].partitionId = 0x83;
-
- make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[2]);
-
-
- block_start += block_offset;
- block_offset = BLOCK_END;
-
- partInfo[3].bootable = 0x00;
- partInfo[3].partitionId = 0x0C;
-
- make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[3]);
-
-
- memset(mbr, 0x00, sizeof(mbr));
- mbr[510] = 0x55; mbr[511] = 0xAA;
-
- encode_partitionInfo(partInfo[0], &mbr[0x1CE]);
- encode_partitionInfo(partInfo[1], &mbr[0x1DE]);
- encode_partitionInfo(partInfo[2], &mbr[0x1EE]);
- encode_partitionInfo(partInfo[3], &mbr[0x1BE]);
-
- return 0;
- }
5、fidsk – p 0的实现函数也很简单
- int print_mmc_part_info(int argc, char *argv[])
- {
- int rv;
-
- PartitionInfo partInfo[4];
-
- rv = get_mmc_part_info(argv[2], 1, &(partInfo[0].block_start), &(partInfo[0].block_count),
- &(partInfo[0].partitionId) );
-
- rv = get_mmc_part_info(argv[2], 2, &(partInfo[1].block_start), &(partInfo[1].block_count),
- &(partInfo[1].partitionId) );
-
- rv = get_mmc_part_info(argv[2], 3, &(partInfo[2].block_start), &(partInfo[2].block_count),
- &(partInfo[2].partitionId) );
-
- rv = get_mmc_part_info(argv[2], 4, &(partInfo[3].block_start), &(partInfo[3].block_count),
- &(partInfo[3].partitionId) );
-
- printf("\n");
- printf("partion # size(MB) block start # block count partition_Id \n");
-
- if ( (partInfo[0].block_start !=0) && (partInfo[0].block_count != 0) )
- printf(" 1 %6d %8d %8d 0x%.2X \n",
- (partInfo[0].block_count / 2048), partInfo[0].block_start,
- partInfo[0].block_count, partInfo[0].partitionId);
-
- if ( (partInfo[1].block_start !=0) && (partInfo[1].block_count != 0) )
- printf(" 2 %6d %8d %8d 0x%.2X \n",
- (partInfo[1].block_count / 2048), partInfo[1].block_start,
- partInfo[1].block_count, partInfo[1].partitionId);
-
- if ( (partInfo[2].block_start !=0) && (partInfo[2].block_count != 0) )
- printf(" 3 %6d %8d %8d 0x%.2X \n",
- (partInfo[2].block_count / 2048), partInfo[2].block_start,
- partInfo[2].block_count, partInfo[2].partitionId);
-
- if ( (partInfo[3].block_start !=0) && (partInfo[3].block_count != 0) )
- printf(" 4 %6d %8d %8d 0x%.2X \n",
- (partInfo[3].block_count / 2048), partInfo[3].block_start,
- partInfo[3].block_count, partInfo[3].partitionId);
-
- return 1;
- }