内核版本:linux-2.6.32.2
开发板:mini2440
基于总线驱动设备模型基本框架:
bus_drv_dev模型(是一种机制)
对于device来说:
1.把device相关信息放入bus的dev链表
2.从bus的drv链表取出每一个drv,用bus的match函数判断drv能否支持dev
3.若能支持,调用drv的probe函数。
对于driver来说
1.把driver放入drv链表
2.从dev链表中取出,利用mach函数一一比较,若发现匹配的,调用probe函数。
最近在弄DS1302芯片,对于单片机的程序,可以参考我的另外一篇博文stm8及DS1302的一些操作,然后想移植到linux系统中来,在源码中包含了一个DS1302的驱动文件(\linux-2.6.32.2\drivers\rtc\rtc-ds1302.c
打开该文件,首先查看他的模块init函数:
static int __init ds1302_rtc_init(void)
{
return platform_driver_probe(&ds1302_platform_driver, ds1302_rtc_probe);
}
继续追踪,在platform_driver_probe函数里,看到了retval = code = platform_driver_register(drv);确定该实现,运用了总线驱动设备模型。
如果我要用它的驱动的话可以自己先完成platform_device_registerv的注册,先确定硬件相关的接口,我把ds1302模块飞线接在了mini2440开发板的GPIOF0,1,2三个IO口上。
创建一个ds1302_dev.c文件,完成platform_device_registerv的注册。注意,在rtc-ds1302.c中ds1302的驱动name是"rtc-ds1302",所以该文件中dev name也一定是"rtc-ds1302",只有两者匹配,最后才会调用probe函数。
ds1302_dev.c的源码如下:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <mach/i