- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux系统建立NOR Flash分区
Linux建立Nor Flash分区
韩大卫@吉林师范大学
接上文章linux 系统Nor Flash芯片初始化及驱动, 当Nor Flash 芯片在flash芯片驱动器里链
chip_drvs_list 中找到并调用名为”cfi_probe”的驱动后, 完成芯片初始化阶段, 接着进入linux
对Flash建立分区阶段.
在 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_parts0 ,说明解析到存在多个分区, 那么添加各个分区
*/
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;
}
文档评论(0)