Linux系统建立Nor Flash分区

本文详细介绍了Linux系统如何对Nor Flash进行分区,包括从获取Flash基地址到调用`do_map_probe()`初始化驱动,再到使用`parse_mtd_partitions()`解析分区,最后通过`add_mtd_partitions()`创建MTD分区。主要涉及`cmdlinepart`解析器和配置命令字符串的处理。
摘要由CSDN通过智能技术生成
Linux建立Nor Flash分区


韩大卫@吉林师范大学

接上文章<<linux系统Nor Flash芯片初始化及驱动>>, Nor Flash 芯片在flash芯片驱动器链表chip_drvs_list中找到并调用名为”cfi_probe”的驱动后, 完成芯片初始化阶段, 接着进入linuxFlash建立分区阶段.arch/mips/cavium-octeon/flash_setup.c static struct map_info flash_map;


static int __init flash_init(void)

{                         
                 
    union cvmx_mio_boot_reg_cfgx region_cfg;
	
//bootbus总线上获取flash的基地址.
    region_cfg.u64 = cvmx_read_csr(CVMX_MIO_BOOT_REG_CFGX(0));

    if (region_cfg.s.en) {
  
            
    //将全局数据结构struct map_info flash_map命名为octeon_nor0
        flash_map.name = "octeon_nor0";

	//物理地址和大小
        flash_map.phys = region_cfg.s.base << 16;

        flash_map.size = 0x1fc00000 - flash_map.phys;

        flash_map.bankwidth = 1;


	//使用ioremap()32M 大小的Flash的物理地址映射到虚拟地址上.
        flash_map.virt = ioremap(flash_map.phys, flash_map.size);

        pr_notice("Bootbus flash: Setting flash for %luMB flash at "

              "0x%08llx\n", flash_map.size >> 20, flash_map.phys);

        simple_map_init(&flash_map);

	
		/*
	调用do_map_probe()进入Nor Flash芯片初始化阶段,该函数会在Flash芯片驱动器列表中找到名为cfi_probe的驱动器, 并调用其probe()函数, 准备好read/wirte/ioctl等函数的实现方法.
		*/
        mymtd = do_map_probe("cfi_probe", &flash_map);

        if (mymtd) {      

            mymtd->owner = THIS_MODULE;

     

#ifdef CONFIG_MTD_PARTITIONS

/*
	FLash芯片成功探测(调用过probe), linux进入处理Flash分区阶段
*/
nr_parts = parse_mtd_partitions(mymtd,
part_probe_types,
&parts, 0);

            if (nr_parts > 0)


/*
	nr_parts>0 ,说明解析到存在多个分区, 那么添加各个分区
*/
                add_mtd_partitions(mymtd, parts, nr_parts);

            else          

                add_mtd_device(mymtd);

#else             

		//由于定义了CONFIG_MTD_PARTITIONS
, 不执行该函数        

            add_mtd_device(mymtd);

#endif                    

        } else {          

            pr_err("Failed to register MTD device for flash\n");

        }                 

    }                     

    return 0;             

}                                                

late_initcall(flash_init);                                                                                                                   

调用do_map_probe(), 成功的话返回一个重要的数据结构struct mtd_info.

Struct mtd_infolinux描述MTD类型设备的数据结构, 里面有mtd设备等待初始化的信息(变量)和一些设备操作方法(函数指针).

经过do_map_probe()的初始化, 其中有一些成员已经得到赋值, 请参考drivers/mtd/chips/cfi_probe.c 中的cfi_probe()函数.



parse_mtd_partitions(mymtd,
 part_probe_types,&parts, 0); 


解析器类型: cmdlinepartRedBoot两中, 如没有定义CONFIG_MTD_REDBOOT_PARTS, 那只将cmdlinepart编译在内, 最后只连接cmdlinepart.o.

static const char *part_probe_types[] = { 

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值