很长一段时间,快闪记忆体都是嵌入式的标配产品.nand flash价格便宜,存储量大,适用于很多的场景。现在很普及的ssd,上面的存储模块其实也是由一块一块快闪记忆体构成的。对于linux嵌入式来说,开始uboot的加载是硬件完成的,中期的内核加载是由uboot中的nand闪存驱动完成的,而后期的rootfs加载,这就要靠内核自己来完成了。当然,这次还是以三星s3c芯片为例进行说明。
1, nand闪存驱动在什么地方,可以从drviers mtd/Makefile来看
obj-y +=/nand芯片/lpddr/地图/设备/> 配置MTD_NAND_S3C2410 三态“三星S3C soc NAND Flash支持” 取决于> obj - $ (CONFIG_MTD_NAND_S3C2410) +=s3c2410。o
4,查看s3c2410.c文件,看看基本结构构成
静态结构platform_driver s3c24xx_nand_driver={ .probe=s3c24xx_nand_probe, .remove=s3c24xx_nand_remove, .suspend=s3c24xx_nand_suspend, .resume=s3c24xx_nand_resume, .id_table=s3c24xx_driver_ids, .driver={ . name=" s3c24xx-nand ", .of_match_table=s3c24xx_nand_dt_ids, }, }; module_platform_driver (s3c24xx_nand_driver);>之前5,继续分析s3c24xx_nand_probe函数
s3c2410_nand_init_chip(信息、nmtd、集);>之前6,之所以从中摘出了s3c2410_nand_init_chip这个函数,是因为里面进行了函数注册
类似的函数还有s3c2410_nand_update_chip函数
芯片→write_buf=s3c2410_nand_write_buf; 芯片→read_buf=s3c2410_nand_read_buf; 芯片→select_chip=s3c2410_nand_select_chip; 芯片→chip_delay=50; nand_set_controller_data(芯片,nmtd);=设置芯片→选项→选项; 芯片→控制器=,信息→控制器; 开关(信息→得){ 案例TYPE_S3C2410: 芯片→IO_ADDR_W=规则+ S3C2410_NFDATA; 信息→sel_reg=规则+ S3C2410_NFCONF; 信息→sel_bit=S3C2410_NFCONF_nFCE; 芯片→cmd_ctrl=s3c2410_nand_hwcontrol; 芯片→dev_ready=s3c2410_nand_devready; 打破; 案例TYPE_S3C2440: 芯片→IO_ADDR_W=规则+ S3C2440_NFDATA; 信息→sel_reg=规则+ S3C2440_NFCONT; 信息→sel_bit=S3C2440_NFCONT_nFCE; 芯片→cmd_ctrl=s3c2440_nand_hwcontrol; 芯片→dev_ready=s3c2440_nand_devready; 芯片→read_buf=s3c2440_nand_read_buf; 芯片→write_buf=s3c2440_nand_write_buf; 打破; 案例TYPE_S3C2412: 芯片→IO_ADDR_W=规则+ S3C2440_NFDATA; 信息→sel_reg=规则+ S3C2440_NFCONT; 信息→sel_bit=S3C2412_NFCONT_nFCE0; 芯片→cmd_ctrl=s3c2440_nand_hwcontrol; 芯片→dev_ready=s3c2412_nand_devready; 如果(readl(海军学校规则+ S3C2410_NFCONF),S3C2412_NFCONF_NANDBOOT) dev_info(信息→设备,“系统启动从NAND \ n”); 打破; } >之前7,抓住了函数接口,就找到了基本逻辑。
对于框架来说,它不关心你的代码如何实现。只要你按照它的接口写,就能让上层正常获得数据.platform, usb, pci这都是一种接口形式,具体实现还要按照各个具体功能模块来实现才行。
8,为什么我们都用s3c芯片进行举例
因为它用的场景最多,学习资料最全,对于新手来说,这会少很多麻烦。
9,这个驱动依赖的内核版本是什么
这里最有的代码都是按照最新4.16的版本进行分析的,大家可以直接查看这里的地址。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
linux nand闪存驱动编写