1. platform_device 会包含platform_data 和 resource定义:

一般platform device信息,会定义在 arch/arm/mach-xxx/board-xxx.c 中。

如这里的sarac模块,被定义在arch/arm/mach-cartesio/core-sta2065.c中

[cpp] view plaincopy
  1. static struct platform_device sarac_device = {
  2. .name           = "cartesio-sarac",
  3. .id             = 1,
  4. .dev = {
  5. .init_name = "cartesio-sarac",
  6. //设备中包含的 platform数据
  7. .platform_data = &sarac_platform_data,
  8. },
  9. .num_resources  = ARRAY_SIZE(sarac_resource),
  10. //包含的资源
  11. .resource       = sarac_resource,
  12. };

这里的 .name 很重要,驱动会根据这个名字,在probe的时候进行匹配,如果有名字相同,就会匹配上。

platform_device 的定义如下:

[cpp] view plaincopy
  1. struct platform_device {
  2. const char      * name;
  3. int             id;
  4. struct device   dev;
  5. u32             num_resources;
  6. struct resource * resource;
  7. const struct platform_device_id *id_entry;
  8. /* arch specific additions */
  9. struct pdev_archdata    archdata;
  10. };

他包含了一个设备dev,还有resource. 这些都是platform的优势,可以包含很多信息。

如上面的sarac_device,就包含了sarac_platform_data 和 sarac_resource 两块内容,具体定义如下:

[cpp] view plaincopy
  1. static struct sarac_platform_data_container sarac_platform_data = {
  2. //这个platform data 其实就是一个DMA slave 的定义
  3. .mem2sarac_slave = {
  4. .dma_dev        = &dma0_device.dev,     /* SARAC bound to DMA0 */
  5. .tx_req_line    = DMA0_REQ_SRC_DMA_DRE,
  6. .rx_req_line    = DMA0_REQ_SRC_DMA_DRF,
  7. .nr_descs       = 2048,
  8. .channel        = DMA_CHANNEL_AUTO,
  9. .slave_width    = DMA_TRANSFER_WIDTH_32BIT,
  10. .flow_ctrlr     = DMA_FLOW_CONTROLLER_DMA,
  11. .burst_size     = DMA_BURST_SIZE_1,     /* fifo packet size */
  12. .ahb_master     = DMA_AHB_MASTER_0,
  13. },
  14. };
[cpp] view plaincopy
  1. static struct resource sarac_resource[] = {
  2. //resource 包含了两块,一块是寄存器访问地址, 一块是中断号信息
  3. [0] = {
  4. .start  = CARTESIO_SARAC_BASE,
  5. .end    = CARTESIO_SARAC_BASE + SZ_4K - 1,
  6. .name   = "SaRaC registers",
  7. .flags  = IORESOURCE_MEM,
  8. },
  9. [1] = {
  10. .start  = IRQ_SARAC_DRF,
  11. .end    = IRQ_SARAC_DRF,
  12. .name   = "CartesioPlus SaRaC interrupt",
  13. .flags  = IORESOURCE_IRQ,
  14. },
  15. };

2.  驱动probe中对platform的使用

模块加载时,会注册platform driver: 也就是 platform_driver_register()函数;

[cpp] view plaincopy
  1. static int __init cartesio_sarac_init(void)
  2. {
  3. return platform_driver_register(&cartesio_sarac_driver);
  4. }
  5. module_init(cartesio_sarac_init);

cartesio_sarac_driver的定义如下:

[cpp] view plaincopy
  1. static struct platform_driver cartesio_sarac_driver = {
  2. .probe          = cartesio_sarac_probe,
  3. .remove         = __devexit_p(cartesio_sarac_remove),
  4. .driver = {
  5. .name   = DEVICE_NAME,
  6. .owner  = THIS_MODULE,
  7. },
  8. };

这里的.name 定义必须跟之前platform定义中的.name 一致,这样platform驱动和设备才能匹配上。

