andy 发表于 2013-7-16 14:35:19

MTD中的nand驱动初步分析---面向u-boot

本帖最后由 andy 于 2013-7-16 14:38 编辑

原文:http://blog.csdn.net/andy_wsj/article/details/9339247

之前提到nand驱动的初始化分析,有一个结构体 struct mtd_info始终贯穿这些代码
再来分析一下这个结构体的基本功能,如何初始化,如何使用

一、分析过程
看看结构体的出现和使用方式
第一次出现在文件\u-boot-sunxi-sunxi\drivers\mtd\nand\nand.c内:
#ifndef CONFIG_SYS_NAND_SELF_INIT
static void nand_init_chip(int i)
{
struct mtd_info *mtd= &nand_info;
struct nand_chip *nand = &nand_chip;
ulong base_addr = base_address;
int maxchips = CONFIG_SYS_NAND_MAX_CHIPS;


if (maxchips < 1)
maxchips = 1;


mtd->priv = nand;
nand->IO_ADDR_R = nand->IO_ADDR_W = (void__iomem *)base_addr;


if (board_nand_init(nand))
return;


if (nand_scan(mtd, maxchips))
return;


nand_register(i);
}
#endif
看这句代码:
struct mtd_info *mtd = &nand_info;
结构体指向全局变量nand_info,这个变量就是nand设备的信息

再看初始化:
mtd->priv = nand;
mtd的私有数据就是一个struct nand_chip类型的结构体

从编程的角度来说,一个硬件驱动应该有两个面,一个面向上层,提供接口;一个面向底层,提供硬件操作
广义上来看:
struct mtd_info就是面向上层,提供数据接口
struct nand_chip面向nand设备,提供硬件接口
假如:mtd->priv = nand; 初始化为另外一种设备的结构体,例如nor flash,那么mtd就是一种norflash的驱动,
用户实现nor flash相关的操作即可。

struct   mtd_info结构体来自linux内核的MTD子系统,u-boot使用时进行了一些简化使用,毕竟不是操作系统,很多问题可以不用考虑
MTD的全称是memorytechnologydevice,主要针对是用于访问memory设备(ROM、flash),其目的就是简化驱动的更新,
例如cubieboard接了一个nand flash,型号是K9GBG08U0A,如果没有这个驱动如何简单添加呢?
从人的正常思考角度,加了一个nand,无外乎读,写,刷新几种主要操作,而MTD就提供了这几种操作,
用户在使用时需要实现这个接口就可以了,至于数据的格式,支持什么文件格式yaffs,ext3,ext4用户无须关心
MTD上层已经实现了,用户提供读写,刷新等等基本操作就可以了。大大简化了一个驱动的开发工作量。

基于这种思路,来看看struct   mtd_info结构体

========论坛长度有限,以下略去,请看原文==========


页: [1]
查看完整版本: MTD中的nand驱动初步分析---面向u-boot