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 ...
随机推荐
- 程序运行慢?你怕是写的假 Python
Python程序运行太慢的一个可能的原因是没有尽可能的调用内置方法,下面通过5个例子来演示如何用内置方法提升Python程序的性能. 1. 数组求平方和 输入一个列表,要求计算出该列表中数字的的平方和 ...
- Java学习日报7.31
package bank;import java.util.*;public class Bank { private Scanner sc=new Scanner(System.in); priva ...
- 数据库事务特性ACID
事务 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit).在计算机术语中,事务通常就是指数据库事务. 概念 一 ...
- Mono for android,Xamarin点击事件的多种写法
(一)原本java的写法(相信很多是学过java的): 需要实现接口View.IOnClickListener,最好也继承类:Activity,因为View.IOnClickListener接口又继承 ...
- TurtleBot3 Waffle (tx2版华夫)(1)笔记本上安装虚拟机、 Ubuntu 系统
1.1虚拟机的安装 1.1.1.windows7系统建议安装14.1版本 VMware workstation 百度云链接: 链接:https://pan.baidu.com/s/1q6Lh9fMuX ...
- android中VideoView播放sd卡上面的视频
(1)videoView组件只支持MP4和3gp格式的视屏播放,如果想播放其它视屏格式的文件,还得开发能够播放的视屏播放器 (2)videoView组件功能比较单一,如果想开发功能丰富的播放器,还得重 ...
- 首秀:Markdown学习笔记
# Markdown学习 ## 标题 ### 三级标题 #### 四级标题 ## 字体 **Hello,World!** *Hello,World!* ***Hello,World!*** ~~Hel ...
- 解决phpmyadmin上传文件大小限制的配置方法
解决phpmyadmin上传文件大小限制的配置方法 phpmyadmin导入SQL文件时涉及到phpmyadmin上传文件大小限制问题,默认phpmyadmin上传文件大小为2M,如果想要phpmya ...
- Oracle 锁表以及解锁
-- kill_exec 列为解锁的语句,copy出来执行即可.select 'alter system kill session ''' || s.sid || ',' || s.serial# | ...
- TCP连接的建立与释放(超详细)
前言:在计算机网络协议中,TCP只是其中一个,然而在网络使用中,TCP也是最离不开的协议之一,它的重要性毋庸置疑,最最重要的是,面试的重点就是它啊,呜呜~~,今天我们一起来看下TCP的连接建立与释放, ...