linux-2.6.22.6内核nand flash框架分析

内核启动时会在串口打印nand flash的相关信息,通过该信息可定位到内核自带的nand flash相关驱动代码。

例如串口打印S3C24XX NAND Driver,搜索该字符串可找到/home/book/work/linux/linux-2.6.22.6/drivers/mtd/nand/s3c2410.c这个文件,这个就是nand flash驱动代码文件。

从该文件的s3c2410_nand_init函数分析,通过总线设备驱动模型可知道最终会调用到s3c2412_nand_probe函数,s3c2412_nand_probe的函数调用层次结构如下:


```c
s3c2410_nand_inithw
s3c2410_nand_init_chip
nand_scan //在drivers/mtd/nand/s3c2410.c通用文件里
	nand_scan_ident
		nand_set_defaults
		nand_get_flash_type
			chip->select_chip(mtd, 0);
			chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
			*maf_id = chip->read_byte(mtd);
			dev_id = chip->read_byte(mtd);	
			//读出设备id后,后定义好的设备信息数组比较
			for (i = 0; nand_flash_ids[i].name !=NULL;i++{
					if (dev_id == nand_flash_ids[i].id) {
						type =  &nand_flash_ids[i];
						break;
					}
				}
	nand_scan_tail
		mtd->erase = nand_erase;
		mtd->read = nand_read;
        mtd->write = nand_write;
s3c2410_nand_add_partition
	add_mtd_partitions
		add_mtd_device 
			//mtd_notifiers被register_mtd_user设置,
			//register_mtd_user被mtd_blkdevs.c和mtdchar.c调用
			list_for_each(this, &mtd_notifiers) { 
			struct mtd_notifier *not =  list_entry(this,struct  mtd_notifier, list);
			       //这里最终会调用到notifier和blktrans_notifier里的mtd_notify_add和blktrans_notify_add方法,分别对应字符设备和块设备
					not->add(mtd); 
					}
			//先看mtd_notify_add,字符设备很简单,如果有设备注册,就会创建两个以mtd开头的设备文件
			mtd_notify_add
				class_device_create
				class_device_create
			//再看blktrans_notify_add
			blktrans_notify_add
			    //blktrans_majors被register_mtd_blktrans设置,register_mtd_blktrans被mtdblock.c和 mtd_blkdevs.c调用
				list_for_each(this, &blktrans_majors) {
				struct mtd_blktrans_ops *tr = list_entry(this, struct mtd_blktrans_ops, list);
	            //这里最终会调用mtdblock.c的mtdblock_add_mtd
				tr->add_mtd(tr, mtd);
		    }
			//分析mtdblock_add_mtd
		mtdblock_add_mtd
			add_mtd_blktrans_dev
				alloc_disk  //这里才是块设备驱动开发正在流程,分配gendisk,设置gendisk,添加gendisk
				add_disk

在这里插入图片描述
总结:块设备和字符设备这两类存储类驱动最终都会用到nand_scan_tail里面构造的mtd_info信息,最终的的读写函数都会定位到mtd_info的具体函数,不过块设备更复杂,分层更多,它主要分为硬件层、nand协议层和块设备层,硬件层知道怎样发命令,需要构造nand_chip结构体,协议层知道要发什么来操作。主要构造mtd_info结构体,块设备层使用mtd_info信息,并用电梯调度算法进行优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值