linux设备
设备初始化时同样要执行一个device_register函数,该函数传入一个struct device *类型的指针,因此要定义一个struct device类型的变量作为我们的设备。
struct device结构体中init_name表示的是设备名,bus表示设备所处的总线,我们将这两项初始化。但问题是bus是总线类型,这个值从哪来,这个值就从我们之前写的总线中来,在自己写的总线驱动文件中定义了struct bus_type my_bus,因此在设备文件中声明extern struct bus_type my_bus;同时在总线文件中要用EXPORT_SYMBOL(my_bus);将my_bus变量导出。
设备文件为:
1 #include <linux/init.h>
2 #include <linux/module.h>
3 #include <linux/device.h>
4
5 extern struct bus_type my_bus;
6 struct device my_dev = {
7 .init_name = "my_bus_device",
8 .bus = &my_bus,
9 };
10
11 static int __init my_dev_init (void)
12 {
13 int ret;
14
15 ret = device_register(&my_dev);
16
17 return 0;
18 }
19
20 static void __exit my_dev_exit (void)
21 {
22 device_unregister(&my_dev);
23 }
24
25 module_init (my_dev_init);
26 module_exit (my_dev_exit);
27
28 MODULE_LICENSE("GPL");
注意Makefile中要把bus也加上去。
编译完之后先用insmod加载总线,这时/sys/bus目录下会出现一个my_bus目录,my_bus目录下的device目录下是空的,因为该总线上没有挂载任何设备。
接下来用insmod加载设备,这时在my_bus/device目录下会出现一个my_bus_device的文件,而且这是一个链接,如下图:

说明bus总线上有一个叫做my_bus_device的设备了,其实这也是一个目录。进入该目录可以看到目录下的文件:

同样也可以给设备增加属性,调用函数device_create_file。将代码修改如下:
1 #include <linux/init.h>
2 #include <linux/module.h>
3 #include <linux/device.h>
4 #include <linux/string.h>
5
6 extern struct bus_type my_bus;
7 struct device my_dev = {
8 .init_name = "my_bus_device",
9 .bus = &my_bus,
10 };
11
12 ssize_t my_device_show (struct device *dev, struct device_attribute *attr, char *buf)
13 {
14 return snprintf(buf, PAGE_SIZE, "%s\n", "data:2019.01.01");
15 }
16
17 DEVICE_ATTR(data, S_IRUGO, my_device_show, NULL);
18
19 static int __init my_dev_init (void)
20 {
21 int ret;
22
23 ret = device_register(&my_dev);
24
25 device_create_file(&my_dev, &dev_attr_data);
26
27 return 0;
28 }
29
30 static void __exit my_dev_exit (void)
31 {
32 device_unregister(&my_dev);
33 }
34
35 module_init (my_dev_init);
36 module_exit (my_dev_exit);
37
38 MODULE_LICENSE("GPL");
用insmod加载总线和驱动之后可以在my_bus_device目录中看到data文件,打印data文件中便可以看到 "data:2019.01.01",如下图:

linux设备的更多相关文章
- Linux设备树语法详解
概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写.引入了设备树之后,驱动代 ...
- 浅谈Android系统移植、Linux设备驱动
一.Android系统架构 第一层:Linux内核 包括驱动程序,管理内存.进程.电源等资源的程序 第二层:C/C++代码库 包括Linux的.so文件以及嵌入到APK程序中的NDK代码 第三层:An ...
- (转载)使用 udev 高效、动态地管理 Linux 设备文件
概述: Linux 用户常常会很难鉴别同一类型的设备名,比如 eth0, eth1, sda, sdb 等等.通过观察这些设备的内核设备名称,用户通常能知道这些是什么类型的设备,但是不知道哪一个设备是 ...
- linux设备驱动概述,王明学learn
linux设备驱动学习-1 本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识. 一.设备驱动的作用 对设备驱动最通俗的解释就是“驱使硬件设备行动” .设 ...
- linux设备模型_转
建议原博文查看,效果更佳. 转自:http://www.cnblogs.com/wwang/category/269350.html Linux设备模型 (1) 随着计算机的周边外设越来越丰富,设备管 ...
- Linux设备驱动工程师之路——内核链表的使用【转】
本文转载自:http://blog.csdn.net/forever_key/article/details/6798685 Linux设备驱动工程师之路——内核链表的使用 K-Style 转载请注明 ...
- linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-119723.html linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟 xxxxxxxxxx ...
- linux设备驱动归纳总结(十二):简单的数码相框【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-116926.html linux设备驱动归纳总结(十二):简单的数码相框 xxxxxxxxxxxxxx ...
- linux设备驱动归纳总结(十一):写个简单的看门狗驱动【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-112879.html linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxx ...
- linux设备驱动归纳总结(十):1.udev&misc【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-111839.html linux设备驱动归纳总结(十):1.udev&misc xxxxxxx ...
随机推荐
- maven 报错 Failed to execute goal on project ...: Could not resolve dependencies for project ...
昨天在研究 项目 遇到这样一个问题 可以看到 上面有三个 模块 jeecg-boot-base-common .jeecg-boot-module-system .jeecg-boot-modules ...
- 工作流学习之 IDEA 使用activiti插件 出现乱码
今天学习 工作流 (work flow ) 的时候遇到了一点小问题 就是在 activitit的插件的时候 出现了乱码,弄了很久,终于解决了,就做个总结 嘻嘻 当场懵了,我记得我改了编码呀 - (Se ...
- RabbitMq基本概念理解
RabbitMQ的基本概念 RabbitMQ github项目地址 RabbitMQ 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的 消息中间件 ...
- 【Tomcat】Tomcat原理与系统架构
目录 版本: 一,目录说明 二,浏览器访问服务器的流程 三,Tomcat系统总体架构 3.1 Tomcat请求的大致流程 3.2 Servlet容器处理请求流程 3.3 Tomcat系统总体架构 四, ...
- Powerdesigner中表导出sql语句关于字段注释乱码的问题
问题说明 注释中的汉字都变成了?,应该是编码的问题. declare @CurrentUser sysname select @CurrentUser = user_name() execute sp ...
- 【Tomcat】Tomcat服务器核心配置说明及标签
目录 一,主要标签结构 二,Server标签 标签属性: 子标签: 三,Service 标签 子标签: 四,Executor 标签 属性: 五,Connector标签 属性: 六,Engine标签 属 ...
- Qt学习笔记-Qt5和Qt4在音频方面的不同-QtAV
之前学习qt4的时候,播放音频用的是phonon播放后端插件+mplayer. 今天改用qt5了.qt5中去掉了phonon模块加了multimedia.但是依然无法播放音乐,因为没有ffmpge s ...
- win shift s截图不能用(已解决)
win10上面 win shift s不能的原因是快捷键冲突导致的: 比如说你的电脑上安装了OneNode2016(讽刺的是这是微软自家的软件),或者其他截图软件都有可能导致快捷键冲突,从而不能使用. ...
- java JButton按钮始终居中
怎么做的拖动窗口内部的按钮始终居中呢? 很简单把按钮放入Box中进行了. 代码如下: import javax.swing.Box; import javax.swing.JButton; impor ...
- Lambda 表达式实例
public class Java8Tester {/*** 语法 lambda 表达式的语法格式如下: (parameters) -> expression 或 (parameters) -& ...