uboot 下更改NAND的分区 fdisk

分类: S5PXX(三星)2012-07-01 18:59 8946人阅读 评论(7) 收藏 举报

flash平台cacheandroid三星null

关键词: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

  1. #define     SYSTEM_PART_SIZE        (300*1024*1024)
  2. #define     USER_DATA_PART_SIZE     (600*1024*1024)
  3. #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

  1. SMDKV310 # fdisk -c 0 
  2. Count: 10000 
  3. fdisk is completed 
  4. partion # size(MB) block start # block count partition_Id  
  5.   1 6233 2610960 12766380 0x0C       //fat分区,作为sd卡用   
  6.   2 303 136620 622380 0x83           //系统分区,相当为电脑c 盘 
  7.   3 600 759000 1229580 0x83          //userdata分区 
  8.   4 303 1988580 622380 0x83          //cache分区 

4,把整个系统区重新格式化

系统重重分区后,原来烧录程序位置发生改变,系统分区(相当于电脑的c盘)也变化,所以要重新格式化。(下面的命令是三星平台下的,因平台而不同)

[html] view plaincopy

  1. fatformat mmc 0:1 
  2. ext4fromat mmc 0:2 
  3. ext4fromat mmc 0:3 
  4. ext4fromat mmc 0:4 

5、把整个系统重新烧录

[html] view plaincopy

  1. sudo fastboot flash fwbl1 v310N.nbl1.bin  
  2. sudo fastboot flash bootloader u-boot.bin  
  3. sudo fastboot flash zImage 
  4. sudo fastboot flash ramdisk-uboot.img 
  5. sudo fastboot flash system.img 

6,打开机器,如下图所示,查看更改结果

三、fdisk 命令分析

1、命令定义

[cpp] view plaincopy

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

2、do_fdisk的实现函数

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

[cpp] view plaincopy

  1. int do_fdisk(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 
  2. if ( argc == 3 || argc ==6 ) 
  3.     { 
  4. if ( strcmp(argv[1], "-c") == 0 ) 
  5. return create_mmc_fdisk(argc, argv);  //格式化分区
  6. else if ( strcmp(argv[1], "-p") == 0 ) 
  7. return print_mmc_part_info(argc, argv); //打印出分区的信息
  8.     } 
  9. else //如果不满足argc条件,打印出帮助信息
  10.     { 
  11.         printf("Usage:\nfdisk <-p> <device_num>\n"); 
  12.         printf("fdisk <-c> <device_num> [<sys. part size(MB)> <user data part size> <cache part size>]\n"); 
  13.     } 
  14. return 0; 

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

[cpp] view plaincopy

  1. int create_mmc_fdisk(int argc, char *argv[]) 
  2. int     rv; 
  3. int     total_block_count; 
  4.     unsigned char   mbr[512]; 
  5.     memset(mbr, 0x00, 512);  
  6. total_block_count = get_mmc_block_count(argv[2]); //获得块信息,以512 为单位
  7. if (total_block_count < 0) 
  8. return -1; 
  9. //格式化INAND
  10.     make_mmc_partition(total_block_count, mbr, (argc==6?1:0), argv); 
  11.     rv = put_mmc_mbr(mbr, argv[2]); 
  12. if (rv != 0) 
  13. return -1; 
  14.     printf("fdisk is completed\n");  //分区成功,打印信息
  15.     argv[1][1] = 'p'; 
  16.     print_mmc_part_info(argc, argv);  //和fdisk –p 0 作用一样,打印出分区信息
  17. return 0; 

4、我们看下格式化函数make_mmc_partition是怎么实现的吧。

这里面有两上参考比较重要:block_start 、block_offset;每个区块的开始和大小(偏移量),我们画个图来更好的表示这个吧。

在这里我们可以看到

[cpp] view plaincopy

  1. #define     SYSTEM_PART_SIZE        (300*1024*1024)
  2. #define     USER_DATA_PART_SIZE     (600*1024*1024)
  3. #define     CACHE_PART_SIZE         (300*1024*1024)

这几宏的应用,block_start= calc_unit(CFG_PARTITION_START, sdInfo),计算分区大小

[cpp] view plaincopy

  1. int make_mmc_partition(int total_block_count, unsigned char *mbr, int flag, char *argv[]) 
  2. int     block_start = 0, block_offset; 
  3.     SDInfo      sdInfo; 
  4.     PartitionInfo   partInfo[4]; 
  5.     memset((unsigned char *)&sdInfo, 0x00, sizeof(SDInfo)); 
  6.     get_SDInfo(total_block_count, &sdInfo); 
  7. ///////////////////////////////////////////////////////////
  8.     block_start = calc_unit(CFG_PARTITION_START, sdInfo); //得到第一分区的开始地址
  9. if (flag) 
  10.         block_offset = calc_unit((unsigned long long)simple_strtoul(argv[3], NULL, 0)*1024*1024, sdInfo); 
  11. else
  12.         block_offset = calc_unit(SYSTEM_PART_SIZE, sdInfo);//计算分区大小,这里面的值是不是很熟悉,就是我们开始改那些地方,这个是系统分区的
  13.     partInfo[0].bootable    = 0x00; 
  14.     partInfo[0].partitionId = 0x83; 
  15.     make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[0]);//开始分区
  16. ///////////////////////////////////////////////////////////
  17.     block_start += block_offset;//更改下一个分析的开始地址,这样可以保证分区连续
  18. if (flag) 
  19.         block_offset = calc_unit((unsigned long long)simple_strtoul(argv[4], NULL, 0)*1024*1024, sdInfo); 
  20. else
  21.         block_offset = calc_unit(USER_DATA_PART_SIZE, sdInfo); 
  22.     partInfo[1].bootable    = 0x00; 
  23.     partInfo[1].partitionId = 0x83; 
  24.     make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[1]); 
  25. ///////////////////////////////////////////////////////////
  26.     block_start += block_offset; 
  27. if (flag) 
  28.         block_offset = calc_unit((unsigned long long)simple_strtoul(argv[5], NULL, 0)*1024*1024, sdInfo); 
  29. else
  30.         block_offset = calc_unit(CACHE_PART_SIZE, sdInfo); 
  31.     partInfo[2].bootable    = 0x00; 
  32.     partInfo[2].partitionId = 0x83; 
  33.     make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[2]); 
  34. ///////////////////////////////////////////////////////////
  35.     block_start += block_offset; 
  36.     block_offset = BLOCK_END; 
  37.     partInfo[3].bootable    = 0x00; 
  38.     partInfo[3].partitionId = 0x0C; 
  39.     make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[3]); 
  40. ///////////////////////////////////////////////////////////
  41.     memset(mbr, 0x00, sizeof(mbr)); 
  42.     mbr[510] = 0x55; mbr[511] = 0xAA; 
  43.     encode_partitionInfo(partInfo[0], &mbr[0x1CE]); 
  44.     encode_partitionInfo(partInfo[1], &mbr[0x1DE]); 
  45.     encode_partitionInfo(partInfo[2], &mbr[0x1EE]); 
  46.     encode_partitionInfo(partInfo[3], &mbr[0x1BE]); 
  47. return 0; 

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

