platform device和platform driver简述

首先我们在module_init中使用platform_driver_register来注册我们的驱动。一般来说platform_driver_register放在module_init的最后调用,因为platform_driver_register如果检测到有归属于该驱动的device就会去调用你驱动里的probe,probe完结后platform_driver_register才会返回,所以在注册驱动前要先把device number, class这些东西先注册上,probe里要用的。

module_init的基本工作(假定是char dev):

int mymodule_init()
{
    alloc_chrdev_region(...);
    class_create(...);
    platform_driver_register(...);
}

如果有ID match上的话platform_driver_register就会调用probe:

platform device基本上就是用来描述你写在device tree里的那些东西。

以下两个函数用于设置/获取设备相关的数据(可以理解为类似WDM中的DEVICE_EXTENSION):

platform_set_drvdata(struct platform_device *pdev, void *data);

void *platform_get_drvdata(struct platform_device *pdev);

如果你的设备使用中断:

int irq = platform_get_irq(pdev, 0);
request_irq(irq, ...);

如果设备使用两个或以上中断,那么platform_get_irq的第二参数分别是0, 1, ...。

当然对应的中断向量ID要事先写在device tree里面。device tree中的中断向量ID和platform_get_irq返回的irq一般来说是不一样的。

原文地址:https://www.cnblogs.com/byeyear/p/3314449.html