q2113435929的个人空间 https://www.eechina.com/space-uid-126185.html [收藏] [复制] [RSS]

博客

UT4412BV03开发板学习linux设备驱动模型(一)

已有 1446 次阅读2015-10-16 14:22 | 4412, 开发板, Linux, 驱动

UT4412BV03开发板学习linux设备驱动模型(一)

设备驱动模型概述:

设备驱动模型比较复杂,linux系统将设备和驱动归结到设备驱动模型中来管理,设备驱动模型的提出解决了以前编写驱动时没有统一的方法的局面,设备驱动模型给各种驱动程序提供了很多辅助性的函数,这些函数经过严格测试,可以很大程度上提高驱动开发人员的工作效率。

设备驱动模型中用到的几个核心的数据结构,分别是kobjeck,kset,subsystem,这些结构体使设备驱动模型组成了一个层次结构,该层次结构将驱动,设备,总线等联系起来,形成了一个完整的设备驱动。

kobject结构体提供了一个最基本的设备对象管理能力,每一个在内核中注册的kobject对象都对应于sysfs文件中的一个目录。

对应头文件:#include<linux/kobject.h>

对应源文件:kobjeck.c

1.kobject结构体

struct kobject {

 const char *name;                     //kobject结构体的名字,作为一个目录显示在sysfs文件系统中

 struct list_head entry;              //链接下一个kobject结构体

 struct kobject *parent;           //指向本结构体的指针

 struct kset *kset;                    //指向kset结构体的指针

 struct kobj_type *ktype;       //指向kobj_type结构体的指针,设备属性结构体

 struct sysfs_dirent *sd;         //

 struct kref kref;                     //表示该对象的引用计数,

 内核提供增加和减少引用计数的kobject_get();kobject_put();当计数为0时,该对象的所有资源被释放

 unsigned int state_initialized:1;                //表示kobject结构体是否初始化过,1表示初始化过,0表示未初始化过。

 unsigned int state_in_sysfs:1;                  //表示kobject结构体是否已注册到sysfs文件系统中

 unsigned int state_add_uevent_sent:1; //

 unsigned int state_remove_uevent_sent:1; //

 unsigned int uevent_suppress:1

};

Kobject通过kset组织成层次化的结构,kset中包含了kobject集合,像驱动程序一样放在/sys/driver目录下,目录driver是一个kset对象,包含系统中的驱动程序对应的目录,驱动程序的目录由kobject表示。Kset结构体的定义如下:

用到的头文件#include <linux/kobject.h>

struct kset {

 struct list_head     list;   //链接所包含的的kobject对象的链表的首部

 spinlock_t          list_lock;  //维护list链表的自旋锁

 struct kobject    kobj; //内嵌的kobject结构体,说明kset本身也是一个目录

 struct kset_uevent_ops    *uevent_ops;  //热插拔事件

};

 

每一个kobject对象都有一些属性,这些属性由kobj_type结构体表示,最开始,内核开发者考虑将包含在kobject结构体中,后来考虑到同类设备会具有相同的属性,所以将属性隔离开来。由kobj_type表示。

用到的头文件#include <linux/kobject.h>

struct kobj_type {

 void (*release)(struct kobject *kobj);        //释放kobject结构体占用的资源,该函数用驱动开发者去实现

 struct sysfs_ops *sysfs_ops;

 struct attribute **default_attrs;

};

 

用到的头文件#include <linux/sysfs.h>

struct attribute {

 const char          *name;

 struct module    *owner;

 mode_t               mode;

};

struct   sysfs_ops {

 ssize_t (*show)(struct kobject *, struct attribute *,char *);   //写属性操作函数   show函数用于读取一个属性到用户空间,读取成功返回读取到的字节数

 ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);   //写属性操作函数, store函数用于将属性写入内核     

};

用到的头文件#include <linux/sysfs.h>

struct sysfs_dirent {

 atomic_t s_count;

 atomic_t s_active;

 struct sysfs_dirent *s_parent;

 struct sysfs_dirent *s_sibling;

 const char *s_name;

 

 union {

  struct sysfs_elem_dir s_dir;

  struct sysfs_elem_symlink s_symlink;

  struct sysfs_elem_attr s_attr;

  struct sysfs_elem_bin_attr s_bin_attr;

 };

 

 unsigned int s_flags;

 ino_t s_ino;

 umode_t s_mode;

 struct iattr *s_iattr;

};

二. 操作kobject结构体用的函数

 


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
返回顶部