#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. grep 使用场景

    (1)结合find命令和管道   你的一个音乐文件夹里有多种格式的文件,而你只想找到艺术家jay的mp3文件,并且不含有任何的混合音轨 find . -name "*mp3" | ...

  2. dubbo用户指南-总结

    dubbo用户指南-总结 入门 背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用 ...

  3. TNS-12541: TNS:no listener , TNS-12542: TNS:address already in use

    查看数据库监听状态不对$ lsnrctl status LSNRCTL for IBM/AIX RISC System/6000: Version 10.2.0.5.0 - Production on ...

  4. js异步获取数据的问题

    最近做js开发的时候发现了很多哥们不能区分同步和异步的区别,典型的在ajax部分,在该ajax为异步操作的时候,获取不到success之后的data的值,于是产生了各种奇葩的写法.比如创建一个局部变量 ...

  5. Android -- 读写文件到内部ROM,SD卡,SharedPreferences,文件读写权限

    (内容整理自张泽华教程) 1. 概述 使用文件进行数据存储 首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过 ...

  6. 二路归并排序,利用递归,时间复杂度o(nlgn)

    public class MergeSort { public void mergeSort(int[]data, int left, int right) { if(left >= right ...

  7. strcpy的实现

    // // Strcpy.c // libin // // Created by 李宾 on 15/8/20. // Copyright (c) 2015年 李宾. All rights reserv ...

  8. js 格式化时间日期函数小结2

    方法一: // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符,  // 年(y)可以用  ...

  9. 【C#基本功 控件的用法】 委托

    接触C#这段时间,很多内容容易理解,但也也有很多内容总是无法踏过门槛,就像Delegate 委托,这种新的机制是Labview不具备的,他的一个用法,也让我们这些从labview跨越过来的coder, ...

  10. Java基础16:Java多线程基础最全总结

    Java基础16:Java多线程基础最全总结 Java中的线程 Java之父对线程的定义是: 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进 ...