linux driver ------ 三星公司uboot模式下更改分區(EMMC)大小fdisk命令 ------ iTOP4412 開發板燒寫

核心板android

SCP 1G小程序

eMMC:KLM8G------>8G函數

 

 

終端(串口)輸入(若是執行過,只須要執行最後一句便可):

開發板一啓動,立馬在終端按回車,進入 uboot 模式工具

fdisk -c 0 (0表明eMMC,1表明TF卡)
fatformat mmc 0:1
ext3format mmc 0:2
ext3format mmc 0:3
ext3format mmc 0:4
fastboot
spa

開發板OTG鏈接到電腦(電腦須要安裝ADB 驅動),打開cmd.exe,輸入:

fastboot.exe flash bootloader u-boot-iTOP-4412.bin(u-boot,燒過能夠不燒)命令行

fastboot.exe flash kernel zImage(內核)code

fastboot.exe flash ramdisk ramdisk-uboot.img(文件系統) orm

fastboot.exe flash system system.img (根文件系統,rootfs)blog

fastboot -w ( 擦除userdata分區和cache分區 )開發

fastboot reboot

 

若是是最小文件系統,system.img不同外,「u-boot-iTOP-4412.bin」文件不用燒寫 ,「zImage」、"ramdisk-uboot.img "和 Linux-QT 系統相同

fastboot.exe 程序

用戶在燒寫的時候,會發現全部的燒寫命令前面都會添加「fastboot」,這些 fastboot命令以及「fastboot.exe」小程序,都是三星在 Google 提供的 ADB 驅動以及「adb.exe」程序的基礎上作的。固然,fastboot 命令只能用來和 exynos4412 的 uboot 模式進行交互

 

 

1、分區

三星平臺通常把emmc(或者NAND)分爲四個區:

(1)、fat分區,做爲sd卡用;

(2)、系統分區,至關爲電腦c 盤,用來安裝android系統;

(3)、userdata分區;

(4)、cache分區。

2、分區更改操做過程

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)

 

 二、從新分區 fdisk -c 0 命令,即按 /common/cmd_mmc_fdisk.c 把 emmc 分紅4個規定大小的分區

 

三、對分出來的4個區進行格式化(清空數據),並格式化爲特定的文件系統格式

3.一、輸入以下命令 fatformat mmc 0:1

3.二、輸入以下命令fatformat mmc 0:2

3.三、輸入以下命令fatformat mmc 0:3

3.四、輸入以下命令fatformat mmc 0:4

 

3.5在超級終端中輸入「fastboot」

 四、把整個系統從新燒錄

在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  

 

 3、fdisk 命令分析

一、命令定義

U_BOOT_CMD( fdisk, 6, 0, do_fdisk, "fdisk\t- fdisk for sd/mmc.\n", "-c <device_num>\t- create partition.\n"
    "fdisk -p <device_num> [<sys. part size(MB)> <user data part size> <cache part size>]\t- print partition information\n" );

二、do_fdisk的實現函數

   咱們平時用的fdisk -c 0 格式化emmc ,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 //若是不知足argc條件,打印出幫助信息
 { 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; }

三、若是爲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]); //得到塊信息,以512 爲單位
    if (total_block_count < 0) return -1; //格式化INAND
    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); //和fdisk –p 0 做用同樣,打印出分區信息
    return 0; }

 

四、咱們看下格式化函數make_mmc_partition是怎麼實現的吧。

這裏面有兩上參考比較重要:block_start 、block_offset;每一個區塊的開始和大小(偏移量),咱們畫個圖來更好的表示這個吧。

 

在這裏咱們能夠看到

#define        SYSTEM_PART_SIZE        (300*1024*1024)
#define        USER_DATA_PART_SIZE        (600*1024*1024)
#define        CACHE_PART_SIZE            (300*1024*1024)

這幾宏的應用,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; }

五、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; }
相關文章
相關標籤/搜索