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)詳解補充

同類資源進行重新編號後的下標編號,和設備層中的資源數組不相同。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章