一些东西一般要先学理论,再实践。但是感觉驱动这东西,要理论加实践才会更有感觉,可惜我现在还在实践边缘挣扎着。。。
In short,I have to study hard,and morepractice.
1.Sysfs
*Sysfs把连接在系统上的设备和总线组织成分级的文件
使其从用户空间可以访问到。(/proc)
/sys/目录底下:
Block/Bus(devices/drivers)/Class/Devices/Kernel/Module/Firmware/Fs/Power
2.Kobject
*Kobject实现了基本的面向对象管理机制
*每个kobject对象对应sysfs文件系统中的一个目录
*kobject操作
--初始化 void kobject_init(struct kobject *kobj)
--注册 int kobject_add(struct kobject *kobj)
--初始化并注册 int kobject_init_and_add(struct kobject *kobj,struct kobj_type *ktype,struct kobject *parent,const char *fmt,...)
--删除 void kobject_del(struct kobject *kobj)
--kobject对象引用计数加1 struct kobject *kobject_get(struct kobject *kobj)
--kobject对象引用计数减1 void kobject_put(struct kobject *kobj)
*Kobject的ktype成员指向kobj_type结构指针,该结构记录了kobject对象的一些属性
struct kobje_type
{
void (*release)(struct kobject *kobj);
struct sysfs_ops *sysfs_ops;
struct attribute **default attrs;
}
struct atribute
{
char *name;//属性文件名
struct module owner;
mode_t mode;//属性保护位
}
struct sysfs_ops
{
ssize_t (*show)(struct kobject*,struct attribute*,char *);//读属性
ssize_t (*store)(struct kobject*,struct attribute*,const char *,size_t);//写属性
}
3.kset 是具有相同类型的kobject的集合
*操作
--注册 int kset_register(struct kset *kset)
--注销 void kset_unregister(struct kset *kset)
热插拔事件
kest操作:
--注册 int kset_register(struct kset *kset)
--注销 void kset_unregister(struct kset *kset)
struct kset {
struct list_head list;
spinlock_t list_lock;
struct kobject kobj;
struct kset_uevent_ops *uevent_ops;
};
struct kset_uevent_ops {
int (*filter)(struct kset *kset, struct kobject *kobj);
const char *(*name)(struct kset *kset, struct kobject *kobj);
int (*uevent)(struct kset *kset, struct kobject *kobj,
struct kobj_uevent_env *env);
};
4.设备模型(总线,驱动,设备)
**总线**
总线是处理器和设备之间的通道。
struct bus_type
--注册 bus_register(struct bus_type *bus)
成功/sys/bus/目录下可以看到
--删除 void bus_unregister(struct bus_type *bus)
总线方法
--处理搭配方法 int (*match)(struct device *dev,struct device_driver *drv)
*用于判断指定的驱动程序是否能处理指定的设备。非零,表示可以处理。
--热插拔前,允许总线添加环境变量 int (*uevent)(struct device *dev,char **envp,int num_envp,char *buffer,int buffer_size)
--总线属性用结构bus_attribute表示
*创建属性 int bus_create_file(struct bus_type *bus,struct bus_attribute *attr)
BUS_ATTR
*删除属性 void bus_remove_file(struct bus_type *bus,struct bus_attribute *attr)
**设备**
struct device
--注册 int device_register(struct device *dev)
--注销 void device_unregister(struct device *dev)
--设备属性用struct device_attribute描述
*创建属性 int device_create_file(struct device *device,struct device_attribute *entry)
*删除属性 void device_remove_file(struct device *dev,struct device_attribute *attr)
**驱动**
struct device_driver
--注册 int driver_register(struct device_driver *drv)
--注销 void driver_unregister(struct device_driver *drv)
--设备属性用struct driver_attribute描述
*创建属性 int driver_create_file(struct device_driver *drv,struct driver_attribute *attr);
*删除属性 void driver_remove_file(struct device_driver *drv,struct driver_attribute *attr)
5.Platform总线(虚拟总线)--定义/注册(设备) 定义/注册(驱动)
struct platform_device(平台设备)
注册-- int platform_device_add(struct platform_device *pdev)
*平台设备资源 struct resource 0x44100000-0x44200000
获取资源-- struct resource *platform_get_resource(struct platform_device *dev,unsigned int type,unsigned int num)
struct platform_driver(平台驱动)
注册-- int platform_driver_register(struct platform_driver *)
6.中断处理
实现:1.向内核注册中断 2.实现中断处理函数
*中断注册 int request_irq(unsigned int irq, void(*handler)(int,void*,struct pt_regs*,unsigned long flags,const char *devname,void *dev_id)
flags--IRQF_DISABLED(快速/慢速)/IRQF_SHARED(共享中断)