1)Linux驱动开发相关问题,分享给将要学习或者正在学习Linux驱动开发的同学。
2)内容属于原创,若转载,请说明出处。
3)提供相关问题有偿答疑和支持。
先看下分区信息:
CIS中占据10个Block,其中第0 2 4 6 8 Block存放分区信息以及flash信息等,其中对应的Block Page0存放Flash信息,Page1存放分区表信息。uboot起来以后同样会去CIS分区读取Flash的信息和分区信息等等,下面看下大致流程,不做细节分析。
nand驱动入口:boot/drivers/mtd/nand/nand.c --> nand_init函数
其中在mtd_info/nand_chip中定义了一些nand的ops函数集以及对应的nand的参数信息等等,此数据结构贯穿整个nand的操作:
在nand_init_chip中做以上结构体赋值,并且注册nand 驱动:(其中nand_info是一个全局变量保存mtd的数据信息)
在board_nand_init中正式进入我们板载的nand初始化函数过程,在此函数中进行CSI的分区sni/pni等读取,以及初始化nand_chip结构:
在nand_scan中初始化mtd设备:
最后调用nand_register注册nand驱动:
因此nand的读写以一些参数信息就在以上的函数中被初始化和注册;
下面看下具体的uboot中nand erase / nand write / nane read 的流程:cmd_nand.c
如下是nand erase的流程:
如下是nand write / nand read的函数调用:
以上API全部定义在: boot/drivers/mtd/nand/nand_util.c 用户操作可以直接调取此API
下面简单看下以上的API的其中一个API:nand_write_skip_bad,如下看到会去判断坏块,接着会调用nand_write
因此以上的mtd读写实际回调到前面的nand_chip注册的API中,nand_chip注册的API也即是我们驱动的HAL读写;
下面以一个Demo实际操作下:(为了方便操作我这里新建一个cmd,调取以上API对kernel的分区0x480000地址进行擦除读写测试)
如下是原本的kernel数据,下面进行擦除:
如下是对擦除的数据进行读写判断:
如下是cmd_nand_ops_test的源码: