目錄
裝置端資源定義
驅動端資源獲取
裝置端資料定義
驅動端資料獲取
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等的裝置而言,這不是問...