platform框架 学习总结

1,内核以实现总线,只需写驱动和设备的信息;

2,设备链表、驱动链表;总线完成链表匹配(name);驱动执行probe函数,向上层提供open、read、write接口需要在probe函数中注册字符设备驱动;在probe函数中根据设备信息操作硬件;ioremap物理地址映射成虚拟地址操作硬件;总线编译再内核中;设备提供信息(中断号/地址);

总线完成设备和驱动的匹配;

3,platform是一个虚拟的总线,platform中采用分离思想。将设备信息和设备驱动分离,在内核中所有的设备信息被放到一条链表中,设备驱动放到一条链表中。链表中的成员通过总线进行匹配,匹配成功后执行驱动中的probe函数。设备信息和设备驱动分离后会执行驱动中的remove函数。

4,设备端: 1.分配对象struct platform_device pdev;

      2.对象初始化 struct platform_device {

              const  char   *name;//用于匹配的名字

              int       id; //总线号  -1

              struct  device  dev;//所有设备的父类

              u32     num_resources;//资源数

                   struct resource * resource;//资源结构体

            }

            struct device {

               void (*release)(struct device *dev);           

            }

            struct resource {

              resource_size_t start; //物理起始地址 0x0001a00

              resource_size_t end;  //物理结束地址 0x0001a00+20

              const char *name; //名字,一般不填

              unsigned long flags; //资源类型 IORESOURCE_IO/MEM

              

            }

      3.对象的注册 int platform_device_register(struct platform_device *pdev)

         对象的注销 void platform_device_unregister(struct platform_device *pdev)

      platform总线:它是有内核提供,提供设备和驱动端的注册和注销的方法,以及匹配过程。

    驱动端:1.分配对象 struct platform_driver pdrv;

      2.对象初始化 struct platform_driver {

              int (*probe)(struct platform_device *);//匹配成功执行的函数

              int (*remove)(struct platform_device *);//卸载执行的函数 

              struct device_driver driver;

              const struct platform_device_id *id_table;//id_table 匹配方式

            };

            struct device_driver {

              const char  *name;//nema匹配方式

              struct module  *owner;

            };

      3.注册 int platform_driver_register(struct platform driver *);

         注销 void platform_driver_unregister(struct platform driver *);

5,驱动端获取设备信息的函数

  struct resource *platform_get_resource(struct platform_device *dev,  unsigned int type,  unsigned  int num)

  参数1:pdev;参数2:资源类型;参数3:第几个资源。

  返回值:成功返回设备信息结构体,失败返回NULL

6,驱动端获取中断资源

  int platform_get__irq(struct platform_device *dev, unsigned int num)

  参数:pdev;  中断类型中的第几个资源

  返回值:成功中断号,失败错误码

7,idtable匹配方式                           ----------------------mma8451 控制三轴芯片----------------------

  struct platform_device_id {

  char name[PLATFORM_NAME_SIZE]; //用于匹配的名字

  kernel_ulong_t driver_data;  //给驱动传递的数据

  }

  备注:匹配先后顺序:设备树、idtable、name

posted on 2019-08-24 18:08  struggle_w  阅读(388)  评论(0)    收藏  举报