Embedded LINUX driver learning 14 software and hardware separation programming (1) source code part

Embedded LINUX driver learning 14 software and hardware separation programming (1) source code part

1. Describe hardware information header files, functions and instructions

//头文件位置: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);

2. Describe the software information header file, function and description

//头文件位置: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 *);


Guess you like

Origin blog.csdn.net/weixin_47273317/article/details/108181688