linux中每个设备驱动由一个structdevice_driver描述:

structdevice_driver {

constchar*name;//设备驱动程序的名称

structbus_type     *bus;//该驱动所管理的设备挂接的总线类型

structmodule       *owner;

constchar*mod_name;/* used for built-in modules */

int(*probe) (structdevice *dev);

int(*remove) (structdevice *dev);

void(*shutdown) (structdevice *dev);

int(*suspend) (structdevice *dev, pm_message_t state);

int(*resume) (structdevice *dev);

structattribute_group **groups;

structdev_pm_ops *pm;

structdriver_private *p;

};

structdriver_private {

structkobject kobj;

structklist klist_devices;//该驱动所管理的设备链表头

structklist_node knode_bus;//挂入总线链表中的指针

structmodule_kobject *mkobj;

structdevice_driver *driver;

};

structdriver_attribute {

structattribute attr;

ssize_t (*show)(structdevice_driver *driver,char*buf);

ssize_t (*store)(structdevice_driver *driver,constchar*buf,

size_t count);

};

可以看出device结构体中也包含了一个kobject对象和连接设备的链表。

当设备从系统总删除是remove被调用。

当系统关机的时候shutdown被调用。注册一个设备驱动int driver_register(struct driver*drv)删除一个设备驱动void  driver_unregister(struct driver*drv)

创建属性

int driver_create_file(struct driver *drv,struct driver_attribute *attr)

删除属性

intdriver_remove_file(struct driver*drv,struct driver_attribute *attr)

structdevice_driver中有个int(*probe) (structdevice *dev)函数,它什么时候调用呢?device_driver中name指向驱动的名字,前面的structdevice中也有一个名为bus_id的字符数组。查看一下,struct bus_type中有一个match函数,这个是干什么用的呢。设备有了驱动才可以工作,只有驱动没有设备也是不行,驱动和设备需要关联上,这就需要这个match函数。驱动和设备是通过name来管理的,所以在总线驱动match函数中要比较device的bus_id和driver中的name是否相等,什么时候比较?只要往总线添加设备或驱动时,总线都会把调用match函数对新添加的设备或驱动中名字与总线中已经注册的驱动或设备的名字一一比较。如果有相等,就说明驱动和设备互相找到了,这时device_driver中的probe函数就被调用。

添加设备驱动例子,添加到前面创建的my_bus总线上:

#include

#include

#include

#include

#include

MODULE_AUTHOR("David Xie");

MODULE_LICENSE("Dual BSD/GPL");

extern struct bus_type my_bus_type;

static int my_probe(struct device *dev)

{

printk("Driver found device which my driver can handle!\n");

return 0;

}

static int my_remove(struct device *dev)

{

printk("Driver found device unpluged!\n");

return 0;

}

struct device_driver my_driver = {

.name = "my_dev",

.bus = &my_bus_type,

.probe = my_probe,

.remove= my_remove,

};

/*

* Export a simple attribute.

*/

static ssize_t mydriver_show(struct device_driver *driver, char *buf)

{

return sprintf(buf, "%s\n", "This is my driver!");

}

static DRIVER_ATTR(drv, S_IRUGO, mydriver_show, NULL);

static int __init my_driver_init(void)

{

int ret = 0;

/*注册驱动*/

driver_register(&my_driver);

/*创建属性文件*/

driver_create_file(&my_driver, &driver_attr_drv);

return ret;

}

static void my_driver_exit(void)

{

driver_unregister(&my_driver);

}

module_init(my_driver_init);

module_exit(my_driver_exit);

创建一个名为“bus_dev”的驱动,并将bus成员指向第一步创建的my_bus_type总线

测试结果:加载驱动将会打印:Driver found device which my driver can handle!

查看/sys/bus/my_bus/driver

ls/sys/bus/my_bus/drivermy_dev

