linux下的 pci 驅動程式設計模型

2021-08-21 07:32:49 字數 1470 閱讀 2907

一、概述

我這裡pci 裝置是powerpc2020 和fpga 通過pci 匯流排進行相連通訊。

二、驅動模型:

#include

#include

#include

#include

#include

#include

#include

#define send_buf_size (8192)

#define recv_buf_size (131072)

#define module_name "interrupt"

/* 指明該驅動程式適用於哪一些pci裝置 */

static const struct pci_device_id pcidevtbl = ,

{},};

static struct file_operations fops = ;

//分配初始化混雜裝置物件

static struct miscdevice misc =

static irqreturn_t interrupt(int irq, void *dev_id)

;static int __init pci_init(void)

if (!pci_register_driver(&demo_pci_driver))

return 0;

}static void __exit pci_exit(void)

module_init(pci_init);

module_exit(pci_exit);

module_license("gpl");

三、**分析:

1、簡單的混雜裝置驅動模型不必贅述。

2、主要分析static struct pci_driver demo_pci_driver;結構體。

這個結構體中定義了pci 從裝置的deviceid device name 等等一些資訊,這些資訊很重要,如果填錯在pci 註冊的的時候會報錯,當然也不會進入對應的probe 函式中去。

3、進入pci 註冊成功後的probe 中後會有一些模型化的步驟。具體我們如下分析。

四、pci probe 分析

int demo_probe(struct pci_dev *pdev, const struct pci_device_id *id) /* new device inserted */

err = pci_set_dma_mask(pdev, dma_bit_mask(32));

if (err)

err = pci_set_consistent_dma_mask(pdev, dma_bit_mask(32));

if (err) else else

send_buf = pci_alloc_consistent(pdev, send_buf_size, &send_buf_hw);

if (send_buf == null) else

Linux下的PCI驅動程式設計

pci裝置上有三種位址空間 pci的i o空間 pci的儲存空間和pci的配置空間。cpu可以訪問pci裝置上的所有位址空間,其中i o空間和儲存空間提供給裝置驅動程式使用,而配置空間則由linux核心中的pci初始化 使用。核心在啟動時負責對所有pci裝置進行初始化,配置好所有的pci裝置,包括中...

實時Linux下的PCI驅動開發(下)

進入驅動的hpi相關部分後,就要好好研究pci2040的datasheet了。說實話,乙個驅動程式的大部分內容,就是把datasheet裡的內容翻譯成 所以每乙個驅動工程師都應該深入的閱讀硬體文件。首先看pci2040的配置空間,如下所示 有兩個最重要的基位址,乙個是hpi csr記憶體基位址,可以...

Linux的PCI驅動分析

1.關鍵資料結構 pci裝置上有三種位址空間 pci的i o空間 pci的儲存空間和pci的配置空間。cpu可以訪問pci裝置上的所有位址空間,其中i o空間和儲存空間提供給裝置驅動程式使用,而配置空間則由linux核心中的pci初始化 使用。核心在啟動時負責對所有pci裝置進行初始化,配置好所有的...