#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h> // 按照 platform_device 格式定义
struct test_dev {
  char *name;
  // 必须要有父类,注册时会将父类注册到链表
  struct device dev;
  // 其他成员自定义
}; // 按照 platform_driver 格式定义
struct test_drv {
  // 必须要有父类,注册时会将父类注册到链表
  struct device_driver driver;
  // 其他成员自定义
}; void mydev_release(struct device *dev)
{
  // 防止 rmmod 时报错
} // 匹配函数
int my_bus_match(struct device *dev, struct device_driver *drv)
{
  struct test_dev *testdev;   // 优先使用 drv 父类中的 name 和 dev 中的 name 比较匹配
  testdev = container_of(dev, struct test_dev, dev);   if (strcmp(drv->name, testdev->name) == )
  {
    printk("match ok!\n");
    return ;
  }   // 如果 drv 父类中的 name 没有定义,再使用 drv 中的 name 比较匹配
  // 代码忽略
  return ;
} // 匹配成功后执行的函数
int my_bus_probe(struct device *dev)
{
  printk("-----%s-----\n", __FUNCTION__);   return ;
} // 初始化自定义总线
struct bus_type my_bus= {
  .name = "my_bus",
  .match = my_bus_match,
}; struct test_dev mydev = {
  .name = "dev_drv",
  .dev = {
    .init_name = "test_bus",
    .bus = &my_bus,
    .release = mydev_release,
  },
}; struct test_drv mydrv= {
  .driver = {
    .name = "dev_drv",
    .bus = &my_bus,
    .probe = my_bus_probe,
  },
}; static int __init my_bus_init(void)
{
  // 注册总线
  bus_register(&my_bus);   // 注册设备,注意是父类
  device_register(&mydev.dev);   // 注册驱动,注意是父类
  driver_register(&mydrv.driver);   return ;
} static void __exit my_bus_exit(void)
{
  // 注销
  device_unregister(&mydev.dev);
  driver_unregister(&mydrv.driver);
  bus_unregister(&my_bus);
} module_init(my_bus_init);
module_exit(my_bus_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Aaron Lee");

注册和注销时一定要选用 device 和 driver 父类:

device_register(&mydev.dev);

driver_register(&mydrv.driver);

device_unregister(&mydev.dev);

driver_unregister(&mydrv.driver);

ps:原因与平台总线相同,请参照下面文章中的“分离”。

http://www.cnblogs.com/lialong1st/p/7756669.html

自定义的总线在 /sys/bus 目录下

struct test_dev 中的 init_name 在 /sys/bus/my_bus/device 目录下

Linux 自定义总线类型的更多相关文章

  1. Linux:file命令显示自定义文件类型

    file 命令可以查看文件类型信息,原理见: 非常Linux-file命令与magic file 修改 /ect/magic 文件后,可用 file 命令显示自定义文件类型信息. man magic ...

  2. Linux+I2C总线分析(主要是probe的方式)

    Linux I2C 总线浅析 ㈠ Overview Linux的I2C体系结构分为3个组成部分: ·I2C核心: I2C核心提供了I2C总线驱动和设备驱动的注册.注销方法,I2C通信方法(即“algo ...

  3. linux usb总线驱动(一)

    目录 linux usb总线驱动框架 USB 介绍 传输类型 控制器接口 2440接口 基本流程 alloc_dev choose_address hub_port_init usb_get_devi ...

  4. Linux平台总线驱动设备模型

    platform总线是一种虚拟的总线,相应的设备则为platform_device,而驱动则为platform_driver.Linux 2.6的设备驱动模型中,把I2C.RTC.LCD等都归纳为pl ...

  5. Linux SPI总线和设备驱动架构之二:SPI通用接口层

    通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...

  6. Linux的总线设备驱动模型

    裸机编写驱动比较自由,按照手册实现其功能即可,每个人写出来都有很大不同: 而Linux中还需要按照Linux的驱动模型来编写,也就是需要按照"模板"来写,写出来的驱动就比较统一. ...

  7. 自定义委托类型 - .Net自带委托类型

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递. 与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用. 一.自定义委托类型 1.语法结构:访问修 ...

  8. C:Wordpress自定义文章类型(图视频)

    自定义文章类型,包括: 1:单独的"文章内容模板" 2:单独的"文章列表模板" 3:单独的"控制后台"(文章分类.添加文章) 创建自定义文章 ...

  9. sharepoint2010问卷调查(3)-实现问卷的开始和结束时间(采用自定义字段类型)

    接着上面的图片调查,sharepoint自带的问卷调查是没有开始和结束时间的.这个在项目过程不太实用.问卷一般有开始和结束时间的.因此需要自己 动手开发一个自定义字段类型字段.如下图: 开发添加栏目会 ...

随机推荐

  1. NumPy数学算数函数

    NumPy - 算数函数 很容易理解的是,NumPy 包含大量的各种数学运算功能. NumPy 提供标准的三角函数,算术运算的函数,复数处理函数等. 三角函数 NumPy 拥有标准的三角函数,它为弧度 ...

  2. 在阿里云上安装python3.4和pycharm

    一. 安装python3.4 二. 安装pycharm 三. 安装可视化界面和远程桌面连接 四. 启动和配置pycharm 五. 安装更多字体 六. 给pycharm设置桌面快捷方式 一. 安装pyt ...

  3. win8 商店应用 设计风格原则

    共八条: 1,突出内容(数据). a,仅在屏幕上保留最相关的元素:移除线条.框和不必要的图形效果:限制屏幕上持久显示的导航框,如选项卡. b,交互尽量直接在内容上,直接控制内容来完成操作,而不是使用控 ...

  4. SpringBoot_10_打成jar包后使用外部配置文件中的配置来启动工程

    一.前言 三.参考资料 1.Spring Boot配置文件放在jar外部

  5. Excel 读写操作

    读 import xlrd from xlrd.book import Book from xlrd.sheet import Sheet from xlrd.sheet import Cell wo ...

  6. RESTful api 与 Django的 restfulframework

    RESTful api 与 Django的 restfulframework 1 restful api 的基本概念 一类的资源使用一个url,不同的操作通过 请求方式处理 api -- >&g ...

  7. javascript 继承的两种方式

    js中继承可以分为两种:对象冒充和原型链方式 一.对象冒充包括三种:临时属性方式.call()及apply()方式1.临时属性方式 代码如下: function Person(name){     t ...

  8. C++中关于标准输出流cout中使用递增运算符的问题

    今天听同学提起一个问题,在C++中运行下面的语句会得到什么结果: ; cout << a++ << a++ << a++; 起初我个人想当然地认为会输出012,然而 ...

  9. 有了Docker的程序猿们就能开启“上帝视角”?

    现在,如果有程序猿说不知道Docker,这将是难以想象的. 百科是这样描述Docker的."Docker是dotCloud开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植 ...

  10. Lua基础---lua字符串库函数详解,实例及正则表达式

    参考这个网友写的,比较简单容易理解. http://blog.csdn.net/wlgy123/article/details/49206183