Table of Contents
1、设备层注册、注销函数
1.1、platform_device_register
1.2、platform_device_unregister
1.3、platform_add_devices
2、驱动层注册注销函数
2.1、platform_driver_register
2.2、platform_driver_ unregister
3、获取资源函数
3.1、platform_get_resource
3.2、platform_get_irq
3.3、platform_get_resource_byname
3.4、platform_get_irq_byname
4、申请内存资源函数
4.1、request_region
4.2、request_mem_region
4.3、devm_request_region
4.4、devm_request_mem_region
5、释放内存资源
5.1、release_region
5.2、release_ mem_region
5.3、devm_release_region
5.4、devm_release_mem_region
6、最后参数(num)详解补充
原型: int platform_device_register(struct platform_device *pdev)
功能:向内核注册一个平台设备
参数: pdev:要注册平台设备结构指针
返回值: 0:注册成功; 负数:注册失败
原型: void platform_device_unregister(struct platform_device *pdev)
功能:从内核中注销一个平台设备
参数: pdev:要注销平台设备结构指针
返回值: 无
原型:int platform_add_devices(struct platform_device **devs, int num)
功能:一次向内核注册 num 个平台设备
参数: devs 是要注册的平台设备数组
返回值: 0:注册成功; 负数:注册失败
int platform_driver_register(struct platform_driver *drv)
功能:向内核注册一个平台驱动。 如此时有匹配的平台设备则会引发内核执行平台驱动结构中的 probe 函数
参数: drv:要注册的平台驱动结构指针
返回值: 0:注册成功;负数:注册失败
void platform_driver_ unregister (struct platform_driver *drv)
功能: 从内核中注销一个平台设备驱动,如此时已匹配平台设备,则会引发内核执行平台驱动结构中的
remove 函数
参数: drv:要注册的平台驱动结构指针
原型:
struct resource *platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num)
功能:
通过探测函数中有设备指针获得设备结构中的指定类型的资源结构地址。 这个函数是在驱动层的探测函数使
用
参数: dev : 设备指针 ,实际就是探测函数参数
type: 资源类型
num:同类资源进行重新编号后的下标编号,和设备层中的资源数组不相同。(要注意这一点)
返回值:设备层资源结构数组中对应的资源结构首地址。 NULL:失败资源类型如下几种:
#define IORESOURCE_IO 0x00000100 //表示资源是 IO 口
#define IORESOURCE_MEM 0x00000200 //表示资源是一段物理内存
#define IORESOURCE_IRQ 0x00000400 //表示资源是中断编号
#define IORESOURCE_DMA 0x00000800 //表示资源是 DMA
#define IORESOURCE_BUS 0x00001000 //表示资源是总线编号
常用是 IORESOURCE_MEM 和 IORESOURCE_IRQ 两种。
原型: int platform_get_irq(struct platform_device *dev, unsigned int num)
功能: 通过设备指针获得设备结构中的指定编号的中断资源起始编号
参数:
dev :设备指针 ,实际就是探测函数参数
num:同类资源进行重新编号后的下标编号,和设备层中的资源数组不相同。(要注意这一点)
返回值: >0 :中断资源中的起始编号; -ENXIO:失败
原型:
struct resource *platform_get_resource_byname(struct platform_device *dev,
unsigned int type, const char *name)
功能:通过设备指针获得设备结构中的指定名字指定类型的资源结构内存地址
参数:
dev :设备指针 ,实际就是探测函数参数
name:资源名
返回值:设备层资源结构数组中对应的资源结构首地址。 NULL:失败
原型: int platform_get_irq_byname(struct platform_device *dev, const char *name)
功能:通过设备指针获得设备结构中的指定名字的中断资源起始编号
参数:
dev :设备指针 ,实际就是探测函数参数
name:中断资源名
返回值: >0 :中断资源中的起始编号; -ENXIO:失败
注意:使用platform_get_resource即可得到一个IO内存资源节点指针, 包括了地址的开始,结束地址等, 但这段资源只是一个描述, 想真正使用这段IO内存, 还要经过先申请, 再映射的过程。例如可使用devm_request_mem_region()申请出使用这段IO内存, 再使用ioremap() 将其映射出来, 供用户空间使用
原型:
#define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), 0)
功能:向内核申请一段 IO 端口(IORESOURCE_IO 类型的)(不常用)
参数:
start:起始地址
n: 连续大小
name:使用者名字,用于内核登记。
返回值:
非 NULL:申请成功的资源结构内存地址 struct resource *
NULL: 所申请的 IO 端口资源已经被别人占用了,申请失败。
原型:
#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)
功能:向内核申请一段 IO 内存(IORESOURCE_MEM类型的)
参数:
start:起始地址
n:连续大小
name:使用者名字,用于内核登记。
返回值:
非 NULL:申请成功的资源结构内存地址 struct resource *
NULL: 所申请的 IO 内存资源已经被别人占用了,申请失败。
这个宏在实际编程中使用非常多。
原型:
#define devm_request_region(dev,start,n,name) \
__devm_request_region(dev, &ioport_resource, (start), (n), (name))
功能:向内核申请一段 IO 端口(IORESOURCE_IO 类型的) ,功能上和 request_region 相同
参数:
dev:设备指针, struct device *
start:起始地址
n:连续大小
name:使用者名字,用于内核登记。
返回值:
非 NULL:申请成功的资源结构内存地址 struct resource *
NULL: 所申请的 IO 端口资源已经被别人占用了,申请失败。
原型:
#define devm_request_mem_region(dev,start,n,name) \
__devm_request_region(dev, &iomem_resource, (start), (n), (name))
功能:向内核申请一段 IO 内存(IORESOURCE_MEM 类型的)(常用来申请IO寄存器)
参数:
dev:设备指针, struct device *
start:起始地址
n:连续大小
name:使用者名字,用于内核登记。
返回值:
非 NULL:申请成功的资源结构内存地址 struct resource *
NULL: 所申请的 IO 内存资源已经被别人占用了,申请失败。
这个宏在实际编程中使用非常多。
原型:
#define release_region(start,n) __release_region(&ioport_resource, (start), (n))
功能:释放一段使用 request_region 申请的 Io 端口空间。
参数:start:起始地址
n:连续大小
#define release_mem_region(start,n) __release_region(&iomem_resource, (start), (n))
功能:释放一段使用 request_mem_region 申请的 Io 内存空间。
参数:
start:起始地址
n:连续大小
__devm_release_region(dev, &ioport_resource, (start), (n))
这个宏和前面 release_region 相同,只是多了一个 dev 设备指针参数,类型为 struct device *
#define devm_release_mem_region(dev, start, n) \
__devm_release_region(dev, &iomem_resource, (start), (n))
这个宏和前面 release_mem_region 相同,只是多了一个 dev 设备指针参数,类型为 struct device *
同类资源进行重新编号后的下标编号,和设备层中的资源数组不相同。