2. 实现ok6410的nand flash驱动:
首先在板文件定义struct mtd_partition ok6410_nand_part[],即分区信息,struct s3c2410_nand_set ok6410_nand_sets[]
即所有芯片信息,这里就只有一个芯片;struct s3c2410_platform_nand ok6410_nand_info,包含前面信息和芯片属性的
platform_data;最后用s3c_nand_set_platdata(&ok6410_nand_info);形成platform_device,注册到platform总线。
总线会由name找到(match)驱动,即在s3c-nand.c,执行驱动的probe。下面是这个函数:
主要流程为:
a. 得到clk并打开时钟
b. 申请I/O内存并映射到内核虚拟地址
c. 申请nand_chip和mtd_info的内存,根据电路板情况初始化nand_chip的成员
d. 将mtd_info的priv指向nand_chip(下面调用的函数都是nand_chip中的)
e. nand_scan探测nand_flash,这时会读取芯片ID,并用nand_chip初始化mtd_info
f. 调用mtd_add_partitions,用板文件的分区表mtd_partition和上面芯片的mtd_info,新建分区,即几个mtd_part
g. 以后MTD上层访问某个分区,都可以由mtd_part的mtd_info找到nand_flash,并调用其中的函数
点击(此处)折叠或打开
/* s3c_nand_probe
*
* called by device layer when it finds a device matching
* one our driver can handled. This code checks to see if
* it can allocate all necessary resources then calls the
* nand layer to look for devices
*/
static int s3c_nand_probe(struct platform_device *pdev, enum s3c_cpu_type cpu_type)