精华内容
下载资源
问答
  • mtd分区

    千次阅读 2014-02-15 14:33:43
    mtd_part结构: /* Our partition node structure */ struct mtd_part { struct mtd_info mtd; //分区的信息 struct mtd_info *master; //主分区 uint64_t offset; //该分区的偏移地址 int index; //分区...

       mtd_part结构:

    /* Our partition node structure */
    struct mtd_part {
    	struct mtd_info mtd; //分区的信息
    	struct mtd_info *master; //主分区
    	uint64_t offset; //该分区的偏移地址
    	int index; //分区号
    	struct list_head list; //双向链表,链接至mtd_partition(它的类型是mtd_part)
    	int registered;
    };


     

    int add_mtd_partitions(struct mtd_info *master, struct mtd_partition *parts, int nbparts)
    
     
    
    参数中包含一个master和nbparts个mtd_partition。
    
    此函数将创建nbparts个mtd_part,其中每个mtd_part包含了一个mtd_info,mtd_info的数据内容来自master和parts。程序将mtd_info加入mtd_table,并将mtd_part中的list_head加入list。
    
    


    注意:当所有分区建立完成后,一个分区对应一个mtd_part,每个mtd_part内部有一个实体mtd_info。但struct mtd_info *master不会被建立分区,它仅仅是在FALSH驱动(如SSTVF6401B.c)中的一个用来作参考用的结构。

    (1)    主分区(类型是mtd_info)同flash驱动创建,主分区不加入到mtd_table.

    (2)    Flash驱动初始化完成后,把主分区作为参数传入创建分区,每个分区创建一个slave分区(类型是mtd_part),并加入到双向链表mtd_partition。

     

    分区的设置

    如:

    static struct mtd_partition static_partitions_2M[] =
    {
    	{
    		.name		= "bootloader",
    		.offset		= 0,
    		.size		= 1 * 32 * 8 * 528,	/* 1st sector = 32 blocks * 8 pages * 528 bytes */
    		.mask_flags	= MTD_WRITEABLE,	/* read-only */
    	},
    	{
    		.name		= "kernel",
    		.offset		= MTDPART_OFS_NXTBLK,
    		.size		= 6 * 32 * 8 * 528,	/* 6 sectors */
    	},
    	{
    		.name		= "filesystem",
    		.offset		= MTDPART_OFS_NXTBLK,
    		.size		= MTDPART_SIZ_FULL,	/* rest = 9 sectors */
    	}
    };
    


     

    展开全文
  • MTD 分区

    2013-09-11 15:46:43
    AT91SAM9260的dataflash在U-boot-1.3.4中的分区文件:board/atmel/at91sam9260ek/partition.c /*define the area offsets*/ dataflash_protect_t area_list[NB_DATAFLASH_AREA] = {  {0x00000000, 0x00003FFF, ...

     

    AT91SAM9260的dataflash在U-boot-1.3.4中的分区文件:board/atmel/at91sam9260ek/partition.c
    /*define the area offsets*/
    dataflash_protect_t area_list[NB_DATAFLASH_AREA] = {
        {0x00000000, 0x00003FFF, FLAG_PROTECT_SET,   0, "Bootstrap"}, /*16K*/
        {0x00004000, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"}, /*17K*/
        {0x00008400, 0x0003FFFF, FLAG_PROTECT_SET,   0, "U-Boot"}, /*223K*/
        {0x00040000, 0x001FFFFF, FLAG_PROTECT_CLEAR, 0, "kernel"}, /*1M+768K*/
        {0x00200000, 0x003FFFFF, FLAG_PROTECT_CLEAR, 0, "rootfs"}, /*2M*/
    };

    AT91SAM9260的dataflash和nandflash在linux-2.6.22内核中的分区文件:arch/arm/mach-at91/board-sam9260ek.c

    static struct mtd_partition __initdata ek_nand_partition[] = {
        {
            name:"bootstrap - 128KB",
            offset:0,
            size:SZ_128K,
        },
        {
            name:"uboot - 256KB",
            offset:MTDPART_OFS_APPEND,
            size:SZ_256K,
        },
        {
            name:"uboot env - 128KB",
            offset:MTDPART_OFS_APPEND,
            size:SZ_128K,
        },
        {
            name:"uboot env swap - 128KB",
            offset:MTDPART_OFS_APPEND,
            size:SZ_128K,
        },
        {
            name:"kernel - 5MB",
            offset:MTDPART_OFS_APPEND,
            size:5 * SZ_1M,
        },
        {
            name:"fs - 5MB",
            offset:MTDPART_OFS_APPEND,
            size:5 * SZ_1M,
        },
        {
            name:"apps - 20MB",
            offset:MTDPART_OFS_APPEND,
            size:20 * SZ_1M,
        },
        {
            name:"info - 1MB",
            offset:MTDPART_OFS_APPEND,
            size:1 * SZ_1M,
        },
    #define CONFIG_BACKUP_PARTITION
    #ifndef CONFIG_BACKUP_PARTITION
        {
            name:"data - 224MB",
            offset:MTDPART_OFS_APPEND,
            .size = MTDPART_SIZ_FULL,
        },
    #else
        {
            name:"data - 168MB",
            offset:MTDPART_OFS_APPEND,
            size:168 * SZ_1M,
        },
        {
            name:"restore - 40 MB" ,
            offset:MTDPART_OFS_APPEND,
            size: 40 * SZ_1M,
        },
        {
            name:"uboot firmware backup - 16 MB",
            offset:MTDPART_OFS_APPEND,
            .size = MTDPART_SIZ_FULL,   /*All left*/
        },
    #endif

    其中offset是分区开始的偏移地址,MTDPART_OFS_APPEND,表示紧接着上一个分区,MTD Core会自动计算和处理分区地址;size是分区的大小,在最后一个分区我们设为MTDPART_SIZ_FULL,表示这个NADN剩下的所有部分。
    展开全文
  • 海思MTD分区

    2019-03-22 16:57:44
    我自己做的一个表格,基于海思hi3516C板子,MTD分区表。对于一些不会怎么修改内核大小以及文件大小后,怎么调整MTD表很有帮助哦。
  • Linux2.6内核的vivi分区及内核MTD分区.pdf
  • mtd-rw-MTD分区的写入启用器 在所有标记为只读的MTD分区上设置MTD_WRITEABLE标志。 卸载时,将还原只读分区。 该模块用于嵌入式设备,其中mtd分区布局可能会在固件中进行硬编码。 如果由于某种原因您必须写一个只读...
  • linux建立MTD分区

    2013-04-24 09:52:15
    学习linux下建立mtd分区必须的资料
  • kernel mtd 分区与UBOOT 分区的理解

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   
    今天做内核移植,准备添加NAND flash的驱动,做到MTD分区时,想起在一本书上看到的一句话,说的是分区时每个区之间没有间隙,前一个区的结束地址是后一个区的起始地址。可是当我看我的开发板的教程时,分区如下:

    static struct mtd_partition smdk_default_nand_part[] = {

          [0] = {

               .name     = "uboot",

               .offset = 0x00000000,

               .size     = 0x00040000,

          },

          [1] = {

               .name     = "kernel",

               .offset = 0x00200000,

               .size     = 0x00300000,

          },

          [2] = {

               .name     = "yaffs2",

               .offset = 0x00500000,

               .size     = MTDPART_SIZ_FULL

          }

    };

    很显然,在uboot和kernel分区中存在间隙,心中产生了疑问,难道MTD分区的时候要有注意的问题?通过各方查找资料和查阅书籍,找到了原因。不对的地方还请大家指正。

     

            首先说一下Linux下固态存储设备(NAND flash算其中一种)对系统组件的安排方式,一般为

     

    引导加载程序

     

    引导参数

     

    内核

     

    根文件系统

     

    也就是说,在NAND flash中,各部分的程序是这样安排的,但哪一端是高地址是依体系结构不同而不同的,对于ARM,引导加载程序在最低地址处,因此,无论是uboot的分区还是内核MTD分区,引导加载程序的分区都放在了最低地址处。那么,两个分区到底怎么联系起来,而我们又该怎么设置MTD分区呢?先给出我的开发板uboot的分区信息:

     

    bootargs=noinitrd root=/dev/mtdblock2  init=/linuxrc console=ttySAC0

    mtdparts=mtdparts=nandflash0:256k@0(bios),128k(params),128k(toc),512k(eboot),1024k(logo),3m(kernel),-(root)

     

           然后说一下MTD分区,这个分区是内核可以识别的分区,也就是说,内核的操作都是基于MTD分区的;而uboot的分区只是为了方便操作,例如,我想将内存中0x30000000地址处的内容写到NAND flash的偏移量为2M的地址处,即uboot分区中kernel的起始位置,一般情况,我们要写

    nand write 0x30000000 0x00200000

    但如果有了uboot的分区,我们可以写

    nand write 0x30000000 kernel

     

            说清上面的问题,为了进一步阐述后面的问题,这里再讲一下我对uboot引导过程的理解,当系统启动后,uboot开始执行,他分两个阶段完成工作,主要是一些初始化,然后,加载内核并传递内核参数,之后跳入内核执行,内核完成它的初始化工作,其中包括挂载文件系统。

     

           现在,我们可以翻回头看上面程序中的MTD分区了。MTD分区中的uboot分区明显对应了uboot分区中的bios分区(从0开始,大小为128K),而MTD分区中的kernel和yaffs2分区的起始地址和大小也分别对应uboot分区中的kernel和root分区。而因为我们不需要uboot分区中的其他部分,所以在MTD分区中出现了这一部分空隙。但为什么这么安排呢?

     

           回想我们在烧写程序时候的操作,比如我们选择烧写内核镜像,此时,uboot实际执行了一条语句,类似于

     

    #define kernel 0x00200000

    memcpy(kernel,0x30000000,SZ_3M)

     

           这里我们烧写程序的入口地址是0x30000000,也就是说,uboot的下载模式将我们烧写到内存0x30000000处的数据,搬到了NAND flash的kernel处,保存了起来,因此,这里要清楚,我们烧写程序时,实际是将程序先烧写到了内存当中,然后由内存搬运到NAND flash中,如果此时我们的MTD分区与uboot中的分区是一致的,那么内核将来运行时可以很方便的找到内核程序所在的位置,同样,对文件系统的yaffs2分区也是如此,而且,与内核分区相比,文件系统的分区将显得更加重要,因为将直接影响到根文件系统能否挂载,这里是因为上面提到的一行

     

    bootargs=noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0

     

           这里,uboot指定了根文件系统的代码来自于mtdblock2,也就是MTD分区的第三个分区(第一个编号为0),也就是我上面说到的,uboot完成初始化后,加载内核,而内核要完成文件系统的挂载,他从哪里找文件系统?就是这里!/dev/mtdblock2!

           所以,现在我们看到,MTD分区的原因,而且最关键的在这里,其他分区如果与uboot的分区不一致还情有可原,但如果MTD分区中文件系统的分区与uboot中的root分区不一致,将会直接导致系统无法启动!

    当然,之前操作的都是物理地址,当内核真正运行起来以后,将开始使用虚拟地址。

    同样的,其他几个引导参数也应该得到满足,系统才可能正常运行起来

    init=/linuxrc   init进程的位置。

    console=ttySAC0  终端对应tty设备,因此,在引导系统前,串口驱动移植应当完成


               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • MTD分区concat合并操作

    2021-05-12 15:13:01
    MTD分区concat合并操作 合并流程: struct mtd_info *mtd_buff[MAX]; struct mtd_info *mtd_new = NULL; 需要合并的所有的分区mtd信息,全部整合进数组mtd_buff,MAX是实际分区数量 { mtd_buff[i] = get_mtd_device_...

    MTD分区concat合并操作

    合并流程:
    struct mtd_info *mtd_buff[MAX];
    struct mtd_info *mtd_new = NULL;

    需要合并的所有的分区mtd信息,全部整合进数组mtd_buff,MAX是实际分区数量
    {
    mtd_buff[i] = get_mtd_device_nm(mtd_name);
    释放对应的分区mtd
    put_mtd_device(mtd[index]);
    }

    合并出新分区
    mtd_new = mtd_concat_create(mtd_buff, MAX, new_name);

    注册新mtd分区,新分区没有继承原分区的mtd_get_device_size,UBI文件系统需要自行ubiattach处理坏块预留比例
    mtd_device_register(mtd_new, NULL, 0);

    去除合并流程:
    mtd_new = get_mtd_device_nm(new_name);
    put_mtd_device(mtd_new);
    mtd_device_unregister(mtd_new);
    mtd_concat_destroy(mtd_new);

    展开全文
  • MTD分区 加大手机的内存
  • 博通 esdk6.5 mtd 分区
  • 二、MTD分区表的实现 在开机过程从console经常可以看到类似以下信息, 0x000000000000-0x000000100000 : "Bootloade" 0x000000100000-0x000002000000 : "Kernel" 0x000002000000-0x000003000000 : "User" 0x...
  • # cat /proc/mtddev: size erasesize namemtd0: 00040000 00040000 "RedBoot"mtd1: 00200000 00040000 "zImage"mtd2: 00180000 00040000 "initramfs"mtd3: 00001000 00040000 "RedBoot config"mtd4: 00040000 ...
  • 和实际对nand flash的分区表不一致,实际上在uboot移植教程(08 – 移植uboot 2012.04到JZ2440(设置mtd分区表))中,对内核的mtd分区情况如下: 0x00000000-0x00040000 : bootloader 0x00040000-0x00060000 : ...
  • 如果你是通过uboot的内核命令行给MTD层传递MTD分区信息,这种情况下,内核读取到的分区信息始终和u-boot中的保持一致(推荐的做法) 如果你是把分区信息写在内核源代码MTD里定义好的方法,那最好保证它和u-boot中的...
  • 2.6.22.6\arch\arm\plat-s3c24xx\common-smdk.c的下面代码 static struct mtd_partition smdk_default_nand_part[] = { [0] = { .name = "Boot Agent", .size = SZ_16K, .offset = 0, }, [1] = { .name = "S3C...
  • 在内核中修改MTD分区

    2019-04-17 11:04:12
    在内核中修改MTD分区 转自 https://blog.csdn.net/qingkongyeyue/article/details/52201150
  • 今天做内核移植,准备添加NAND flash的驱动,做到MTD分区时,想起在一本书上看到的一句话,说的是分区时每个区之间没有间隙,前一个区的结束地址是后一个区的起始地址。可是当我看我的开发板的教程时,分区如下: ...
  • MTD分区

    千次阅读 2012-08-13 23:55:01
    MTD分区表 http://hi.baidu.com/designhouse/item/f778bc1658b038dcbf9042d8 通过/proc虚拟文件系统读取MTD分区表:cat /proc/mtd 具体由linux/drivers/mtd下的mtdcore.c文件中的mtd_read_proc...
  • uboot 与系统内核中MTD分区的关系: 分区只是内核的概念,就是说A~B地址放内核,C~D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等。 1:在内核MTD中可以定义分区A~B,C~D。。。。。。并予以...
  • u-boot中分区和内核MTD分区关系 一、u-boot中环境变量与uImage中MTD的分区关系 分区只是内核的概念,就是说A~B地址放内核,C~D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等。 一般我们...
  • uboot 与系统内核中MTD分区的关系: 分区只是内核的概念,就是说A~B地址放内核,C~D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等。 1:在内核MTD中可以定义分区A~B,C~D。。。。。。并予以...
  • 1. mtd分区规划及其作用 uboot支持各种设备之后,接下来的工作就是烧写内核、烧写文件系统,所以需要对整块Nand Flash的空间作以规划,大致分为以下四个空间即可: bootloader空间 内核参数空间 内核空间 文件系统...
  • uboot 与系统内核中MTD分区的关系: 分区只是内核的概念,就是说A~B地址放内核,C~D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等。 1:在内核MTD中可以定义分区AB,CD。。。。。。并予以绝对...
  • IPQ4019MTD分区生成的过程

    千次阅读 2017-04-21 13:37:17
    本文介绍一个IPQ4019的MTD分区信息是如何从配置文件一步步传递到linux内核的。这个过程有几个部分组成,分区信息在编译过程中的传递;升级时写入flash区;设备上电时linux如何得到分区信息。   上电后linux打印的...
  • nandflash mtd分区

    2013-11-05 21:07:52
    转自:http://blog.sina.com.cn/s/blog_a2e8f52501016w29.html ... part add 命令用于添加一个MTD 分区。 命令的详细格式如下: part add name offset size flag 参数name 是要添加的分区分区名称; 参
  • 内核MTD分区大小计算

    千次阅读 2014-03-25 18:35:20
    在内核启动的时候会打印出MTD分区的情况,如下: bootloader的大小:0x3c0000转换成十进制,/2/1024/1024=1.5MB params (0x400000-0x3c0000)转换成十进制,/2/1024=96KB kernel 0x400000 转换成十...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,912
精华内容 3,564
关键字:

mtd分区