核心板

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

开发板OTG连接到电脑(电脑需要安装ADB 驱动),打开cmd.exe,输入:

fastboot.exe flash bootloader u-boot-iTOP-4412.bin(u-boot,烧过可以不烧)

fastboot.exe flash kernel zImage(内核)

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

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

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 模式进行交互

一、分区

三星平台一般把emmc(或者NAND)分为四个区:

(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 命令,即按 /common/cmd_mmc_fdisk.c 把 emmc 分成4个规定大小的分区

3、对分出来的4个区进行格式化(清空数据),并格式化为特定的文件系统格式

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-.bin
fastboot.exe flash kernel zImage
fastboot.exe flash ramdisk ramdisk-uboot.img 
fastboot.exe flash system system.img  

三、fdisk 命令分析

1、命令定义

U_BOOT_CMD(
fdisk, , , 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"
);

2、do_fdisk的实现函数

我们平时用的fdisk -c 0 格式化emmc ,fdisk -p 0 查看分区信息,在这里可以看到对这两条命令的解析:

int do_fdisk(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
if ( argc == || argc == )
{
if ( strcmp(argv[], "-c") == )
return create_mmc_fdisk(argc, argv); //格式化分区
else if ( strcmp(argv[], "-p") == )
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 ;
}

3、如果为fdisk -c 0进,进入 create_mmc_fdisk,我们再分析这个函数

int create_mmc_fdisk(int argc, char *argv[])
{
int rv;
int total_block_count;
unsigned char mbr[];
memset(mbr, 0x00, );
total_block_count = get_mmc_block_count(argv[]); //获得块信息,以512 为单位
if (total_block_count < )
return -;
//格式化INAND
make_mmc_partition(total_block_count, mbr, (argc==?:), argv); rv = put_mmc_mbr(mbr, argv[]);
if (rv != )
return -; printf("fdisk is completed\n"); //分区成功,打印信息 argv[][] = 'p';
print_mmc_part_info(argc, argv); //和fdisk –p 0 作用一样,打印出分区信息
return ;
}

4、我们看下格式化函数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 = , block_offset; SDInfo sdInfo;
PartitionInfo partInfo[];
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[], NULL, )**, sdInfo);
else
block_offset = calc_unit(SYSTEM_PART_SIZE, sdInfo);//计算分区大小,这里面的值是不是很熟悉,就是我们开始改那些地方,这个是系统分区的 partInfo[].bootable = 0x00;
partInfo[].partitionId = 0x83; make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[]);//开始分区 ///////////////////////////////////////////////////////////
block_start += block_offset;//更改下一个分析的开始地址,这样可以保证分区连续
if (flag)
block_offset = calc_unit((unsigned long long)simple_strtoul(argv[], NULL, )**, sdInfo);
else
block_offset = calc_unit(USER_DATA_PART_SIZE, sdInfo); partInfo[].bootable = 0x00;
partInfo[].partitionId = 0x83; make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[]); ///////////////////////////////////////////////////////////
block_start += block_offset;
if (flag)
block_offset = calc_unit((unsigned long long)simple_strtoul(argv[], NULL, )**, sdInfo);
else
block_offset = calc_unit(CACHE_PART_SIZE, sdInfo); partInfo[].bootable = 0x00;
partInfo[].partitionId = 0x83; make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[]); ///////////////////////////////////////////////////////////
block_start += block_offset;
block_offset = BLOCK_END; partInfo[].bootable = 0x00;
partInfo[].partitionId = 0x0C; make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[]); ///////////////////////////////////////////////////////////
memset(mbr, 0x00, sizeof(mbr));
mbr[] = 0x55; mbr[] = 0xAA; encode_partitionInfo(partInfo[], &mbr[0x1CE]);
encode_partitionInfo(partInfo[], &mbr[0x1DE]);
encode_partitionInfo(partInfo[], &mbr[0x1EE]);
encode_partitionInfo(partInfo[], &mbr[0x1BE]); return ;
}

5、fidsk – p 0的实现函数也很简单

int print_mmc_part_info(int argc, char *argv[])
{
int rv; PartitionInfo partInfo[]; rv = get_mmc_part_info(argv[], , &(partInfo[].block_start), &(partInfo[].block_count),
&(partInfo[].partitionId) ); rv = get_mmc_part_info(argv[], , &(partInfo[].block_start), &(partInfo[].block_count),
&(partInfo[].partitionId) ); rv = get_mmc_part_info(argv[], , &(partInfo[].block_start), &(partInfo[].block_count),
&(partInfo[].partitionId) ); rv = get_mmc_part_info(argv[], , &(partInfo[].block_start), &(partInfo[].block_count),
&(partInfo[].partitionId) ); printf("\n");
printf("partion # size(MB) block start # block count partition_Id \n"); if ( (partInfo[].block_start !=) && (partInfo[].block_count != ) )
printf(" 1 %6d %8d %8d 0x%.2X \n",
(partInfo[].block_count / ), partInfo[].block_start,
partInfo[].block_count, partInfo[].partitionId); if ( (partInfo[].block_start !=) && (partInfo[].block_count != ) )
printf(" 2 %6d %8d %8d 0x%.2X \n",
(partInfo[].block_count / ), partInfo[].block_start,
partInfo[].block_count, partInfo[].partitionId); if ( (partInfo[].block_start !=) && (partInfo[].block_count != ) )
printf(" 3 %6d %8d %8d 0x%.2X \n",
(partInfo[].block_count / ), partInfo[].block_start,
partInfo[].block_count, partInfo[].partitionId); if ( (partInfo[].block_start !=) && (partInfo[].block_count != ) )
printf(" 4 %6d %8d %8d 0x%.2X \n",
(partInfo[].block_count / ), partInfo[].block_start,
partInfo[].block_count, partInfo[].partitionId); return ;
}

 

