platform总线驱动三种匹配方式

设备信息和驱动进行匹配

1.设置名字匹配
通过对象结构体中struct platform_driver的struct device_driver.name进行名字匹配
代码:
mydev.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>

//填充设备信息
struct resource res[]={
    [0]={
        .start = 0x12345678,
        .end = 0x12345678+49,
        .flags = IORESOURCE_MEM,
    },

    [1]={
        .start = 71,
        .end = 71,
        .flags = IORESOURCE_IRQ,
    },
};

//定义relese函数
void pdev_release(struct device *dev)
{
    printk("%s:%d\n",__func__,__LINE__);
}

//给对象赋值
struct platform_device pdev=
{
    .name = "aaa",
    .id = PLATFORM_DEVID_AUTO,
    .dev = {
        .release = pdev_release,
    },
    .resource = res,
    .num_resources = ARRAY_SIZE(res),
};


//入口函数
static int __init mycdev_init(void)
{  
    //注册device
    platform_device_register(&pdev);

    return 0;

}

//出口函数
static void __exit mycdev_exit(void)
{
    //注销device
    platform_device_unregister(&pdev);
}

module_init(mycdev_init);
module_exit(mycdev_exit);
// GPL协议
MODULE_LICENSE("GPL");

mydri.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <linux/mod_devicetable.h>

struct resource *res;
int irqno;

//定义probr函数
int pdrv_probe(struct platform_device *pdev)
{
    //获取MEM类型资源
    res = platform_get_resource(pdev,IORESOURCE_MEM,0);
    if(res == NULL)
    {
        printk("获取资源失败\n");
        return ENODATA;
    }

    //获取终端类型的资源
    irqno = platform_get_irq(pdev,0);
    if(irqno < 0)
    {
        printk("获取中断资源失败\n");
        return ENODATA;
    }

    printk("addr:%#llx,irqno:%d\n",res->start,irqno);

    return 0;
}

int pdrv_remove(struct platform_device *pdev)
{
    printk("%s:%d\n",__func__,__LINE__);
    return 0;
}


//给对象初始化
struct platform_driver pdrv=
{
    .probe = pdrv_probe,
    .remove = pdrv_remove,
    .driver = {
        .name = "aaa",
    },
};


module_platform_driver(pdrv);
// GPL协议
MODULE_LICENSE("GPL");

在这里插入图片描述

2.id_table名字表匹配
通过对象结构体中struct platform_driver的const struct platform_device_id *id_table进行名字表匹配
代码:
mydri.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <linux/mod_devicetable.h>

struct resource *res;
int irqno;

//定义probr函数
int pdrv_probe(struct platform_device *pdev)
{
    //获取MEM类型资源
    res = platform_get_resource(pdev,IORESOURCE_MEM,0);
    if(res == NULL)
    {
        printk("获取资源失败\n");
        return ENODATA;
    }

    //获取中断类型的资源
    irqno = platform_get_irq(pdev,0);
    if(irqno < 0)
    {
        printk("获取中断资源失败\n");
        return ENODATA;
    }

    printk("addr:%#llx,irqno:%d\n",res->start,irqno);

    return 0;
}

int pdrv_remove(struct platform_device *pdev)
{
    printk("%s:%d\n",__func__,__LINE__);
    return 0;
}

//构建名字表
struct platform_device_id idtable[]={
    {"aaa",0},
    {"bbb",1},
    {"ccc",2},
    {},//防止match函数遍历完名字表之后越界
};


//给对象初始化
struct platform_driver pdrv=
{
    .probe = pdrv_probe,
    .remove = pdrv_remove,
    .driver={
        .name="hello",
    },
    .id_table = idtable,
};


module_platform_driver(pdrv);
// GPL协议
MODULE_LICENSE("GPL");  

3.设备树匹配方式
mydri.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <linux/mod_devicetable.h>

struct resource *res;
int irqno;

//定义probr函数
int pdrv_probe(struct platform_device *pdev)
{
    //获取MEM类型资源
    res = platform_get_resource(pdev,IORESOURCE_MEM,0);
    if(res == NULL)
    {
        printk("获取资源失败\n");
        return ENODATA;
    }

    //获取中断类型的资源
    irqno = platform_get_irq(pdev,0);
    if(irqno < 0)
    {
        printk("获取中断资源失败\n");
        return ENODATA;
    }

    printk("addr:%#llx,irqno:%d\n",res->start,irqno);

    return 0;
}

int pdrv_remove(struct platform_device *pdev)
{
    printk("%s:%d\n",__func__,__LINE__);
    return 0;
}

 //构建compatible表
    struct of_device_id oftable[]=
    {
        {.compatible="hqyj,platform",},
        {}
    };

//给对象初始化
struct platform_driver pdrv=
{
    .probe = pdrv_probe,
    .remove = pdrv_remove,
    .driver={
        .name="hello",
        .of_match_table=oftable,//设备树匹配
    },
};


module_platform_driver(pdrv);
// GPL协议
MODULE_LICENSE("GPL");  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Device设备驱动模型和platform总线驱动模型是Linux内核中两个重要的驱动模型。 Device设备驱动模型是Linux内核中用于管理设备驱动的模型。它定义了设备驱动程序的结构和接口,以及设备与驱动程序之间的交互方式。设备驱动程序需要实现一组标准的接口函数,这些函数包括设备初始化、设备释放、设备读取、设备写入等。当内核检测到有新的设备插入时,它会根据设备的信息和设备驱动程序的信息来加载相应的驱动程序,并将设备和驱动程序进行匹配,建立起它们之间的联系。 platform总线驱动模型是Linux内核中用于管理平台总线驱动的模型。平台总线是一种常见的总线类型,它用于连接SOC(System-on-Chip)上的各种外设,如GPIO(通用输入输出)、SPI(串行外设接口)、I2C(IIC总线)等。平台总线驱动程序需要实现一组标准的接口函数,这些函数包括总线驱动初始化、总线设备注册、总线设备注销等。当内核检测到有新的平台总线设备插入时,它会根据平台总线设备的信息和平台总线驱动程序的信息来加载相应的驱动程序,并将平台总线设备和驱动程序进行匹配,建立起它们之间的联系。 因此,Device设备驱动模型和platform总线驱动模型都是用于管理设备驱动的模型,它们之间的联系在于,平台总线驱动程序也是一种设备驱动程序,只不过它是用于管理平台总线上的设备。而它们的区别在于,Device设备驱动模型是用于管理各种设备驱动的模型,而platform总线驱动模型则是用于管理平台总线上的设备驱动的模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值