最近开始看linux驱动代码,以前看过一些字符驱动的代码,好久不用又都忘了,或许把自己理解的东西写成日志印象会深一点吧.这次是从nand_flash驱动开始看起的,越看越深,越看越晕,其中设计到了platform平台架构,2.6内核以后好像都用这个架构写驱动了.还有mtd设备的驱动层,它是一个中间层,目的就是使nand_flash驱动写起来非常简单,但是它本身的代码却很复杂,也就是说写一个新的nand_flash驱动不必关心mtd驱动是怎么写的,你只需要提供给它它需要的数据结构即可.nand_flash驱动只是简单的调用一下mtd驱动提供的函数接口.
linux设备驱动模型,在我的理解来看,就是设备<----->总线<------>驱动三者之间的关系,platform驱动架构也是基于这三者关系的.首先向系统总线注册platform总线,结构体struct bus_type,然后是各种平台设备,平台驱动的注册.linux下先注册设备或先注册驱动是无关紧要的,当一个新的设备被注册就会到总线上去找相应的驱动,同样当一份驱动被注册就会到总线上去找设备.两者都是通过驱动程序中的probe函数完成的.在总线上会有一个driver_match_device函数来匹配两者,也就是说设备名称为什么一定要和驱动名称相同了.
nand_flash驱动(cpu:atmel_9g45)在平台设备注册时所用到的结构体和函数有:
struct resource :I/O资源 以及flag类型.
struct platform_device: 设备资源,设备私有数据.
struct mtd_partition:分区表信息
struct ek_nand_data: 设备私有数据 被传到platform_device结构的dev.platform中.
platform_device_register(dev) 向platform总线上注册platform设备
注册驱动是两个重要结构体:
struct nand_chip:flash的芯片类型,包涵对flash芯片的读写控制等操作.
struct mtd_info:每