uboot 下更改NAND的分区 fdisk
uboot 下更改NAND的分区 fdisk
分类: S5PXX(三星)2012-07-01 18:59 8946人阅读 评论(7) 收藏 举报
关键词:android 4.0 nand 分区 userdata 大小 fdisk
平台信息:
内核:linux3.0
系统:android4.0.3
INAND:SDIN5C2-8G-L(SanDisk)
平台:S5PV310(samsung exynos 4210)
一、NAND分区大小:
我们的机器用的是8G的INAND,三星平台一般把它分为四个区:
(1)、fat分区,作为sd卡用;
(2)、系统分区,相当为电脑c 盘,用来安装android系统;
(3)、userdata分区;
(4)、cache分区。
二、分区更改操作过程
1, 更改uboot中代码/common/cmd_mmc_fdisk.c
在这个文件中我们可以看到对四个分区大小的定义:
[cpp] view plaincopy
- #define SYSTEM_PART_SIZE (300*1024*1024)
- #define USER_DATA_PART_SIZE (600*1024*1024)
- #define CACHE_PART_SIZE (300*1024*1024)
2,编译uboot 、烧录
#sudo fastboot flash bootloader u-boot.bin(三星平台的命令,不同平台也许不同)
重启,进入uboot命令行模式,一定要重启。
3,重新分区 fdisk -c 0
#fdisk –c 0 //重新把INAND分区
#fdisk –p 0 //查看INAND分区信息
如下所示,600MB为我们新分的空间。
[html] view plaincopy
- SMDKV310 # fdisk -c 0
- Count: 10000
- fdisk is completed
- partion # size(MB) block start # block count partition_Id
- 1 6233 2610960 12766380 0x0C //fat分区,作为sd卡用
- 2 303 136620 622380 0x83 //系统分区,相当为电脑c 盘
- 3 600 759000 1229580 0x83 //userdata分区
- 4 303 1988580 622380 0x83 //cache分区
4,把整个系统区重新格式化
系统重重分区后,原来烧录程序位置发生改变,系统分区(相当于电脑的c盘)也变化,所以要重新格式化。(下面的命令是三星平台下的,因平台而不同)
[html] view plaincopy
- fatformat mmc 0:1
- ext4fromat mmc 0:2
- ext4fromat mmc 0:3
- ext4fromat mmc 0:4
5、把整个系统重新烧录
[html] view plaincopy
- sudo fastboot flash fwbl1 v310N.nbl1.bin
- sudo fastboot flash bootloader u-boot.bin
- sudo fastboot flash zImage
- sudo fastboot flash ramdisk-uboot.img
- sudo fastboot flash system.img
6,打开机器,如下图所示,查看更改结果
三、fdisk 命令分析
1、命令定义
[cpp] view plaincopy
- 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"
- );
2、do_fdisk的实现函数
我们平时用的fdisk -c 0 格式化inand ,fdisk -p 0 查看分区信息,在这里可以看到对这两条命令的解析:
[cpp] view plaincopy
- 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;
- }
3、如果为fdisk -c 0进,进入 create_mmc_fdisk,我们再分析这个函数
[cpp] view plaincopy
- 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;
- }
4、我们看下格式化函数make_mmc_partition是怎么实现的吧。
这里面有两上参考比较重要:block_start 、block_offset;每个区块的开始和大小(偏移量),我们画个图来更好的表示这个吧。
在这里我们可以看到
[cpp] view plaincopy
- #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),计算分区大小
[cpp] view plaincopy
- 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的实现函数也很简单
[cpp] view plaincopy
- 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;
- }
uboot 下更改NAND的分区 fdisk的更多相关文章
- linux driver ------ 三星公司uboot模式下更改分区(EMMC)大小fdisk命令 ------ iTOP4412 开发板烧写
核心板 SCP 1G eMMC:KLM8G------>8G 终端(串口)输入(如果执行过,只需要执行最后一句即可): 开发板一启动,立马在终端按回车,进入 uboot 模式 fdisk -c ...
- Linux和Uboot下eMMC boot分区读写
关键词:eMMC boot.PARTITION_CONFIG.force_ro等. 1. eMMC的分区 大部分eMMC都有类似如下的分区,其中BOOT.RPMB和UDA一般是默认存在的,gpp分区需 ...
- linux磁盘分区fdisk命令操作(实践)
写这篇的目的,还是要把整个过程完整的记录下来,特别是小细节的地方,通常很多情况是一知半解,平时不实践操作只凭看是没有用的,所以做这个行业就是要多动手,多学习,多思考慢慢你的思路也会打开.练就自己的学习 ...
- windows下能读写linux分区的软件 转
1. ext2ifs 这个工具与explore2fs都是John Newbigin使用Delphi写的,explore2fs Copyright (C) 2000,Ext2IFS v0.3 Copyr ...
- MTD下的Nand驱动
目录 MTD下的Nand驱动 引入 平台设备资源文件 关键数据结构 平台框架 s3c24xx_nand_probe nand_scan s3c2410_nand_add_partition add_m ...
- uboot下emmc内容烧写(拷贝)步骤
一.目的:嵌入式开发板,通过emmc上的内核文件加载启动linux操作系统,以及存放其他程序文件.需要将所需文件先写入emmc中. 二.总体步骤是:uboot启动后,进入linux下,将emmc分区并 ...
- 通过uboot传参设置mtd分区流程源码分析
因为公司同事反映他使用的开板无法将根目录下的ip_work目mounth成功,由于本人当时没有去现场查看问题,只是象征性的询问内核是否创建了/dev/mtdblock5设备节点,因为该开发板默认是挂载 ...
- (三)修改内核大小,适配目标板Nand flash分区配置
一. 修改内核大小 1. 在你的配置文件下uboot/include/config/xxx.h 里面有一个宏定义 #define MTDPARTS_DEFAULT "mtdparts=jz2 ...
- centOS 6.8下使用Gparted进行分区扩容
centOS 6.8下使用Gparted进行分区扩容 机器环境:windows上运行的VMware虚拟机,系统为centOS 6.8. 由于前期分区分配空间过小,无法满足后续的数据存储预期,所 ...
随机推荐
- Bypass X-WAF SQL注入防御(多姿势)
0x00 前言 X-WAF是一款适用中.小企业的云WAF系统,让中.小企业也可以非常方便地拥有自己的免费云WAF. 本文从代码出发,一步步理解WAF的工作原理,多姿势进行WAF Bypass. ...
- 运行RF测试案例,显示unable to open socket to "localhost:56505" error: [Errno 10061] 错误,且关闭RF卡死的解决办法
问题描述: 执行WEB ui测试案例后,执行请他的测试案例显示unable to open socket to "localhost:56505" error: [Errno 10 ...
- Python 编程技巧
Python 生成器 Python 处理文件 Python 异常处理 Python 处理输入输出 Python 处理命令行参数 Python 对文件做校验 Python 对目录做遍历 Python 调 ...
- Selenium 切换 Frame
我们知道网页中有一种节点叫作 iframe ,也就是子 Frame ,相当于页面的子页面,它的结构和外部网页的结构完全一致. Selenium 打开页面后,它默认是在父级 Frame 里面操作,而此时 ...
- c语言指针笔记
一.int a[20]1. 数组名代表数组首元素的地址,不代表数组的地址2. 对数组名取地址代表整个数组的地址.a和&a代表的数据类型不一样 a代表数组首元素的地址 &a数组类型 in ...
- CDN的那些细枝末节
起源: 原本打算系统看看关于axios的介绍,无意中就看见一句"Using cdn",于是百度一下,"cdn"是什么? 名词解释:CDN CDN的全称是Cont ...
- 使用es6的蹦床函数解决递归造成的堆栈溢出
首先,我们先定义一个函数,使用递归的思想写求和的方法: function sum(x, y) { if (y > 0) { return sum(x + 1, y - 1); } else ...
- 【转载】.NET 开发者必备的工具箱
本文作者Spencer是一名专注于ASP.NET和C#的程序员,他列举了平时工作.在家所使用的大部分开发工具,其中大部分工具都是集中于开发,当然也有一些其它用途的,比如图片处理.文件压缩等. 如果你是 ...
- 三.jquery.datatables.js表格编辑与删除
1.为了使用如图效果(即将按钮放入行内http://www.datatables.net/examples/ajax/null_data_source.html) 采用了另一个数据格式 2.后台php ...
- 【错误整理】ora-00054:resource busy and acquire with nowait specified解决方法【转】
当某个数据库用户在数据库中插入.更新.删除一个表的数据,或者增加一个表的主键时或者表的索引时,常常会出现ora-00054:resource busy and acquire with nowait ...