[cpp] view plaincopy
  1. /*
  2. * Asynchronous SaRaC device name
  3. */
  4. #define DEVICE_NAME     "cartesio-sarac"

该驱动被加载时,会自动运行cartesio_sarac_probe 函数:

[cpp] view plaincopy
  1. static int __devinit cartesio_sarac_probe(struct platform_device *pdev)
  2. {
  3. struct sarac_device_data *sarac_device;
  4. struct resource *res;
  5. struct sarac_platform_data_container *sarac_plat_data=NULL;
  6. int ret;
  7. sarac_device = kzalloc(sizeof(struct sarac_device_data), GFP_KERNEL);
  8. if (!sarac_device) {
  9. dev_err(&pdev->dev, "not enough memory for driver status\n");
  10. return -ENOMEM;
  11. }
  12. //通过这个函数,就把 platform_device 中的内容,赋给 sarac_device,就可以在这驱动中使用了
  13. //这里的pdev 就是指向platform_device的指针。
  14. platform_set_drvdata(pdev, sarac_device);
  15. printk("SARAC probe called\n");
  16. //该函数用来获取platform中的resource资源
  17. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  18. if (!res) {
  19. dev_err(&pdev->dev, "register area not defined\n");
  20. ret = -ENODEV;
  21. goto out_free;
  22. }
  23. //把IO空间,赋值给sarac_device
  24. sarac_device->base_addr = ioremap(res->start, resource_size(res));
  25. if (!sarac_device->base_addr) {
  26. dev_err(&pdev->dev, "unable to remap register area\n");
  27. ret = -ENODEV;
  28. goto out_free;
  29. }
  30. //把platform_device->dev.platform_data 赋值过来
  31. sarac_plat_data = pdev->dev.platform_data;
  32. if (sarac_plat_data->mem2sarac_slave.dma_dev) {
  33. sarac_device->dma_to_sarac_client = &sarac_plat_data->mem2sarac_slave;
  34. sarac_device->dma_to_sarac_client->tx_reg = res->start + SARAC_DILR;
  35. sarac_device->dma_from_sarac_address = res->start + SARAC_DOLR;
  36. } else {
  37. dev_err(&pdev->dev, "DMA info not found in platform data\n");
  38. ret = -1;
  39. goto dma_err;
  40. }
  41. //把platform_device 中的IRQ 信息赋值过来
  42. sarac_device->irq = platform_get_irq(pdev, 0);
  43. //注册中断
  44. ret = request_irq(sarac_device->irq, cartesio_sarac_irq_handler, 0,
  45. dev_name(&pdev->dev), &pdev->id);
  46. if (ret) {
  47. dev_err(&pdev->dev, "failed to allocate IRQ %d\n", sarac_device->irq);
  48. goto out_unmap;
  49. }
  50. else {
  51. aab_peripheral_enable(AAB_SARAC, AAB_AC_WRITE | AAB_AC_READ);
  52. }
  53. //在sys中创建信息接口
  54. sarac_kobj = kobject_create_and_add("audio_sarac", NULL);
  55. if (!sarac_kobj)
  56. return -ENOMEM;
  57. ret = sysfs_create_group(sarac_kobj, &cartesio_sarac_attr_group);
  58. if (ret)
  59. return ret;
  60. dev_info(&pdev->dev, "Module initialized, version" DRV_VERSION  "\n");
  61. return 0;
  62. dma_err:
  63. out_unmap:
  64. iounmap(sarac_device->base_addr);
  65. out_free:
  66. kfree(sarac_device);
  67. return ret;
  68. }

