Linux 自定义总线类型

#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) == 0)
  {
    printk("match ok!\n");
    return 1;
  }

  // 如果 drv 父类中的 name 没有定义,再使用 drv 中的 name 比较匹配
  // 代码忽略
  return 0;
}

// 匹配成功后执行的函数
int my_bus_probe(struct device *dev)
{
  printk("-----%s-----\n", __FUNCTION__);

  return 0;
}

// 初始化自定义总线
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 0;
}

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 目录下

转载于:https://www.cnblogs.com/lialong1st/p/7762571.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值