嵌入式LINUX驱动学习之14软硬件分离编程(一)源码部分

嵌入式LINUX驱动学习之14软硬件分离编程(一)源码部分

一、描述硬件信息头文件、函数及说明

//头文件位置:linux/platform_device.h
/*   struct platform_device{}结构体
     功能:保存驱动的硬件信息
*/
struct platform_device {
    
    
       /*
            name 和id配合使用;
            当id  = -1时,注册到kobject列表里面驱动名称为name所指向的字符串"%s" , name ;
            当id != -1时,注册到kobject列表里面的驱动名称为"%s,%d" , name,id ;
                          即:向struct kobject kobj对象的name里注册一名称 name.id                        
            实现方式详见如下::
                  drivers/base/platform.c     
                             platform_device_registe(struct platform_device *pdev)   ->   
                                     platform_device_add(pdev)   ->  
                                              if (pdev->id != -1)
                                                   dev_set_name(&pdev->dev, "%s,%d", pdev->name,  pdev->id);
                                              else
                                                   dev_set_name(&pdev->dev, "%s", pdev->name);
                  drivers/base/core.c
                        dev_set_name(struct device *dev, const char *fmt, ...)   ->  
                             va_list vargs;
                             kobject_set_name_vargs(&dev->kobj, fmt, vargs)
                  lib/kobject.c 
                         kobject_set_name_vargs(struct kobject *kobj, const char *fmt,va_list vargs)   ------>
                                kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs);
                         
        */
        const char      * name;
        int             id;  
        struct device   dev; //用于指定总线驱动器名称,可以不指令,默认dev.parent.init_name = "platform"
        /*
        //源码位置:include/linux/ioport.h
          struct resource { 
              resource_size_t start; //硬件资源寄存器开始地址
              resource_size_t end;//硬件资源寄存器结束地址
              const char *name;   //硬件资源名称
              unsigned long flags; //参考:include/linux/ioport.h
              struct resource *parent, *sibling, *child;//一般由内核维护
          };
        */
        u32             num_resources;  //struct resource结构体数组中硬件资源的个数
        struct resource * resource;     //用于描述硬件资源,详见上术注释,
        /*  结构体struct device 中有一个成员 void *platform_data;可以实现device和driver之间数据通过无类型传递
                   struct device {
                       struct kobject kobj;//向内核注册一个用于驱动匹配的名称
                       void *platform_data;//void * 可用于自定义数据类型,用于device和driver数据传递
        */
        struct device *dev;
        //..........省略更多,可参考源码了解...............................
};

//向内核注册硬件信息函数 :
int platform_device_register(struct platform_device *pdev);    //结构体描述如上

//从内删除硬件信息函数:
void platform_device_unregister(struct platform_device *pdev);   //结构体描述如上

/*
    从内核获取struct resource结构体信息函数:
           struct resource *platform_get_resource(pdev,type,num);
           功能:主要用于分层思想的driver中,当platform_driver_register注册后,
                 name匹配成功,可以用此函数获取到device中的struct resource信息。
           参数说明:
                  pdev: struct platform_device类型
                  type:struct resource 的成员变量;flags;
                  num : 第几个type
*/            
extern struct resource *platform_get_resource(struct platform_device *pdev, unsigned int type, unsigned int num);

二、描述软件信息头文件、函数及说明

//头文件位置:linux/platform_device.h
/*   struct platform_driver{}结构体
     功能:保存驱动的软件信息
*/
struct platform_driver {
    
    
        int (*probe)(struct platform_device *);//注册成功,检测到硬件信息时调用
        int (*remove)(struct platform_device *);//移除软件信息时调用
        void (*shutdown)(struct platform_device *);//关机操作时调用
        int (*suspend)(struct platform_device *, pm_message_t state);//休眠操作时调用
        int (*resume)(struct platform_device *);//重启操作时调用
        struct device_driver driver;//主要关注结构体中的name成员,用于和struct platform_device中的name匹配
        const struct platform_device_id *id_table;//一般内核维护,不用管
};
//向内核注册驱动软件信息
extern int platform_driver_register(struct platform_driver *);
//从内核删除驱动软件信息
extern void platform_driver_unregister(struct platform_driver *);


猜你喜欢

转载自blog.csdn.net/weixin_47273317/article/details/108181688