linux (platform_driver)平台设备驱动常用API函数

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)详解补充


 

 

1、设备层注册、注销函数

1.1、platform_device_register

原型: int platform_device_register(struct platform_device *pdev)
功能:向内核注册一个平台设备
参数: pdev:要注册平台设备结构指针
返回值: 0:注册成功; 负数:注册失败 

1.2、platform_device_unregister

原型: void platform_device_unregister(struct platform_device *pdev)
功能:从内核中注销一个平台设备
参数: pdev:要注销平台设备结构指针
返回值: 无

1.3、platform_add_devices

原型:int platform_add_devices(struct platform_device **devs, int num)
功能:一次向内核注册 num 个平台设备
参数: devs 是要注册的平台设备数组
返回值: 0:注册成功; 负数:注册失败

2、驱动层注册注销函数

2.1、platform_driver_register

int platform_driver_register(struct platform_driver *drv)
功能:向内核注册一个平台驱动。 如此时有匹配的平台设备则会引发内核执行平台驱动结构中的 probe 函数
参数: drv:要注册的平台驱动结构指针
返回值: 0:注册成功;负数:注册失败

 2.2、platform_driver_ unregister

void platform_driver_ unregister (struct platform_driver *drv)
功能: 从内核中注销一个平台设备驱动,如此时已匹配平台设备,则会引发内核执行平台驱动结构中的
remove 函数
参数: drv:要注册的平台驱动结构指针

3、获取资源函数

3.1、platform_get_resource

原型:
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 两种。

3.2、platform_get_irq

原型: int platform_get_irq(struct platform_device *dev, unsigned int num)
功能: 通过设备指针获得设备结构中的指定编号的中断资源起始编号
参数:
dev :设备指针 ,实际就是探测函数参数
num:同类资源进行重新编号后的下标编号,和设备层中的资源数组不相同。(要注意这一点)
返回值: >0 :中断资源中的起始编号; -ENXIO:失败

3.3、platform_get_resource_byname

原型:
struct resource *platform_get_resource_byname(struct platform_device *dev,
unsigned int type, const char *name)
功能:通过设备指针获得设备结构中的指定名字指定类型的资源结构内存地址
参数:
dev :设备指针 ,实际就是探测函数参数
name:资源名
返回值:设备层资源结构数组中对应的资源结构首地址。 NULL:失败

3.4、platform_get_irq_byname

原型: int platform_get_irq_byname(struct platform_device *dev, const char *name)
功能:通过设备指针获得设备结构中的指定名字的中断资源起始编号
参数:
dev :设备指针 ,实际就是探测函数参数
name:中断资源名
返回值: >0 :中断资源中的起始编号; -ENXIO:失败

4、申请内存资源函数

注意:使用platform_get_resource即可得到一个IO内存资源节点指针, 包括了地址的开始,结束地址等,  但这段资源只是一个描述, 想真正使用这段IO内存, 还要经过先申请, 再映射的过程。例如可使用devm_request_mem_region()申请出使用这段IO内存, 再使用ioremap() 将其映射出来, 供用户空间使用

4.1、request_region

原型:
#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 端口资源已经被别人占用了,申请失败。

4.2、request_mem_region

原型:
#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 内存资源已经被别人占用了,申请失败。
这个宏在实际编程中使用非常多。

 4.3、devm_request_region

原型:
#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 端口资源已经被别人占用了,申请失败。

 4.4、devm_request_mem_region

原型:
#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 内存资源已经被别人占用了,申请失败。
这个宏在实际编程中使用非常多。

5、释放内存资源

5.1、release_region

原型:
#define release_region(start,n) __release_region(&ioport_resource, (start), (n))
功能:释放一段使用 request_region 申请的 Io 端口空间。
参数:

start:起始地址
n:连续大小

5.2、release_ mem_region

#define release_mem_region(start,n) __release_region(&iomem_resource, (start), (n))
功能:释放一段使用 request_mem_region 申请的 Io 内存空间。
参数:
start:起始地址
n:连续大小

5.3、devm_release_region

__devm_release_region(dev, &ioport_resource, (start), (n))
这个宏和前面 release_region 相同,只是多了一个 dev 设备指针参数,类型为 struct device *