linux 设备模型 不上,Linux设备模型--驱动相关推荐

  1. 自动化模型选择上与树模型基础

    Q:什么是模型选择? 模型选择即选择正则化参数的大小和多项式的次数 Q:模型选择的两个步骤? 1.选择一个模型 2.设定它的参数 Q:选择最好的模型实际上选择模型的什么指标? 实际上是确定哪个模型可以 ...

  2. 嵌入式linux sd卡读写,嵌入式Linux之我行——S3C2440上MMC/SD卡驱动实例开发讲解(二)...

    嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤.一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便.如有错误之处,谢请指正. 一.开发环境 主  机:VMWa ...

  3. ps3安装linux的功能,ps3上linux系统安装

    Insert a bootable installation disc for the Linux operating system in the PS3? system. The initial s ...

  4. linux备份文件到ftp上,Linux服务器下用FTP上传下载备份文件

    从linux服务器批量上传/home/test文件夹里面文件到FTP(192.168.1.122)里面wwwroot目录 ##shell脚本如下: updir=/home/test todir=www ...

  5. Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spa ...

  6. linux备份文件到ftp上,Linux如何利用ssh传送文件至FTP空间进行备份

    在Linux系统中,可通过ssh将文件传送到FPT空间中,将一些重要的数据进行备份,那么要如何实现文件的传送呢?小编给大家具体介绍下Linux利用ssh传送文件到FTP空间的方法. 步骤: 假设要备份 ...

  7. 树莓派 交叉编译 php,apm 树莓派的交叉编译方法 - 穿越机综合技术讨论区-5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)...

    本帖最后由 payne_pan 于 2015-11-10 19:07 编辑 看了帖子树莓派2手工打造Linux APM飞控 http://bbs.5imx.com/bbs/forum.ph ... 5 ...

  8. 重启linux服务器连不上,linux服务器重启后ssh连不上了

    在机房的 linux服务器重启后需要重新输入账号,密码 如果没有输入账号 密码ssh就连不上 请问这个问题大家是怎么处理的啊? 谢谢! 我觉得是不是你 shhd的自己手动配置的,然后自启动没写对地方啊 ...

  9. 【机器学习】最大熵模型【下】最大熵模型学习的最优化算法

    有任何的书写错误.排版错误.概念错误等,希望大家包含指正. 由于字数限制,分成两篇博客. [机器学习]最大熵模型[上]最大熵模型概述与约束最优化问题 [机器学习]最大熵模型[下]最大熵模型学习的最优化 ...

最新文章

  1. 周其对话农民丰收节交易会 乡村振兴不能单单从乡村着眼
  2. 反射调用private或internal构造函数
  3. 视觉特征--ORB系列
  4. ABAP新的关键字:BASE
  5. day10-Python学习笔记(二十三)线程池,unittest参数化,协程
  6. 晨会分享 知识点二〇一六年五月二十五日
  7. 祝刘冬冬十八周岁快乐
  8. Python--turtle.circle()参数说明
  9. Unity战棋游戏资源
  10. 五子棋等级考试软件的开发(五)
  11. JQuery中$(document)是什么意思?
  12. Appium +iOS 自动化测试全网最全教程(实践、总结 、踩坑)
  13. 谷歌浏览器无法访问怎么办
  14. TI公司DSP集成开发环境(CCS)有哪几种工作模式?各自特点是什么?
  15. mybatisplus+oracle,Springboot+MybatisPlus+Oracle实现主键自增的示例代码
  16. 0 公式 0 基础学习电磁兼容 — 1. EMC 测试类型简介
  17. 小鹅通课程下载(一)
  18. GWAS与eQTL相结合,进一步筛选疾病相关基因
  19. 苹果电脑变慢的原因有哪些 苹果电脑变慢了怎么办
  20. 芯片制造22nm制程是什么含义

热门文章

  1. Django使用WebSocket
  2. python使用geopy包提取城市经纬度及计算距离矩阵
  3. cmake 超简单使用
  4. Android测试教程10--monkey Test
  5. web前端期末大作业——餐品后台管理系统(html+css+javascript)
  6. 【空间分析】地理探测器法原理及应用
  7. php计算器验证只能为数字,计算器屏幕显示不全怎么修
  8. matlab2017b的破解激活
  9. 【文件编码转换】将GBK编码项目转为UTF-8编码项目
  10. java encodeuricomponent 编码_encodeURIComponent编码与解码