博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux 自定义总线类型
阅读量:4704 次
发布时间:2019-06-10

本文共 1876 字,大约阅读时间需要 6 分钟。

#include 
#include
#include
// 按照 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:原因与平台总线相同,请参照下面文章中的“分离”。

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

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

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

你可能感兴趣的文章
Redis 常见配置
查看>>
解决 Invalid signature file digest for Manifest 问题
查看>>
fnd_request.submit_request
查看>>
JavaFX校验IP和端口的合法性
查看>>
C++ Class与Struct的区别
查看>>
MySQL字段之集合(set)枚举(enum)
查看>>
Random类(java.util)
查看>>
poj 1961 Period(KMP训练指南例题)
查看>>
leetcode Sum Root to Leaf Numbers(所有路径之和)
查看>>
poj 2686 Traveling by Stagecoach ---状态压缩DP
查看>>
Rational Rose--简介
查看>>
声明银行账户类,成员变量包括账号,储户姓名,开户时间,身份证号码,存储余额等账户信息...
查看>>
利用isPointInPath()实现canvas小游戏的交互
查看>>
创建简单线程
查看>>
ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇
查看>>
用纯JS实现双向数据绑定
查看>>
php 解决返回数据 数字 变成科学计数法后转换问题
查看>>
How-To-Secure-A-Linux-Server
查看>>
网络与多线程的设计例子
查看>>
ubuntu12.04 各种小问题及解决方案集锦【持续更新】
查看>>