linux driver ------ 三星公司uboot模式下更改分区(EMMC)大小fdisk命令 ------ iTOP4412 开发板烧写的更多相关文章

  1. [嵌入式开发板]iTOP-4412开发板linux 系统存储空间的修改

    平台:iTOP-4412开发板 这里我们以修改成 1G 存储空间为例来讲解修改方法, 如果需要改 成其他大小的存储空间,参照此方法修改即可. 首先连接好 iTOP-4412 开发板的调试串口到 pc  ...

  2. 超简单易用的 “在 pcduino 开发板上写 Linux 驱动控制板载 LED 的闪烁”

    版权声明:本文为博主原创文章,未经博主同意不得转载.转载联系 QQ 30952589,加好友请注明来意. https://blog.csdn.net/sleks/article/details/251 ...

  3. iTOP4412开发板-使用buildroot搭建最简单的linux

    本文档介绍的是使用buildroot搭建最简单的linux文件系统,Buildroot是Linux平台上一个构建嵌入式Linux系统的框架.整个Buildroot是由Makefile脚本和Kconfi ...

  4. Linux Vi/Vim 在插入模式下键盘右边数字键输入异常

    问题:Linux在 Vi/Vim 在编辑文件时遇到一个问题,当我在 Insert 模式下进行修改文件内容的时候,用到了键盘(104键,右边带数字键那种)进行数字输入,当我输入数字 “5” 时,插入的数 ...

  5. Linux中在vim/vi模式下对文本的查找和替换

    查找: 1.vim  filename  进入一般模式下 2.查找和替换方法 /word    向下查找word 的字符串  例如  /chengtingting   向下查找字符chengtingt ...

  6. Linux Shell脚本在service模式下的环境变量

    普通Shell脚本在终端下运行时,环境变量来自于init/profile/.bash_profile等,就是在当前终端下可以得到的环境,比如PATH.在service模式下,脚本运行在受限的环境中:比 ...

  7. iTOP-4412开发板---Linux系统学习下载步骤

    本文转自迅为论坛:http://www.topeetboard.com 1.cd /home/topeet/Linux-simple/console  下建立.c文件 2. 编译命令,就在此目录下 # ...

  8. [转载]iTOP-4412开发板搭建最小linux系统

    本文转迅为电子论坛:http://www.topeetboard.com 最小linux系统所需资料下载:http://pan.baidu.com/s/1kTNan0j 开发板不仅可以运行Androi ...

  9. nat模式下更改网络环境, 虚拟机中Linux无法上网的问题

    出现的问题: 1.ifconfig -a 命令下会出现eth0信息中无ip地址等等信息: 2.无法ping通baidu,也就是无法上网: 3.ping 8.8.8.8 提示 connect:netwo ...

随机推荐

  1. CF 961E Tufurama

    JYZdalao上课讲了这道题,觉得很好可做 其实也是一道理解了就水爆了的题目 把题意抽象化,可以发现题目求的满足 i<j a[i]>=j a[j]>=i 的i,j对数.由于i,j顺 ...

  2. STM32烧录的常用方式

    stm32烧录常用的方式一般为ST-LINK(或者J-tag)下载仿真和ISP下载 一.仿真器下载 仿真器分为J-TAG和SWD仿真,SWD仿真只需要4根线(VCC.GND.CLK.DATA)就可以了 ...

  3. Hadoop日记Day9---HDFS的java访问接口

    一.搭建Hadoop 开发环境 我们在工作中写完的各种代码是在服务器中运行的,HDFS 的操作代码也不例外.在开发阶段,我们使用windows 下的eclipse 作为开发环境,访问运行在虚拟机中的H ...

  4. [LOJ#6039].「雅礼集训 2017 Day5」珠宝[决策单调性]

    题意 题目链接 分析 注意到本题的 \(C\) 很小,考虑定义一个和 \(C\) 有关的状态. 记 \(f(x,j)\) 表示考虑到了价格为 \(x\) 的物品,一共花费了 \(j\) 元的最大收益. ...

  5. PowerBI开发 第二篇:数据建模

    在分析数据时,不可能总是对单个数据表进行分析,有时需要把多个数据表导入到PowerBI中,通过多个表中的数据及其关系来执行一些复杂的数据分析任务,因此,为准确计算分析的结果,需要在数据建模中,创建数据 ...

  6. 微软职位内部推荐-Senior Dev Lead - SharePoint

    微软近期Open的职位: SharePoint is a multi-billion dollar enterprise business that has grown from an on-prem ...

  7. group by 和count的联合使用问题 [转]

    group by 和count的联合使用问题 今天写查询语句遇到一个问题,就是用group by进行分组以后,用count统计分组以后的个数, 开始写的语句大体是: select count(m.fb ...

  8. Android中应用contentprovider来创建数据库的一些步骤

    http://blog.csdn.net/xiaodongvtion/article/details/7865669 1:首先创建一个xxprovider的class,它是extendscontent ...

  9. 跟踪分析Linux内核的启动过程小解

    跟踪分析Linux内核的启动过程 “20135224陈实  + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...

  10. java实验报告二

    一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 二.实验步骤 (一)单元 ...