Linux总线驱动设计(1)-总线设备驱动模型

1.总线模型概述

  • 随着技术的不断进步,系统的拓扑结构也越来越复杂,对热插拔,跨平台移植性的要求也越来越高,2.4内核已经难以满足这些需求。为适应这种形势的需要,从Linux 2.6内核开始提供了全新的设备模型。
  • 假如说现在有一条USB总线,它支持热插拔,支持鼠标、键盘、网卡。当网卡插入时,USB总线需要感知到新设备的插入,然后根据设备描述符逐个去匹配和它一样的设备驱动程序,可能先找到鼠标驱动程序,发现处理不了,然后找键盘驱动程序,发现页支持不了,最后找到了网卡驱动程序,可以处理。于是把USB的控制权交给网卡驱动程序,当网卡拔掉时,USB总线同样需要感知到设备的移除,然后通过网卡驱动程序做相应的处理。

2.总线

  • 在Linux系统中,总线的编程模型和字符型,混杂型也类似。在Linux内核中存在一种描述结构来描述总线,还有注册、注销总线设备的函数。

2.1 总线描述结构

  • 在 Linux 内核中, 总线由 struct bus_type结构表示,定义在 <linux/device.h>
struct bus_type {
    const char *name; /*总线名称*/
    int (*match) (struct device *dev, struct
    device_driver *drv); /*驱动与设备的匹配函数*/
    ………
}
  • 它的成员非常多,这里介绍2个重要的成员,第一个成员是总线的名字,第二个成员是对设备的匹配函数,上面提到过,设备插入时,需要匹配对应的设备驱动函数。
  • int (*match)(struct device * dev, struct device_driver * drv),当一个新设备或者新驱动被添加到这个总线时,该函数被调用。用于判断指定的驱动程序是否能处理指定的设备。若可以,则返回非零。

2.2 注册总线

  • 总线的注册使用如下函数
  • bus_register(struct bus_type *bus)
  • 若成功,新的总线将被添加进系统,并可在/sys/bus 下看到相应的目录。

2.3 注销总线

  • 总线的注销使用:
  • void bus_unregister(struct bus_type *bus)

2.4 创建一条总线

  • 使用上面的代码就可以注册一条总线了
  • bus.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/device.h>

// 驱动与设备的匹配函数
int my_match (struct device *dev, struct device_driver *drv)
{
    return 0;
}

// 定义总线
struct bus_type my_bus_type = 
{
    .name = "my_bus",
    .match = my_match,
}; 

int my_bus_init()
{
    int ret;   
   
    // 注册总线 
    ret = bus_register(&my_bus_type);  
    
    return ret;
}

void my_bus_exit()
{
    bus_unregister(&my_bus_type);  // 注销总线
}

MODULE_LICENSE("GPL");

module_init(my_bus_init);
module_exit(my_bus_exit);
  • 安装这个模块后,使用:
  • #ls  /sys/bus,命令可以看到我们注册总线的名字
  • 注意,如果代码中没有声明遵循GPL协议,将会出现如下警告,且总线注册失败。
bus: module license 'unspecified' taints kernel.
Disabling lock debugging due to kernel taint
bus: Unknown symbol bus_unregister
bus: Unknown symbol bus_register
insmod: cannot insert '
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值