linux总线
编写驱动程序:
1 #include <linux/init.h>
2 #include <linux/module.h>
3 #include <linux/device.h>
4
5 struct bus_type my_bus = {
6 .name = "my_bus",
7 };
8
9 static int __init my_bus_init (void)
10 {
11 int ret;
12
13 ret = bus_register(&my_bus); //注册一条总线
14 if (ret != 0) {
15 return ret;
16 }
17
18 return 0;
19 }
20
21 static void __exit my_bus_exit (void)
22 {
23 bus_unregister(&my_bus);
24 }
25
26 module_init(my_bus_init);
27 module_exit(my_bus_exit);
28
29 MODULE_LICENSE("GPL");
这个程序很简单,只是在初始化的时候加载了一条总线,该总线的名字为“my_bus”,用insmod加载之后可以在/sys/bus目录下看到一个叫my_bus的目录,如下图:

进到my_bus目录之后用ls -l命令,可以看到devices和drivers是两个目录,但是这两个目录都是空的,因为这条总线上没有任何设备和驱动,drivers_autoprobe、drivers_probe、uevent应该是三个默认的总线方法。

如果将程序进行一定修改:
1 #include <linux/init.h>
2 #include <linux/module.h>
3 #include <linux/device.h>
4 #include <linux/string.h>
5
6 struct bus_type my_bus = {
7 .name = "my_bus",
8 };
9
10 //用于得到属性
11 char Version[] = "my bus version 1.0";
12 ssize_t show_version(struct bus_type *bus, char *buf)
13 {
14 return snprintf(buf, PAGE_SIZE, "%s", Version);
15 }
16
17 BUS_ATTR(version, S_IRUGO, show_version, NULL);
18
19 static int __init my_bus_init (void)
20 {
21 int ret;
22
23 ret = bus_register(&my_bus); //注册一条总线
24 if (ret != 0) {
25 return ret;
26 }
27
28 if (bus_create_file(&my_bus, &bus_attr_version)) { //给一个bus创建一个属性
29 printk("fail to create my bus file");
30 }
31 return 0;
32 }
33
34 static void __exit my_bus_exit (void)
35 {
36 bus_unregister(&my_bus);
37 }
38
39 module_init(my_bus_init);
40 module_exit(my_bus_exit);
41
42 MODULE_LICENSE("GPL");
这时因为给bus创建了一个名为version的属性,因此在my_bus目录下可以看到一个叫version的文件,如下图:

打印该文件可以看到写入的version值:

