自定义一条总线

这篇博客详细介绍了在Linux内核中创建自定义总线类型`liyou_bus`,以及相应的设备结构`test_dev`和驱动结构`test_drv`。通过`probe`和`remove`函数实现设备的探测与移除,并提供了匹配函数`mybus_match`。博主展示了如何注册总线、设备和驱动,以及它们的初始化和退出过程。
摘要由CSDN通过智能技术生成

#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>

//相当于之前的platform_device, i2c_client, spi_device
struct test_dev{
    struct device dev;
    int number;
};

//相当于之前的platform_driver, i2c_driver, spi_driver
struct test_drv{
    struct device_driver driver;
    int version;
    int (*probe)(struct test_dev * pdev);
    int (*remove)(struct test_dev * pdev);
};

int mybus_probe(struct test_dev * pdev)
{
    printk("--------%s---------\n",__FUNCTION__);
    return 0;
}

int mybus_remove(struct test_dev * pdev)
{
    printk("--------%s---------\n",__FUNCTION__);
    return 0;
}

int mybus_parent_probe(struct device *pdev)
{
    struct test_dev * tdev;
    struct test_drv * tdrv;
    struct device_driver * pdrv;
    pdrv = pdev->driver;
    tdev = container_of(pdev, struct test_dev, dev);
    tdrv = container_of(pdrv, struct test_drv, driver);
    tdrv->probe(tdev);
    return 0;
}

int mybus_parent_remove(struct device *pdev)
{
    struct test_dev * tdev;
    struct test_drv * tdrv;
    struct device_driver * pdrv;
    pdrv = pdev->driver;
    tdev = container_of(pdev, struct test_dev, dev);
    tdrv = container_of(pdrv, struct test_drv, driver);
    tdrv->remove(tdev);
    return 0;
}

int mybus_match(struct device *pdev, struct device_driver *pdrv)
{
    struct test_dev * tdev;
    struct test_drv * tdrv;
    tdev = container_of(pdev, struct test_dev, dev);
    tdrv = container_of(pdrv, struct test_drv, driver);
    if(tdev->number == tdrv->version)
        return 1;
    return 0;
}

void mybus_release(struct device *pdev)
{

}

struct bus_type bus = {
    .name = "liyou_bus",
    .match = mybus_match,
};

struct test_dev my_dev = {
    .dev = {
        .init_name = "mydev",
        .bus = &bus,
        .release = mybus_release,
    },
    .number = 0x1234,
};

struct test_drv my_drv = {
    .driver = {
        .name = "mydrv",
        .bus = &bus,
        .probe = mybus_parent_probe,
        .remove = mybus_parent_remove,
    },
    .version = 0x1234,
    .probe = mybus_probe,
    .remove = mybus_remove,
};

static int __init mybus_init(void)
{
    int ret;
    ret = bus_register(&bus);
    ret = device_register(&my_dev.dev);
    ret = driver_register(&my_drv.driver);
    return 0;
}
static void __exit mybus_exit(void)
{
    driver_unregister(&my_drv.driver);
    device_unregister(&my_dev.dev);
    bus_unregister(&bus);
}

module_init(mybus_init);
module_exit(mybus_exit);
MODULE_LICENSE("GPL");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__Lewis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值