Linux之设备驱动学习简过程<五>

来源:互联网 发布:统计工作用什么软件 编辑:程序博客网 时间:2024/06/05 17:07

一些东西一般要先学理论,再实践。但是感觉驱动这东西,要理论加实践才会更有感觉,可惜我现在还在实践边缘挣扎着。。。

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(共享中断)


原创粉丝点击