可以创建多个属性,创建的属性都可以在my_bus目录下看到。
linux总线的更多相关文章
- 和菜鸟一起学linux总线驱动之初识spi驱动数据传输流程【转】
转自:http://blog.csdn.net/eastmoon502136/article/details/7921846 对于SPI的一些结构体都有所了解之后呢,那么再去瞧瞧SPI的那些长见的操作 ...
- linux总线、设备和设备驱动的关系
之一:bus_type 总线是处理器和一个或多个设备之间的通道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟"platform"总线.可以通过ls -l /sys/bu ...
- 和菜鸟一起学linux总线驱动之i2c死锁问题
不知不觉中已经有好几个月没有写点东西了,懒了就是懒了,说是忙着想把产品做得更好,都是借口,每天花一点时间来写点东西确实很不错,自己也坚持了很久很久,只不过今年以来,发现提高不是很大,能写的东西好少好少 ...
- Linux 总线、设备、驱动模型 与 设备树
1.总线.设备.驱动模型 本着高内聚.低耦合的原则,Linux 把设备驱动模型分为了总线.设备和驱动三个实体,这三个实体在内核里的职责分别如下: 设备和驱动向总线进行注册,总线负责把设备和对应的驱动绑 ...
- 《Linux总线、设备与驱动》USB设备发现机制
说明:本分析基于mstar801平台Linux2.6.35.11内核,其他内核版本仅供参考. 一.程序在内核中的位置 1.usb host做为pci总线下的一个设备存在(嵌入式系统中有可能也会直接挂在 ...
- Linux总线设备驱动模型
1. Linux2.6内核引入总线.设备.驱动模型来描述各种总线(PCI.USB.I2C.SPI)与外围设备及其驱动之间的关系. 2. 在Linux内核中,总线用bus_type结构来描述,定义于文件 ...
- Linux中总线设备驱动模型及平台设备驱动实例
本文将简要地介绍Linux总线设备驱动模型及其实现方式,并不会过多地涉及其在内核中的具体实现,最后,本文将会以平台总线为例介绍设备和驱动程序的实现过程. 目录: 一.总线设备驱动模型总体介绍及其实现方 ...
- 从需求的角度去理解Linux系列:总线、设备和驱动
笔者成为博客专家后整理以前原创的嵌入式Linux系列博文,现推出以让更多的读者受益. <从需求的角度去理解linux系列:总线.设备和驱动>是一篇有关如何学习嵌入式Linux系统的方法论文 ...
- Linux的总线设备驱动模型
裸机编写驱动比较自由,按照手册实现其功能即可,每个人写出来都有很大不同: 而Linux中还需要按照Linux的驱动模型来编写,也就是需要按照"模板"来写,写出来的驱动就比较统一. ...
随机推荐
- 54 个官方 Spring Boot Starters 出炉!别再重复造轮子了…….
在之前的文章,栈长介绍了 Spring Boot Starters,不清楚的可以点击链接进去看下. 前段时间 Spring Boot 2.4.0 也发布了,本文栈长再详细总结下最新的 Spring B ...
- Python 的 10 个开发技巧!太实用了
1. 如何在运行状态查看源代码? 查看函数的源代码,我们通常会使用 IDE 来完成. 比如在 PyCharm 中,你可以 Ctrl + 鼠标点击 进入函数的源代码. 那如果没有 IDE 呢? 当我们想 ...
- python简单爬去前程无忧信息招聘
import sys reload(sys) sys.setdefaultencoding('utf-8') import requests import csv from BeautifulSoup ...
- python 做回归
1 一元线性回归 线性回归是一种简单的模型,但受到广泛应用,比如预测商品价格,成本评估等,都可以用一元线性模型.y = f(x) 叫做一元函数,回归意思就是根据已知数据复原某些值,线性回归(regre ...
- Excel-RANK函数排名与拓展
问题场景 需求不同根据总分出排名(从大到小100分.100分.99分.98分.97分),排名需求: 第一种排名:第1名,第2名,第3名,第4名,第5名: 第二种排名:第1名,第1名,第3名,第4名,第 ...
- Java 从匿名内部类到Lambda表达式
匿名内部类和Lambda表达式有很多类似之处,首先都是在使用的时候才对接口进行实现,只是Lambda接口中只能由一个需要被实现的方法. 所有的Lambda表达式都可以 由匿名内部类改写: interf ...
- 如果对象为空,java函数String.valueOf(Object obj)返回"null"字符串
源码如下: public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toStr ...
- 宿主机网络中其它机器与Docker容器网络互通配置
前言 目前项目采用微服务架构进行开发,Nacos和其它服务部署到Docker中,Docker中容器采用的网络默认是桥接模式(Bridge),默认的子网码是172.17.0.1/16:宿主机是192.1 ...
- 记一次MAVEN依赖事故
笔者昨天遇到的背景是这样的 MAVEN A模块有一个子模块 需要依赖B模块下的一个子模块 我在B项目内通过mvn deploy上传子模块 但之后在A模块引用 怎么引用都不行 提示 org.a ...
- QtCreator使用技巧
快捷键 "F4" 在同名的头文件和源程序文件之间切换 "F2" 跟踪光标下的符号,若是变量,可以跟踪到变量声明的地方:若是函数体或函数声明,可以在两者之间切换. ...