总线 设备 驱动

总线和设备

总线是把多个同类型的设备连接起来的一组信号线。
在这里插入图片描述
设备就是有某种接口的硬件,驱动就是控制驱动设备的程序(软件)。

2.linux的/sys目录下就是包含系统中总线,设备还有驱动等相关信息

[root@yj423 /sys]#ls
block     class     devices   fs        module
bus       dev       firmware  kernel    power
block:块设备
bus:系统中的总线
class: 设备类型,比如输入设备
dev:系统中已注册的设备节点的视图,有两个子目录char和block。
devices:系统中所有设备拓扑结构视图
fireware:固件
fs:文件系统
kernel:内核配置选项和状态信息
module:模块
power:系统的电源管理数据

3.总线,设备,驱动

一条总线下面会有很多的设备和相应的驱动,当有新设备加入时,总线负责为该设备查找(匹配)对应的驱动,如果找到了,就会有相应的驱动来驱动这个设备。
在这里插入图片描述
在/sys下面有一个bus子目录里面,所有支持的总线在该目录下有其子目录
比如:pci,spi,i2c等
在这里插入图片描述
每种总线下面都有deivces和drivers两个子目录,里面是各种总线下的设备和驱动。当有新设备加入时,总线负责给他查找驱动。
在这里插入图片描述

4.如何在/sys/bus下面创建自己的总线,驱动和设备

/sys下的目录是struct kobject,而总线,设备,驱动都是目录,所以从原始角度来说,就是要在/sys/bus创建新的目录和文件,总线,设备和驱动都是从kobject派生出来的。
内核中用struct bus_type来表示总线
struct device来表示设备
struct device_driver来表示驱动

创建虚拟总线

#include<linux/init.h>
//当总线上有新设备或驱动时,调用本函数来进行匹配,如果匹配成功,就返回1
static int vbus_match(struct device *dev,struct device_driver *drv)
{
	return 1;
}
//内核中用bus_type的对象来代表一条总线
static struct bus_type vbus ={
	.name = "vbus",     //总线名字,显示在/sys/bus下面
	.match=vbus_match,  //匹配函数,负责匹配驱动和设备
}
EXPORT_SYMBOL(vbus);//将该符号导出,其他的模块才能使用
static int __init vbus_init(void)
{
	//注册vbus总线
	return bus_register(&vbus);
}
static void __exit vbus_exit(void)
{
	//注销总线
	bus_unregister(&vbus);
}
module_init(vbus_init);
module_exit(vbus_exit);
MODULE_LICENSE("GPL");

创建驱动

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/devices.h>
//声明一下,这个模块要用到vbus,如果没有vbus就不能加载模块,这说明了一种依赖关系,vdrv依赖于vbus,必须保证系统中有vbus才能加载vdrv,因此要先加载总线。
extern struct bus_type vbus;
//内核中用device_driver来表示驱动,name是显示在/sys/bus/vbus/drivers/vdrv下面的
static struct device_driver vdrv = {
 	.name = "vdrv",
 	.bus = &vbus,
}
static int __init vdrv_init(void)
{
	return driver_register(&vdrv);
}
static void __exit vdrv_exit(void)
{
	driver_unregister(&vdrv);
}
module_init(vdrv_init);
module_exit(vdrv_exit);
MODULE_LICENSE("GPL");

创建虚拟设备

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/devices.h>
//声明一下,这个模块要用到vbus,
extern struct bus_type vbus;
//内核中用device来表示驱动
static struct device vdev = {
 	.init_name = "vdev",
 	.bus = &vbus,
 	.release=vdev_release, //关闭设备
};
static int __init vdrv_init(void)
{
	return device_register(&vdev);
}
static void __exit vdev_exit(void)
{
	device_unregister(&vdev);
}
module_init(vdev_init);
module_exit(vdev_exit);
MODULE_LICENSE("GPL");

我们先加载总线,才能加载总线上的驱动或设备,也就是说设备和驱动依赖于总线。
make modules_install安装模块
depmod更新模块的依赖信息
安装以后就可以用modprobe来加载卸载了
/lib/modules/版本号/modules.dep这个文件记录了系统中的模块以及他们之间的依赖关系。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

<( ̄︶ ̄)Okay.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值