设备初始化时同样要执行一个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设备的更多相关文章

  1. Linux设备树语法详解

    概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写.引入了设备树之后,驱动代 ...

  2. 浅谈Android系统移植、Linux设备驱动

    一.Android系统架构 第一层:Linux内核 包括驱动程序,管理内存.进程.电源等资源的程序 第二层:C/C++代码库 包括Linux的.so文件以及嵌入到APK程序中的NDK代码 第三层:An ...

  3. (转载)使用 udev 高效、动态地管理 Linux 设备文件

    概述: Linux 用户常常会很难鉴别同一类型的设备名,比如 eth0, eth1, sda, sdb 等等.通过观察这些设备的内核设备名称,用户通常能知道这些是什么类型的设备,但是不知道哪一个设备是 ...

  4. linux设备驱动概述,王明学learn

    linux设备驱动学习-1 本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识. 一.设备驱动的作用 对设备驱动最通俗的解释就是“驱使硬件设备行动” .设 ...

  5. linux设备模型_转

    建议原博文查看,效果更佳. 转自:http://www.cnblogs.com/wwang/category/269350.html Linux设备模型 (1) 随着计算机的周边外设越来越丰富,设备管 ...

  6. Linux设备驱动工程师之路——内核链表的使用【转】

    本文转载自:http://blog.csdn.net/forever_key/article/details/6798685 Linux设备驱动工程师之路——内核链表的使用 K-Style 转载请注明 ...

  7. linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-119723.html linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟 xxxxxxxxxx ...

  8. linux设备驱动归纳总结(十二):简单的数码相框【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-116926.html linux设备驱动归纳总结(十二):简单的数码相框 xxxxxxxxxxxxxx ...

  9. linux设备驱动归纳总结(十一):写个简单的看门狗驱动【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-112879.html linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxx ...

  10. linux设备驱动归纳总结(十):1.udev&misc【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-111839.html linux设备驱动归纳总结(十):1.udev&misc xxxxxxx ...

随机推荐

  1. python之列表操作的几个函数

    Python中的列表是可变的,这是它却别于元组和字符串最重要的特点,元组和字符串的元素不可修改.列举一些常用的列表操作的函数和方法. 1,list.append(x),将x追加到列表list末尾: 1 ...

  2. Access 数据库容量问题

    1.单个表的最大容量  2G. 2.单个表的最大条数 3.自动编号的最大数 4.数据库的最大容量 5.text备注形式的字段的最大数据量 6.ole对象字段的最大数据量,图片的最大大小 7.文本字段的 ...

  3. Hive Hooks介绍

    Hive作为SQL on Hadoop最稳定.应用最广泛的查询引擎被大家所熟知.但是由于基于MapReduce,查询执行速度太慢而逐步引入其他的近实时查询引擎如Presto等.值得关注的是Hive目前 ...

  4. SpringMVC+JPA+SpringData配置

    <properties>   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  ...

  5. [leetcode]236. Lowest Common Ancestor of a Binary Tree树的最小公共祖先

    如果一个节点的左右子树上分别有两个节点,那么这棵树是祖先,但是不一定是最小的,但是从下边开始判断,找到后一直返回到上边就是最小的. 如果一个节点的左右子树上只有一个子树上遍历到了节点,那么那个子树可能 ...

  6. 任意文件上传——tcp

    package chaoba; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; ...

  7. .NET Core学习笔记(8)——Entity Framework Core之Database First

    曾经我以为再也不会去弄啥Database First,然鹅我错了.这个世界上就是有啪啪打脸和真香的时候.当小伙伴拿着做好的DB表结构和SQL脚本递过来的时候,我知道我没法拒绝.望着他突起的肱二头肌和充 ...

  8. IDEA中配置Git,在Github上clone项目到IDEA

    一.安装git 1.用homebrew安装git 运行以下命令安装 brew install git 默认的安装位置是 /usr/local/Cellar目录中(后面会用到) 二.在idea中配置Gi ...

  9. haproxy 里的超时

    haproxy 中的超时 客户端请求阶段 timeout client haproxy 和客户端通信时,连接不活跃的时间,既不发送数据,也不ack接收的数据 如果未设置,则永不超时,此时连接是否超时依 ...

  10. VirtualBox安装ubuntu 开发环境 配置

    一 下载VirtualBox安装程序以及ubuntu光盘镜像 1.下载VirtualBox安装程序(本文选用的是6.0.12版本) 建议从清华大学镜像站 https://mirrors.tuna.ts ...