核心板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; }