Yuhang Zheng

第十五节、平台总线模型——probe函数编写

N 人看过

本节用于介绍平台总线模型——probe函数编写

编写probe函数的思路:

1、从device.c里面获得硬件资源

方式一:直接获得

platform驱动文件里面的probe函数传入的是struct platform_devic *变量

int (*probe)(struct platform_device *);    

是一个指向struct platform_devic结构体的指针,也就是platform设备里面定义的struct platform_device

所以我们可以在probe函数里通过pdev直接访问platform_device变量

printk("beep_res is %s\n", pdev->resource[0].name);

不安全,不推荐此类方法

方法二:使用函数获得

文件位置路径:include/linux/platform_device.h

实际函数位置路径:drivers/base/platform.c

extern struct resource *platform_get_resource(struct platform_device *, unsigned int, unsigned int);
struct resource *platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num)
{
        int i;

        for (i = 0; i < dev->num_resources; i++) {
                struct resource *r = &dev->resource[i];

                if (type == resource_type(r) && num-- == 0)
                        return r;
        }
        return NULL;
}
EXPORT_SYMBOL_GPL(platform_get_resource);
//参数
//dev:就是probe函数传入的struct platform_devic *变量这个形参
//type:资源的类型,如IORESOURCE_MEM等
//num:资源的位置,处于同类资源的第几个,序号从0开始
//返回值
//struct resource的地址,需要一个struct resource *指针来指向它

2、注册杂项/字符设备,完善file_operation结构体,并生成设备节点

3、在注册或者ioremap使用之前要登记(不登记也没有关系,这部分是为了防止资源被同时使用)

登记的目的是告诉内核自己要使用这部分资源,这样当其他驱动或者程序申请使用这部分资源的时候就会失败

同理如果有其他驱动或者程序正在使用这部分资源的时候,这里登记就会失败

文件位置路径:include/linux/ioport.h

#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)
extern struct resource * __request_region(struct resource *,
                                        resource_size_t start,
                                        resource_size_t n,
                                        const char *name, int flags);

//参数
//start:起始地址
//n:长度
//name:名字
//返回值
//struct resource的地址,需要一个struct resource *指针来指向它

4、释放登记函数

#define release_mem_region(start,n)     __release_region(&iomem_resource, (start), (n))
extern void __release_region(struct resource *, resource_size_t,
                                resource_size_t);
//参数
//start:起始地址
//n:长度