• platform_device与驱动的联系



    platform_device与驱动的联系

    首先你需要为SOC的各个功能部分定义他的一些资源.例如可用于访问的寄存器地址.中断号,DMA什么的。然后将这些资源(resource) 作为 platform 的dev .通过platform_add_devices函数将你定义的paltform_device变量注册到系统的dev里面.。或者你可以象我这样将你需要的驱动添加:
    static struct platform_device *smdk2410_devices[] __initdata = {
    &s3c_device_usb,
    &s3c_device_lcd,
    &s3c_device_bl,
    &s3c_device_wdt,
    &s3c_device_i2c,
    &s3c_device_iis,
    &s3c_device_sdi,
    &s3c_device_adc,
    &s3c_device_nand,
    &s3c_device_usbgadget,
    &s3c_device_ts,
    &s3c_device_buttons,
    &s3c_device_rtc,
    &s3c_device_spi0,
    &s3c_device_timer1,//add by cefanty for battery charging
    };
    这样你的硬件的信息和资源就会注册到系统中.

    说了半天,这回该说这有什么用了。
    你编写的驱动或者移植别人的驱动,一般在驱动里有这样的代码,例如:
    static struct platform_driver s3c2410sdi_driver =
    {
    .probe          = s3c2410sdi_probe,
    .remove         = s3c2410sdi_remove,
    .suspend= s3c2410mci_suspend,
    .resume= s3c2410mci_resume,
    .driver={
    .name= "s3c2410-sdi",
    .bus    = &platform_bus_type,
    .owner= THIS_MODULE,
    },
    };

    看到 .name= "s3c2410-sdi",这条关键的语句没有??,它和我在上面注册的&s3c_device_sdi,里的device的名称是一致的.我这里展开我的s3c_device_sdi,的内容
    :
    /* SDI */

    static struct resource s3c_sdi_resource[] = {
    [0] = {
    .start = S3C2410_PA_SDI,
    .end   = S3C2410_PA_SDI + S3C24XX_SZ_SDI - 1,
    .flags = IORESOURCE_MEM,
    },
    [1] = {
    .start = IRQ_SDI,
    .end   = IRQ_SDI,
    .flags = IORESOURCE_IRQ,
    },
    [2] = {
    .start = 3,
    .end  = 3,
    .flags = IORESOURCE_DMA,
    }
    };

    struct platform_device s3c_device_sdi = {
    .name  = "s3c2410-sdi",
    .id  = -1,
    .num_resources  = ARRAY_SIZE(s3c_sdi_resource),
    .resource  = s3c_sdi_resource,
    };

    在驱动程序里的init代码大致如下:
    static int __init s3c2410sdi_init(void)
    {
    return platform_driver_register(&s3c2410sdi_driver);
    }
    用platform_driver_register 向系统注册这个驱动程序.而这个函数会在s3c2410sdi_driver的信息里提取name为搜索内容,搜索系统注册的device中有没有这个 platform_device。 如果有注册,那么接着会执行platform_driver 里probe函数.在这里显然是s3c2410sdi_probe函数  在probe函数里,用的最多和刚才platform_device有关的语句是platform_get_resource,这条语句用于获取 platform_device里的resource资料.例如映射的IO地址,中断等.剩下等得就是ioremap,和 request_irq等的事情了


    http://blogold.chinaunix.net/u/22754/showart_308497.html

  • 相关阅读:
    微信小程序如何获取openid
    js经典试题之常用的方法
    js经典试题之运算符的优先级
    js如何使浏览器允许脚本异步加载
    es6从零学习(五):Module的语法
    es6从零学习(四):Class的继承
    js如何处理字符串中带有↵字符
    Zuul中聚合Swagger的坑
    阿里Sentinel支持Spring Cloud Gateway啦
    Spring Boot中的Mongodb多数据源扩展
  • 原文地址:https://www.cnblogs.com/yuzaipiaofei/p/4124339.html
Copyright © 2020-2023  润新知