[cpp] view plaincopy

  1. int print_mmc_part_info(int argc, char *argv[]) 
  2. int     rv; 
  3.     PartitionInfo   partInfo[4]; 
  4.     rv = get_mmc_part_info(argv[2], 1, &(partInfo[0].block_start), &(partInfo[0].block_count), 
  5.             &(partInfo[0].partitionId) ); 
  6.     rv = get_mmc_part_info(argv[2], 2, &(partInfo[1].block_start), &(partInfo[1].block_count), 
  7.             &(partInfo[1].partitionId) ); 
  8.     rv = get_mmc_part_info(argv[2], 3, &(partInfo[2].block_start), &(partInfo[2].block_count), 
  9.             &(partInfo[2].partitionId) ); 
  10.     rv = get_mmc_part_info(argv[2], 4, &(partInfo[3].block_start), &(partInfo[3].block_count), 
  11.             &(partInfo[3].partitionId) ); 
  12.     printf("\n");    
  13.     printf("partion #    size(MB)     block start #    block count    partition_Id \n"); 
  14. if ( (partInfo[0].block_start !=0) && (partInfo[0].block_count != 0) )  
  15.         printf("   1        %6d         %8d        %8d          0x%.2X \n", 
  16.             (partInfo[0].block_count / 2048), partInfo[0].block_start, 
  17.             partInfo[0].block_count, partInfo[0].partitionId); 
  18. if ( (partInfo[1].block_start !=0) && (partInfo[1].block_count != 0) )  
  19.         printf("   2        %6d         %8d        %8d          0x%.2X \n", 
  20.             (partInfo[1].block_count / 2048), partInfo[1].block_start, 
  21.             partInfo[1].block_count, partInfo[1].partitionId); 
  22. if ( (partInfo[2].block_start !=0) && (partInfo[2].block_count != 0) )  
  23.         printf("   3        %6d         %8d        %8d          0x%.2X \n", 
  24.             (partInfo[2].block_count / 2048), partInfo[2].block_start, 
  25.             partInfo[2].block_count, partInfo[2].partitionId); 
  26. if ( (partInfo[3].block_start !=0) && (partInfo[3].block_count != 0) )  
  27.         printf("   4        %6d         %8d        %8d          0x%.2X \n", 
  28.             (partInfo[3].block_count / 2048), partInfo[3].block_start, 
  29.             partInfo[3].block_count, partInfo[3].partitionId); 
  30. return 1; 

