Linux内核-平台设备-platform

Linux内核-平台设备-platform,第1张

概述一、注册一个平台设备   方法1:platform_device_register   核心数据结构: 1 struct platform_device { 2 const char *name; 3 int id; 4 bool id_auto; 5 struct device dev; 6 u

一、注册一个平台设备

  方法1:platform_device_register

  核心数据结构:

 1 struct platform_device { 2     const char    *name; 3     int        ID; 4     bool        ID_auto; 5     struct device    dev; 6     u32        num_resources; 7     struct resource    *resource; 8  9     const struct platform_device_ID    *ID_entry;10     char *driver_overrIDe; /* Driver name to force a match */11 12     /* MFD cell pointer */13     struct mfd_cell *mfd_cell;14 15     /* arch specific additions */16     struct pdev_archdata    archdata;17 };
VIEw Code

  核心接口

1 extern int platform_device_register(struct platform_device *);
VIEw Code

  代码示例

static struct resource my_resoure1[]={    {        .start     = 0x00,.end    = 0x10,.name    = "resource1 MEM",.flags    = IORESOURCE_MEM,},{        .start     = 0x11,.end    = 0x20,.name    = "resource2 MEM",{        .start     = 5,.end    = 9,.name    = "resource3 IRQ",.flags    = IORESOURCE_IRQ,{        .start     = 10,.end    = 15,.name    = "resource4 IRQ",};static struct platform_device my_device1 = {    .name           = "xym-test-platform-device-1",.ID                = -1,.num_resources     = ARRAY_SIZE(my_resoure1),.resource         = my_resoure1,.dev = {        .release = my_platform_device_release,//不注册此接口,卸载驱动时会报警告        .platform_data = &platform_data_1,};struct platform_device * p_device_1 = &my_device1;//device 1ret = platform_device_register(&my_device1);if (ret) {    printk(KERN_INFO"Unable to device 1 register(%d)\n",ret);    return ret;}
VIEw Code

  方法2:platform_device_register_full

  核心数据结构

@H_986_301@

 1 struct platform_device_info { 2         struct device *parent; 3         struct fwnode_handle *fwnode; 4  5         const char *name; 6         int ID; 7  8         const struct resource *res; 9         unsigned int num_res;10 11         const voID *data;12         size_t size_data;13         u64 dma_mask;14 };
VIEw Code

  核心接口

 1 extern struct platform_device *platform_device_register_full(const struct platform_device_info *pdevinfo); 2  3 static inline struct platform_device *platform_device_register_simple( 4         const char *name,int ID, 5         const struct resource *res,unsigned int num) 6  7 static inline struct platform_device *platform_device_register_resndata( 8         struct device *parent,const char *name, 9         const struct resource *res,unsigned int num,10         const voID *data,size_t size)
VIEw Code

  代码示例

static struct resource my_resoure2[]={    {        .start     = 0x21,.end    = 0x30,{        .start     = 0x31,.end    = 0x40,{        .start     = 20,.end    = 30,{        .start     = 40,.end    = 50,};static struct platform_device_info my_device_2 = {    .name           = "xym-test-platform-device-2",.num_res         = ARRAY_SIZE(my_resoure2),.res             = my_resoure2,.data            = &platform_data_2,.size_data        = sizeof(platform_data_2),};struct platform_device * p_device_2;//device 2p_device_2 = platform_device_register_full(&my_device_2);if (!p_device_2) {    printk(KERN_INFO"Unable to device 2 register\n");    return ret;}
VIEw Code

static struct resource my_resoure3[]={    {        .start     = 0x41,.end    = 0x50,{        .start     = 0x51,.end    = 0x60,{        .start     = 60,.end    = 70,{        .start     = 80,.end    = 90,};struct platform_device * p_device_3;p_device_3 = platform_device_register_resndata(NulL,"xym-test-platform-device-3",-1,my_resoure3,ARRAY_SIZE(my_resoure3),&platform_data_3,sizeof(platform_data_3));        if (!p_device_3)     {        printk(KERN_INFO"Unable to device 3 register\n");        return ret;    }
VIEw Code

static struct resource my_resoure4[]={    {        .start     = 0x61,.end    = 0x70,{        .start     = 0x71,.end    = 0x80,{        .start     = 100,.end    = 110,{        .start     = 120,.end    = 130,};struct platform_device * p_device_4;//device 4p_device_4 = platform_device_register_simple("xym-test-platform-device-4",-1,my_resoure4,ARRAY_SIZE(my_resoure4));    if (!p_device_4)     {        printk(KERN_INFO"Unable to device 4 register\n");        return ret;    }
VIEw Code

  方法3、DTS注册

/ {        platform_device_test,test{        compatible = "dts_test";        #address-cells = <1>;        #size-cells = <1>;        reg = <0x500 0x32>,<0x200 0x32>;        reg-names = "test mem1","resource2 MEM";        interrupt-parent = <&vic0>;        interrupts = <IRQ_TIMER0>,<IRQ_TIMER1>;        interrupt-names = "test irq1","resource4 IRQ";        };};    
VIEw Code

二、获取平台设备资源

  核心接口

1 extern struct resource *platform_get_resource(struct platform_device *unsigned int,unsigned int);2 extern int platform_get_irq(struct platform_device *,unsigned int);3 extern struct resource *platform_get_resource_byname(struct platform_device *,unsigned int,const char *);4 extern int platform_get_irq_byname(struct platform_device *,const char *);
VIEw Code

  代码示例

struct resource *presource;    int irq = 0;        printk(KERN_INFO"---------------------------\n");    printk(KERN_INFO"%s\n",__func__);    printk(KERN_INFO"%s\n",pdev->name);    if(pdev->dev.platform_data)    {        printk(KERN_INFO"platform_data is %d\n",*((int*)pdev->dev.platform_data));    }        presource = platform_get_resource(pdev,IORESOURCE_MEM,0);    if(!presource)    {        printk(KERN_INFO"get mem1 resource Failed\n");        return -1;    }    printk(KERN_INFO"resoure1 name %s\n",presource->name);    printk(KERN_INFO"resoure1 start 0x%08X\n",presource->start);    printk(KERN_INFO"resoure1 end 0x%08X\n",presource->end);        presource = NulL;    presource = platform_get_resource_byname(pdev,"resource2 MEM");    if(!presource)    {        printk(KERN_INFO"get mem2 resource Failed\n");        return -1;    }    printk(KERN_INFO"resoure1 name %s\n",presource->end);    irq = platform_get_irq(pdev,0);    if(irq < 0)    {        printk(KERN_INFO"get irq1 resource Failed\n");        return -1;            }    printk(KERN_INFO"irq1 value is %d\n",irq);    irq = 0;    irq = platform_get_irq_byname(pdev,"resource4 IRQ");    if(irq < 0)    {        printk(KERN_INFO"get irq2 resource Failed\n");        return -1;            }    printk(KERN_INFO"irq2 value is %d\n",irq);    printk(KERN_INFO"---------------------------\n\n\n");
VIEw Code

三、销毁设备

1 platform_device_unregister(&my_device);2 platform_device_unregister(p_device_2);
VIEw Code

 四、注册平台设备驱动

核心数据结构

struct platform_driver {    int (*probe)(struct platform_device *);    int (*remove)(struct platform_device *);    voID (*shutdown)(struct platform_device *);    int (*suspend)(struct platform_device *,pm_message_t state);    int (*resume)(struct platform_device *);    struct device_driver driver;    const struct platform_device_ID *ID_table;    bool prevent_deferred_probe;};
VIEw Code

核心接口

platform_driver_register
VIEw Code

代码示例

static struct platform_driver my_driver1 = {        .driver = {        .name     =  "xym-test-platform-device-1",.probe        = my_platform_probe,.remove        = my_platform_remove,.shutdown    = my_platform_shutdown,.suspend    = my_platform_suspend,.resume        = my_platform_resume,};ret = platform_driver_register(&my_driver1);if (ret) {    printk(KERN_INFO"Unable to driver 1 register(%d)\n",ret);    return ret;}
VIEw Code

其中,driver中的 ”.name“ 字段和device中的 ”.name“ 相同,即可完成驱动和设备的匹配,即进入probe阶段。

结果输出

  

  

  

  

完整代码如下:

#include <linux/init.h>#include <linux/module.h>#include <linux/platform_device.h>#include <linux/ioport.h>static struct resource my_resoure1[]={    {        .start     = 0x00,};static struct resource my_resoure2[]={    {        .start     = 0x21,};static struct resource my_resoure3[]={    {        .start     = 0x41,};static struct resource my_resoure4[]={    {        .start     = 0x61,};static int platform_data_1 = 1;static int platform_data_2 = 2;static int platform_data_3 = 3;static int platform_data_4 = 4;static int my_platform_probe(struct platform_device * pdev){    struct resource *presource;    int irq = 0;        printk(KERN_INFO"---------------------------\n");    printk(KERN_INFO"%s\n",irq);    printk(KERN_INFO"---------------------------\n\n\n");    return 0;}static int my_platform_remove(struct platform_device * pdev){    printk(KERN_INFO"%s\n",__func__);    return 0;}static voID my_platform_shutdown(struct platform_device *pdev){    printk(KERN_INFO"%s\n",__func__);}static int my_platform_suspend(struct platform_device * pdev,pm_message_t state){    printk(KERN_INFO"%s\n",__func__);    return 0;}static int my_platform_resume(struct platform_device * pdev){    printk(KERN_INFO"%s\n",__func__);    return 0;}static voID my_platform_device_release(struct device *dev){    printk(KERN_INFO"%s\n",__func__);}static struct platform_device my_device1 = {    .name           = "xym-test-platform-device-1",};struct platform_device * p_device_1 = &my_device1;static struct platform_driver my_driver1 = {        .driver = {        .name     =  "xym-test-platform-device-1",};static struct platform_device_info my_device_2 = {    .name           = "xym-test-platform-device-2",};struct platform_device * p_device_2;        static struct platform_driver my_driver2 = {        .driver = {        .name    =  "xym-test-platform-device-2",.remove     = my_platform_remove,.resume     = my_platform_resume,};struct platform_device * p_device_3;        static struct platform_driver my_driver3 = {        .driver = {        .name    =  "xym-test-platform-device-3",};struct platform_device * p_device_4;        static struct platform_driver my_driver4 = {        .driver = {        .name    =  "xym-test-platform-device-4",};static struct of_device_ID oz1c007_match_table[] = {    { .compatible = "dts_test"},};static struct platform_driver my_driver5 = {        .driver = {        .name    =  "xym-test-platform-device-5",.of_match_table = oz1c007_match_table,.owner        = THIS_MODulE,};static int  platform_device_init(voID){    int ret = 0;        printk(KERN_INFO"%s\n",__func__);        //device 1    ret = platform_device_register(&my_device1);    if (ret)     {        printk(KERN_INFO"Unable to device 1 register(%d)\n",ret);        return ret;    }    ret = platform_driver_register(&my_driver1);    if (ret) {        printk(KERN_INFO"Unable to driver 1 register(%d)\n",ret);        return ret;    }    //device 2    p_device_2 = platform_device_register_full(&my_device_2);    if (!p_device_2)     {        printk(KERN_INFO"Unable to device 2 register\n");        return ret;    }    ret = platform_driver_register(&my_driver2);    if (ret) {        printk(KERN_INFO"Unable to driver 2 register(%d)\n",ret);        return ret;    }    //device 3    p_device_3 = platform_device_register_resndata(NulL,sizeof(platform_data_3));        if (!p_device_3)     {        printk(KERN_INFO"Unable to device 3 register\n");        return ret;    }    ret = platform_driver_register(&my_driver3);    if (ret)     {        printk(KERN_INFO"Unable to driver 4 register(%d)\n",ret);        return ret;    }        //device 4    p_device_4 = platform_device_register_simple("xym-test-platform-device-4",ARRAY_SIZE(my_resoure4));    if (!p_device_4)     {        printk(KERN_INFO"Unable to device 4 register\n");        return ret;    }    platform_device_add_data(p_device_4,&platform_data_4,sizeof(platform_data_4));    ret = platform_driver_register(&my_driver4);    if (ret)     {        printk(KERN_INFO"Unable to driver 4 register(%d)\n",ret);        return ret;    }        //device 5 dts    ret = platform_driver_register(&my_driver5);    if (ret) {        printk(KERN_INFO"Unable to driver 5 register(%d)\n",ret);        return ret;    }    printk(KERN_INFO"---------------------------\n\n\n");    return ret;}static voID platform_device_destory(voID){    printk(KERN_INFO"%s\n",__func__);    platform_device_unregister(p_device_1);    platform_device_unregister(p_device_2);    platform_device_unregister(p_device_3);    platform_device_unregister(p_device_4);        platform_driver_unregister(&my_driver1);    platform_driver_unregister(&my_driver2);    platform_driver_unregister(&my_driver3);    platform_driver_unregister(&my_driver4);        platform_driver_unregister(&my_driver5);}static int __init platform_test_init(voID){    printk(KERN_INFO"Enter platform test\n\n");    platform_device_init();    return 0;}static voID __exit platform_test_exit(voID){    printk(KERN_INFO"Exit platform test\n");    platform_device_destory();    }module_init(platform_test_init);module_exit(platform_test_exit);MODulE_liCENSE("GPL");MODulE_AUTHOR("Marvin.xin");MODulE_DESCRIPTION("A Test Module for Platform driver");
VIEw Code 总结

以上是内存溢出为你收集整理的Linux内核-平台设备-platform全部内容,希望文章能够帮你解决Linux内核-平台设备-platform所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1029920.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存