1.向设备模型注册一个驱动
数据结构:
static struct platform_driver s3c2410_nand_driver = {
.probe = s3c2410_nand_probe,
.remove = s3c2410_nand_remove,
.suspend = s3c24xx_nand_suspend,
.resume = s3c24xx_nand_resume,
.driver = {
.name = "s3c2410-nand",
.owner = THIS_MODULE,
},
};
注册函数:
platform_driver_register(&s3c2412_nand_driver);
2.static int s3c2410_nand_probe(struct platform_device *dev)
->s3c24xx_nand_probe(dev, TYPE_S3C2410)
在probe过程中,用clk_enable打开nand flash控制器的clock时钟。用request_mem_region去申请驱动所需要的一些内存等相关资源。然后,在s3c2410_nand_inithw中,去初始化硬件相关的部分,主要是关于时钟频率的计算,以及启用nand flash控制器,使得硬件初始化好了,后面才能正常工作。
然后申请包含了一个mtd设备和一个硬件芯片的结构体struct s3c2410_nand_mtd所需要的空间,调用s3c2410_nand_init_chip ,将芯片底层的驱动和mtd设备绑定。
我们所需实现的就是芯片底层驱动然后通过以上框架加入linux系统。
3.数据结构关系:
mtd是加在硬件和文件系统之间一层。struct mtd_info是一个mtd设备的描述。struct nand_chip是一个具体的硬件。如s3c2410将有struct s3c2410_nand_mtd 结构来,包含mtd设备和nand_chip结构。
数据结构:
/* overview of the s3c2410 nand state */
struct s3c2410_nand_info {
/* mtd info */
struct nand_hw_control controller;
struct s3c2410_nand_mtd *mtds;
struct s3c2410_platform_nand *platform;
/* device info */
struct device *device;
struct resource *area;
struct clk *clk;
void __iomem *regs;
void __iomem *sel_reg;
int sel_bit;
int mtd_count;
enum s3c_cpu_type cpu_type;
};
struct s3c2410_nand_mtd {
struct mtd_info mtd;
struct nand_chip chip;
struct s3c2410_nand_set *set;
struct s3c2410_nand_info *info;
int scan_res;
};
4.更详细的说明:
阅读(800) | 评论(0) | 转发(0) |