设备驱动外传 – 虚拟总线和platform device「建议收藏」

设备驱动外传 – 虚拟总线和platform device「建议收藏」1.总论2.系统初始化platformdevice3.驱动程序使用platformdevice   1.总论Linux-2.6.11引入了设备模型的概念,将大部分设备驱动挂载到虚拟总线上。其目的在于:1)提供友好的用户接口,用户可以在sys/bus/platform/下找到相应的驱动和设备。2)更有利于电源管理。  2

大家好,又见面了,我是你们的朋友全栈君。

1. 总论

2. 系统初始化 platform device

3. 驱动程序使用 platform device

 

  

1. 总论

Linux-2.6.11引入了设备模型的概念,将大部分设备驱动挂载到虚拟总线上。

其目的在于:

1) 提供友好的用户接口,用户可以在sys/bus/platform/下找到相应的驱动和设备。

2) 更有利于电源管理。

 

 

2. 系统初始化 platform device

在驱动程序的初始化函数 xxx_probe(struct platform_device *pdev)中,其结构体参数platform_device,是在系统初始化过程中发现了该设备存在的前提条件下,通过platform_device_register(dev) 完成注册的,并且struct platform_device的结构变量被赋值。

以Xscal初始化sd卡控制器为例,

 

 /* linux/arch/arm/mach-pxa/starwood_p1.c */

MACHINE_START(SAAR, “PXA935 handheld Platform (Starwood P1)”)
 … …
 .init_machine   = saar_init,
MACHINE_END

 

static void __init saar_init(void)
{

 … …

 saar_init_mmc();

  … …
}

 

static void __init saar_init_mmc(void)
{

 … …
  pxa_set_mci_info(&saar_mci_platform_data); 
//saar_mci_platform_data完成该设备特有数据的赋值
 … …
 }

 

static struct pxamci_platform_data saar_mci_platform_data = {

 .detect_delay = 50,
 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
 .init   = saar_mci_init,   //回调函数,设置sd卡控制器的探测中断pin脚 gpio_cd
 .exit  = saar_mci_exit,
};

 

void __init pxa_set_mci_info(struct pxamci_platform_data *info)
{

 pxa_register_device(&pxa_device_mci, info);
}

 

struct platform_device pxa_device_mci = {     //完成结构体platform_device的赋值
 .name  = “pxa2xx-mci”,    //芯片的设备名称,驱动通过匹配该名字找到设备
 .id  = 0,
 .dev  = {

  .dma_mask = &pxamci_dmamask,
  .coherent_dma_mask = 0xffffffff,
 },
 .num_resources = ARRAY_SIZE(pxamci_resources),
 .resource = pxamci_resources,  
//设置芯片的物理地址
};

 

void __init pxa_register_device(struct platform_device *dev, void *data)
{

 … …

 dev->dev.platform_data = data;     //将该设备特有的数据挂到 dev->dev.platform_data下

 platform_device_register(dev);  

 … …
}

 

 

 

3. 驱动程序使用 platform device

 驱动程序通过platform_driver_register()找到与该驱动对应的设备,完成驱动和设备的绑定,并且挂载到虚拟总线上。

具体过程如下,

 platform_driver_register(struct platform_driver *drv);

                 |

 driver_register(&drv->driver);

                 |

 bus_add_driver(drv); 

                 |

 driver_attach(drv);

int driver_attach(struct device_driver *drv)
{

 return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);  //__driver_attach最后调用driver_bound(dev);
}

 

int bus_for_each_dev(struct bus_type *bus, struct device *start,
       void *data, int (*fn)(struct device *, void *))
{

 … …
 while ((dev = next_device(&i)) && !error)
  fn(dev, data);  //fn即__driver_attach,完成设备与驱动的绑定

  … …
}

 static void driver_bound(struct device *dev)
{

 … …

 klist_add_tail(&dev->knode_driver, &dev->driver->p->klist_devices);
}

 

 

 

驱动程序找到了自己所对应的设备之后,就可以对该设备初始化了,即probe()操作,在probe()中,便可以使用platform_device结构体里的数据了。

 

仍然以sd卡控制器为例,

