platform裝置資源與資料

2021-09-27 02:44:32 字數 3300 閱讀 4606

目錄

裝置端資源定義

驅動端資源獲取

裝置端資料定義

驅動端資料獲取

struct resource ;
結構體重主要的引數為三個,start、end、flags

start:資源的起始值

end:資源的終止值

flags:資源型別

flags

資源型別

start

endioresource_io

io位址空間

io起始位址

io終止位址

ioresource_mem

記憶體記憶體起始位址

記憶體終止位址

ioresource_irq

中斷起始中斷號

終止中斷號

ioresource_dma

dma記憶體

記憶體起始位址

記憶體終止位址

ioresource_bus

匯流排

#define pin_base        32

#define chipselect_2 0x30000000

#define pin_pc11 (pin_base + 0x40 + 11)

#define gpio_pf9 9

#define ch_spi 5

#define data_flag 5

static struct resource globalmem_resoure = ,

[1] = ,

[2] = ,

[3] = ,

};struct plat_platform ;

#define port(base, int) \

static struct plat_platform platform_data = ,

};static struct platform_device platform_uart_device2 =

};#define pa_iic1 0xec20f000

#define irq_iic1 ((5) + 32)

static struct resource i2c_resource = ,

[1] = ,

};struct platform_device device_i2c1 = ;

#define pa_usbdev (0x15200140)

#define sz_usbdev sz_1m

#define irq_usbd 18

static struct resource usbgadget_resource = ,

[1] =

};struct platform_device device_usbgadget = ;

struct platform_device *globaofifo_device[3] = ;

export_symbol(globaofifo_device);

其中globalmem_resoure中定義了三種資源:ioresource_irq、ioresource_mem、ioresource_io

ioresource_irq:中斷號是32 + 0x40 + 11

這個是裝置端定義的資源,那麼我們如何在驅動端獲取到這些資料呢

struct resource *res_mem[2];

struct resource *res_irq;

struct resource *res_io;

res_mem[0] = platform_get_resource(pdev, ioresource_mem, 0);

if(!res_mem[0]) else

res_mem[1] = platform_get_resource(pdev, ioresource_mem, 1);

if(!res_mem[1]) else

res_irq = platform_get_resource(pdev, ioresource_irq, 0);

if(!res_irq) else

res_io = platform_get_resource(pdev, ioresource_io, 0);

if(!res_io) else

驅動端使用函式platform_get_resource來獲取資源,函式的原型如下所示:

struct resource *platform_get_resource(struct platform_device *dev,

unsigned int type, unsigned int num)

第乙個變數為platform的裝置結構體,第二個變數為資源型別,第三個變數為資源對用的編號,比如說,想要獲取mem的第乙個資源,函式platform_get_resource的最後乙個引數為0,想要獲取mem的第二個資源,函式platform_get_resource的最後乙個引數為1.

res_mem[0] = platform_get_resource(pdev, ioresource_mem, 0);

res_mem[1] = platform_get_resource(pdev, ioresource_mem, 1);

在裝置端我們除了可以定義資源以外,還可以附加一些自定義資料,作為裝置的私有資料,資料的型別我們可以自行定義

上述模組中,我們定義了自定義資料為:

struct plat_platform ;

#define port(base, int) \

static struct plat_platform platform_data = ,

};

資料段使用函式dev_get_platdata來獲取私有資料,函式原型為

static inline void *dev_get_platdata(const struct device *dev)
函式,引數為&pdev->dev,pdev為platform_device的指標

驅動端示例**如下所示

static struct plat_platform ;    

struct plat_platform *platform_data;

platform_data = dev_get_platdata(&pdev->dev);

if(!platform_data) else

platform裝置驅動

platform bus是一種虛擬匯流排,作用就是將裝置資訊和驅動程式進行分離,platform bus會維護兩條線,一條是裝置,一條是驅動。當乙個裝置被註冊到匯流排上面的時候,匯流排會去搜尋對應的驅動,反之如果驅動被註冊到匯流排,匯流排也會去找對應的驅動。描述裝置資訊的方式有2種,一種是通過手動填...

platform裝置驅動框架

這裡簡單總結下platform匯流排的裝置驅動 的框架。1 建立資料夾platform 2 在資料夾下編寫裝置檔案device.c include include include include include include module author wjb module license dua...

3 0 35 platform 匯流排 裝置與驅動

在該核心的裝置驅動模型中,關心匯流排 裝置和驅動這三個實體。在系統每註冊乙個裝置的時候,由匯流排尋找與之匹配的驅動 在系統每註冊乙個驅動的時候,會由匯流排尋找與之匹配的裝置。乙個現實的linux裝置和驅動通常都需要掛載在一種匯流排上,對於本身依附於pci,usb,i2c,spi等的裝置而言,這不是問...