Linux 系统初始化NOR FLash芯片及驱动
韩大卫@吉林师范大学
本文旨在解析linux系统下, Nor Flash芯片的初始化大致过程, 和cfi标准类型的Flash芯片在linux系统中的底层驱动何如实现, 如何找到并调用其提供的write/read/ioctl实现函数.
在明确了上述关系后, 可用通过一个用户层的程序, 向Nor Flash芯片指定分区位置写入指定程序, 比如写入linux elf文件, 实现更新系统内核, 写入uboot, 更新引导程序, 写入 “hello ,world!”, 使得系统崩溃掉(这样做的后果是需要将Nor Flash芯片从目标板中取下来, 用烧录器烧入正确的文件后再焊到板子上).
关于linux如何在Nor FLash上建立分区, 请参考博文 <<linux下建立NOR Flash分区>>
内核启动时, 在arch具体CPU子目录下, 如 mips/cavium-octeon, nor flashd 的初始化过程如下:
在arch/mips/cavium-octeon/flash_setup.c
late_initcall(flash_init);
static struct map_info flash_map;
static int __init flash_init(void)
{
union cvmx_mio_boot_reg_cfgx region_cfg;
region_cfg.u64 = cvmx_read_csr(CVMX_MIO_BOOT_REG_CFGX(0));
if (region_cfg.s.en) {
/*
初始化一个全局数据结构 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;
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);
//调用名为cfi_probe 的驱动, 说明该CPU支持CFI标准的flash操作
mymtd = do_map_probe("cfi_probe", &flash_map);
if (mymtd) {
mymtd->owner = THIS_MODULE;
#ifdef CONFIG_MTD_PARTITIONS
nr_parts = parse_mtd_partitions(mymtd,
part_probe_types,
&parts, 0);
if (nr_parts > 0)
add_mtd_partitions(mymtd, parts, nr_parts);
else
add_mtd_device(mymtd);
#else
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() 会找到并调用指定name的probe函数,定义在drivers/mtd/chips/chipreg.c 中,
struct mtd_info *do_map_probe(const char *name, struct map_info *map)
{
struct mtd_chip_driver *drv;
struct mtd_info *ret;
//获取指定name的驱动
drv = get_mtd_chip_driver(name);
if (!drv && !request_module("%s", name))
drv = get_mtd_chip_driver(name);
if (!drv)
return NULL;
//成功获取指定的驱动器后, 调用其probe()函数, 实现对芯片的探测
ret = drv->probe(map);
module_put(drv->module);
if (ret)
return ret;
return NULL;
}
get_mtd_chip_driver()定义:
static struct mtd_chip_driver *get_mtd_chip_driver
Linux初始化Nor Flash芯片及驱动
Linux系统下Nor Flash初始化及驱动详解
最新推荐文章于 2022-11-27 00:31:31 发布
本文详细介绍了Linux系统初始化Nor Flash芯片及驱动的过程,包括内核启动时的初始化函数、CFI标准驱动的探测和使用,以及如何通过用户层程序向Nor Flash写入程序。文章解析了如何通过cfi_probe驱动实现对Nor Flash的探测,并调用相应驱动的write/read/ioctl函数。最后,文章提到了建立NOR Flash分区的方法和用户层向Flash写入文件的实现可能性。

最低0.47元/天 解锁文章
4814

被折叠的 条评论
为什么被折叠?



