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

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

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


你可能感兴趣的:(Linux之设备驱动学习简过程<五>)