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(共享中断)
- Linux之设备驱动学习简过程<五>
- Linux之设备驱动学习简过程<一>
- Linux之设备驱动学习简过程<二>
- Linux之设备驱动学习简过程<四>
- Linux之设备驱动学习简过程<三>(不断添加中)
- LINUX设备驱动之设备模型五--device&driver&bus
- 嵌入式Linux驱动笔记(五)------学习platform设备驱动
- Linux设备驱动学习(五)------Linux下定时器操作
- linux设备驱动之USB数据传输分析(之五)
- Linux 设备驱动学习之 异步通知
- Linux设备驱动之五----带poll机制的驱动程序
- Linux ALSA声卡驱动之五:移动设备中的ALSA
- linux内核驱动设备模型五之kobject (设备驱动模型的基石)
- 国嵌--linux字符设备驱动学习之memdev设备
- 国嵌--linux字符设备驱动学习之memdev设备
- 【原创】《Linux设备驱动程序》学习之循序渐进 --- 字符设备驱动
- Linux设备驱动学习
- linux设备驱动学习
- 多进程与多线程(十四)
- SNS游戏服务器架构随笔
- 浅谈COOKIE和SESSION关系和区别等
- 清理Windows7通知区域图标
- 【转】英语达人告诉你,如何用美剧真正提升你的英语水平
- Linux之设备驱动学习简过程<五>
- 定点dsp和浮点dsp的对比
- C#中重命名文件和文件夹的方法
- C#之父Anders Hejlsberg演讲解读:编程语言大趋势
- MFC中Tab控件的使用方法
- 一个程序员的冷笑话
- jQuery插件开发全解析
- C#创建WINFORM程序在64位系统不能正常运行的解决办法
- [Asp.Net]aspx 动态生成html(二)