第十五节、平台总线模型——probe函数编写
本节用于介绍平台总线模型——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:长度