uboot 下更改NAND的分区 fdisk的更多相关文章

  1. linux driver ------ 三星公司uboot模式下更改分区(EMMC)大小fdisk命令 ------ iTOP4412 开发板烧写

    核心板 SCP 1G eMMC:KLM8G------>8G 终端(串口)输入(如果执行过,只需要执行最后一句即可): 开发板一启动,立马在终端按回车,进入 uboot 模式 fdisk -c ...

  2. Linux和Uboot下eMMC boot分区读写

    关键词:eMMC boot.PARTITION_CONFIG.force_ro等. 1. eMMC的分区 大部分eMMC都有类似如下的分区,其中BOOT.RPMB和UDA一般是默认存在的,gpp分区需 ...

  3. linux磁盘分区fdisk命令操作(实践)

    写这篇的目的,还是要把整个过程完整的记录下来,特别是小细节的地方,通常很多情况是一知半解,平时不实践操作只凭看是没有用的,所以做这个行业就是要多动手,多学习,多思考慢慢你的思路也会打开.练就自己的学习 ...

  4. windows下能读写linux分区的软件 转

    1. ext2ifs 这个工具与explore2fs都是John Newbigin使用Delphi写的,explore2fs Copyright (C) 2000,Ext2IFS v0.3 Copyr ...

  5. MTD下的Nand驱动

    目录 MTD下的Nand驱动 引入 平台设备资源文件 关键数据结构 平台框架 s3c24xx_nand_probe nand_scan s3c2410_nand_add_partition add_m ...

  6. uboot下emmc内容烧写(拷贝)步骤

    一.目的:嵌入式开发板,通过emmc上的内核文件加载启动linux操作系统,以及存放其他程序文件.需要将所需文件先写入emmc中. 二.总体步骤是:uboot启动后,进入linux下,将emmc分区并 ...

  7. 通过uboot传参设置mtd分区流程源码分析

    因为公司同事反映他使用的开板无法将根目录下的ip_work目mounth成功,由于本人当时没有去现场查看问题,只是象征性的询问内核是否创建了/dev/mtdblock5设备节点,因为该开发板默认是挂载 ...

  8. (三)修改内核大小,适配目标板Nand flash分区配置

    一. 修改内核大小 1. 在你的配置文件下uboot/include/config/xxx.h 里面有一个宏定义 #define MTDPARTS_DEFAULT "mtdparts=jz2 ...

  9. centOS 6.8下使用Gparted进行分区扩容

    centOS 6.8下使用Gparted进行分区扩容 ​ 机器环境:windows上运行的VMware虚拟机,系统为centOS 6.8. ​ 由于前期分区分配空间过小,无法满足后续的数据存储预期,所 ...

随机推荐

  1. GSAP JS基础教程--动画的控制及事件

    好多天没有写无博文啦,今天无聊就再写一下! 今天要讲的是TweenLite的一些事件以及,TweenLite动画的控制,TweenMax类似,请自行参考官方文档:http://api.greensoc ...

  2. 【内网渗透笔记】Windows2008 R2搭建域控制器

    0x00 前言 将网络中的多台计算机逻辑上组织到一起,进行集中管理,这种区别于工作组的逻辑环境叫做域(domain).域是日常计算机管理的一种很有效手段,因此,域控制器自然而然就在成域环境中最重要的角 ...

  3. c++的字节对齐

    win32平台下的微软C编译器对齐策略: 1)结构体变量的首地址能够被其最宽数据类型成员的大小整除.编译器在为结构体变量开辟空间时,首先找到结构体中最宽的数据类型,然后寻找内存地址能被该数据类型大小整 ...

  4. 执行上下文、this

    1.js中的执行上下文或者执行环境:execution context,简称EC; 2. console.log(a);//undefined var a=200; fn('lili'); funct ...

  5. CentoOS6.6安装netcat

    http://blog.csdn.net/u013673976/article/details/47084841 CentOS下安装netcat 使用zookeeper过程中,需要监控集群状态.在使用 ...

  6. .vimrc设置说明

    在终端下使用vim进行编辑时,默认情况下, 编辑的界面上是没有显示行号.语法高亮度显示.智能缩进等功能的. 为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc. 在启动vim时,当前 ...

  7. 【Linux】 解决报错: ImportError: libSM.so.6: cannot open shared object file: No such file or directory

    centos7 +  python3.6.4 我使用 pip3 install opencv-python 安装了opencv-python  之后,在使用 import cv2  报错如下 报错原因 ...

  8. springbatch---->springbatch的使用(七)

    这里我们讲述一下springbatch中关于step层面上面的数据共享技术.而对街的人影都浸染在一片薄荷的白色中,由于无声,都好像经过漂染,不沾人间烟火. step的数据共享 关于springbatc ...

  9. Qt编写网络调试助手(TCP客户端+TCP服务端+UDP服务端)终极版开源

    时隔半年,对网络调试助手工具进行所有代码重写,这次目录结果整齐的一逼,代码整齐的一逼,非常完善了,打死也不再改版了.这次真的打死也不再改版了.旧版本1:http://www.qtcn.org/bbs/ ...

  10. java学习之导出Excel

    1. 输出表格 poi输出excel最基本是输出table表格,下面是输出区域.总销售额(万元).总利润(万元)简单的表格,创建HSSFWorkbook 对象,用于将excel输出到输出流中 HSSF ...