5.4、devm_release_mem_region

#define devm_release_mem_region(dev, start, n) \
__devm_release_region(dev, &iomem_resource, (start), (n))
这个宏和前面 release_mem_region 相同,只是多了一个 dev 设备指针参数,类型为 struct device *

6、最后参数(num)详解补充

同类资源进行重新编号后的下标编号,和设备层中的资源数组不相同。

 

 

  • 12
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux设备驱动是一种软件程序,用于控制硬件设备的操作。它允许操作系统与硬件设备进行通信,从而实现对设备的控制和管理。Linux设备驱动通常由内核模块或用户空间程序实现,可以通过编写C语言代码来实现。设备驱动程序需要遵循Linux内核的规范,包括使用标准的设备文件接口和实现正确的设备操作函数等。在Linux系统设备驱动程序是非常重要的组成部分,它们为各种硬件设备提供了支持,包括网络适配器、磁盘驱动器、USB设备等。 ### 回答2: Linux设备驱动是指是在Linux操作系统控制和管理硬件设备的软件模块,它使得操作系统能够与硬件设备进行通信和交互。在Linux系统,每个硬件设备都需要由相应的设备驱动程序来支持,这些设备驱动程序负责向操作系统提供设备的操作接口,并处理设备的输入和输出。 Linux设备驱动可以分为字符设备驱动和块设备驱动两种。字符设备驱动用于管理字符设备,例如键盘、鼠标等;块设备驱动用于管理块设备,例如硬盘、固态硬盘等。在驱动程序,通常会包含设备的初始化和配置、设备的打开和关闭、设备的读取和写入等功能。 为了方便设备驱动的开发和维护,Linux提供了一些设备驱动开发框架和接口,如字符设备驱动的主要接口为file_operations结构体,块设备驱动的主要接口为block_device_operations结构体。开发人员只需要实现这些接口,就可以将相应的设备驱动程序编译为内核模块,然后加载到Linux内核Linux设备驱动的编写需要熟悉硬件设备的工作原理和寄存器的操作,同时还需要了解Linux内核的相关知识。开发人员需要通过阅读设备规格书、硬件设计手册等,了解硬件设备的寄存器地址和寄存器位域的含义,然后编写适当的代码来读取和写入这些寄存器。此外,还需要熟悉Linux内核的设备模型、设备树等,以便正确地注册设备并与操作系统进行通信。 总之,Linux设备驱动是为了实现操作系统与硬件设备之间的通信和交互而编写的软件模块。通过适当配置和编写设备驱动程序,可以使得Linux操作系统能够正确地识别和管理各种硬件设备。 ### 回答3: Linux 设备驱动是指用于操作系统设备和外设的软件模块或程序。它负责对计算机和外围设备进行通信和控制,使它们能够正确地工作和与其他部分进行交互。 Linux 设备驱动由内核负责加载和管理,它提供了一种与硬件设备通信的接口,使应用程序能够通过系统调用与设备进行交互。设备驱动程序可以根据底层硬件设备的特定规格和功能进行开发,以确保设备可以和系统进行可靠而有效的通信。 Linux 设备驱动提供了一套标准接口和程序,使开发人员可以编写适用于不同硬件设备的通用驱动程序。这使得设备供应商和开发人员可以更轻松地将设备接入Linux系统,而不需要自行开发专门的驱动程序。此外,设备驱动程序可以提供一系列的API函数和工具,以便应用程序能够控制和访问设备的不同功能和特性。 Linux 设备驱动的开发需要一些特定的技能和知识,包括熟悉C语言编程、了解硬件设备的工作原理和接口规范、熟悉Linux内核和设备驱动开发的相关知识等。开发人员需要编写设备驱动程序的相关代码,并将其编译为内核模块,然后将模块加载到系统。 总而言之,Linux 设备驱动在操作系统起到了至关重要的作用,它使得Linux系统能够与各种硬件设备进行联通和交互,从而为应用程序提供了丰富的功能和特性。通过开源的特性,Linux 设备驱动的开发变得更加便捷和灵活,使得越来越多的硬件设备能够与Linux系统兼容,并为用户带来更好的使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值