/* linux/drivers/mmc/host/pxamci.c */

 

static int __init pxamci_init(void)
{

 … …
 return platform_driver_register(&pxamci_driver);
}

 

static struct platform_driver pxamci_driver = {

 .probe  = pxamci_probe,
 … …
};

 

static int pxamci_probe(struct platform_device *pdev)
{

 

  struct resource *r;

 

/*

 *  得到sd卡控制器芯片的物理地址

 */

 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 r = request_mem_region(r->start, SZ_4K, DRIVER_NAME);

 host->res = r;

/*

 *  得到sd卡控制器芯片的内部中断源并申请中断 

 */

 irq = platform_get_irq(pdev, 0);

 host->irq = irq;
 request_irq(host->irq, pxamci_irq, 0, DRIVER_NAME, host);

 

   … …
 }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163805.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2020-10-24

    2020-10-24产品经理面试习题大汇总凡事“预则立,不预则费”。即使你有丰富的产品经验,在面试那种紧张的环境下要面试好也不是一件易事,因为在那种环境下,你要对面试官提出的问题快速反映,快速组织语言,而你又没有经常训练这种能力,想回答好还是很不容易的,如果你经常背一些产品经理的面试题,那你回答的时候就流畅多了,下面将一些常见的产品经理面试题整理下来,需要的小伙伴拿去。1、介绍一下你自己介绍一下自己的姓名,年龄、毕业院校,工作经历。简单的介绍,保持在三分钟以内,给面试官问问题的时间。工作经历主要讲一些.

    2022年6月20日
    21
  • 调查发现女人比男人更喜欢使用社交网站(组图)

    调查发现女人比男人更喜欢使用社交网站(组图)男人更喜欢语音/电话交流女人比男人更喜欢使用社交网站  北京时间9月25日上午消息,根据市场研究机构Rebtel发布的最新调查结果,女人更喜欢通过社交网站与家人、朋友及同事联系,而男人更喜欢用电话与家人、朋友及同事联系。  Rebtel在今年5月17日至19日对美国2361名18岁以上成年人进行了这项调查,旨在揭示一个问题,即一旦美国成年人只能使用一种通讯…

    2022年7月25日
    13
  • BufferedWriter写入

    BufferedWriter写入带有缓存区的字符输出流BufferedWriter:带有缓存的字符输出流。packagecom;importjava.io.*;/***BufferedWriter:带有缓存的字符输出流。*/publicclasstest{publicstaticvoidmain(String[]args){//带有缓存区的字符输出流BufferedWriterout=null;try{

    2022年5月1日
    60
  • java jersey 参数_Java Jersey:接收表单参数作为字节数组

    java jersey 参数_Java Jersey:接收表单参数作为字节数组我试过如下:@Path(“/someMethod”)@POST@Produces(MediaType.TEXT_HTML)@Consumes(MediaType.APPLICATION_FORM_URLENCODED)publicStringsomeMethod(@FormParam(“someParam”)byte[]someParam){return””;}但得到这个错误:如果我改变…

    2022年7月14日
    19
  • Linux安装nmap命令

    Linux安装nmap命令在线安装yuminstallnmap本地安装rpm软件包的安装可以使用程序rpm来完成。执行下面的命令:rpm-ivhyour-package.rpm

    2022年5月8日
    45
  • 重学《Java从入门到精通》第四版 清华大学出版社[通俗易懂]

    重学《Java从入门到精通》第四版 清华大学出版社[通俗易懂]作为一名刚毕业1年半的AndroidDeveloper,在工作后总发觉自己的Java功底很是欠缺。所以准备再重新学习一遍Java。温故而知新,可以为师矣。Java这门编程语言或许会被其他编程语言所代替,但其优秀的编程思想却永远不会消失,所以不用有所质疑,选择它没有错。Java这门编程语言我是从大二以看视频的方式开始学起的(那种零基础学Java视频)。在学校图书馆看了近1个月,大致了解了Java中的一些关键字、对象名称、常用特性等。至于手敲还是很懵懂、也不熟练。所以就淘宝选购了本《Java从入门到精通》

    2022年7月8日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号