CubieBoard博客-HomeCubieTech公司网站

cubie.cc CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 2993|回复: 0

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

[复制链接]

11

主题

2

好友

1162

积分

金牌会员

Rank: 6Rank: 6

贡献
195
金钱
513
威望
195
买家信用
卖家信用
积分
1162
发表于 2013-7-16 14:35:19 |显示全部楼层
本帖最后由 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就是一种nor  flash的驱动,
用户实现nor flash相关的操作即可。

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

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

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


代码之前,众生平等
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

QQ|Archiver|手机版|邮件群发|cubie.cc---深刻的嵌入式技术和应用讨论中文社区 ( 粤ICP备13051116号-1  

GMT+8, 2020-4-10 07:47 , Processed in 0.020678 second(s), 12 queries , Apc On.

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc. | Style by Coxxs

回顶部