驱动中platform resource 和 porbe 之间的关系相关推荐

  1. sql语句和java的关系_java中Statement 与 PreparedStatement接口之间的关系和区别

    Statement 和 PreparedStatement之间的关系和区别. 关系:PreparedStatement继承自Statement,都是接口 区别:PreparedStatement可以使 ...

  2. 显卡,GPU,显卡驱动,CUDA ,CUDA Toolkit之间的关系

    相关知识收集于网络,主要来自 显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么? GPU 和显卡是什么关系? 显卡.显卡驱动.cuda 之间的关系是什么 ...

  3. gnocchi中的resource/metric/measure等的关系

    ceilometer和gnocchi中相对应的概念 ceilometer gnocchi resource resource meter metric sample/event measure cei ...

  4. Java中基本数据类型和Object之间的关系

    1.基本数据类型和Object之间是没有关系的 2.基本数据类型的包装类 例如int 的包装类Integer的父类则是Object 输入:12 解释:在赋值的过程中进行自动装箱

  5. GPU、GPU驱动、OpenGL、游戏引擎之间的关系

    游戏引擎使用OpenGL渲染,OpenGL调用显卡驱动告诉GPU干活,GPU经过各种计算把最终的图像渲染出来. 游戏引擎:用于制作游戏或其它实时交互交互图形程序的软件,大多数游戏引擎都包含了渲染.UI ...

  6. Java中JDK,JRE和JVM之间的关系

    初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Envi ...

  7. Spring源码分析之Aop中拦截器,适配器,通知之间的关系

    首先举一个例子: public class MethodBeforeAdviceInterceptor implements MethodInterceptor, Serializable {priv ...

  8. android类之间的关系,Android 中Activity,Window和View之间的关系

    Activity是Android应用程序的载体,允许用户在其上创建一个用户界面,并提供用户处理事件的API,如 onKeyEvent, onTouchEvent等. 并维护应用程序的生命周期.Acti ...

  9. Java中的类与对象之间的关系

    目录 1 面向对象思想 2 类和对象 1 类 2 对象 3 类与对象的关系 3 类的定义 4 对象的使用 5 成员变量的默认值 1 面向对象思想 对象泛指现实中的一切事物,每种事物都具备自己的属性和行 ...

最新文章

  1. 一文详解激光点云的物体聚类
  2. aspx ttf文件加载不出来_加载页面信息,刷不出来心态都崩了
  3. Yii2 behavior运用
  4. 一段简单的html 5 音频,5个用于处理HTML5音频的库和API
  5. 千兆网线8根线定义图_网线水晶头如何制作及怎么测试?
  6. 下载丨2020 PG亚洲大会(PPT汇总)
  7. php检查函数是否存在,php判断类是否存在函数class_exists用法分析
  8. c#实现list集合移除某些列_List方法
  9. 你知道什么是 MySQL 的模糊查询?
  10. 粒子群算法离散化各代表什么_粒子群优化算法(PSO)之基于离散化的特征选择(FS)(三)...
  11. [Ubuntu Error]无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
  12. php mkdir创建多级目录
  13. C#枚举器:foreach语句、IEnumerable、IEnumerator以及yield return (一)
  14. 微运行库2015_vc2015运行库下载-Visual C++ 2015(vc2015)下载V14.0.24123 官方版【32位|64位|】-西西软件下载...
  15. 春节宅家玩什么?8款小游戏陪你一起过年
  16. quicktime for java,QuickTime是什么意思
  17. 三种健身妙法-每天五分钟简便易行有宏效
  18. 研究生期间如何赚外快
  19. 笔记本屏幕 亮度 背光调节 工具 c++ 用来解决亮度调节功能键失效问题
  20. 10亿个数中找出最大的10000个数之top K问题

热门文章

  1. howler.js音频控制js库
  2. 复旦大学高等代数考试命题的若干经验
  3. openjudge 1.7.15 整理药名
  4. Hungry Rabbit
  5. 微信小程序(第二十四章)- 数据交互前置
  6. C++ STL 中的accumulate的用法
  7. 一键seo提交收录_关于SEO行业中的某些信息,你究竟应该相信谁?又或者谁都不要信!...
  8. 《操作系统》2020年期末A卷
  9. 【BZOJ】【双倍的幸福】【双(三)倍的经验】
  10. 22春天津大学《公共关系学》在线作业二