999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Linux上PCI—E驅(qū)動設(shè)計

2016-09-26 21:37:48林齊梅
卷宗 2016年7期

摘 要:當(dāng)前基于Linux內(nèi)核的操作系統(tǒng)應(yīng)用越來越廣泛,開發(fā)基于Linux的設(shè)備驅(qū)動程序,具有很強的實用性和可移植性。本文簡單介紹linux系統(tǒng)上PCI-E設(shè)備驅(qū)動的框架以及重要的數(shù)據(jù)結(jié)構(gòu)。

關(guān)鍵詞:Linux;PCI-E;PCI;驅(qū)動

Abstract:At present,the operating system based on Linux kernel is used more and more widely. It is very practical and portable to develop the device driver based on Linux. This article briefly introduces the framework and the important data structure of PCI-E device driver on Linux system .

Key word: Linux;PCI-E;PCI;Driver

PCI-Express 簡稱PCI-E,是一種完全不同于PCI、具有高速串行點對點雙通道高帶寬傳輸模式的全新總線規(guī)范,所連接的設(shè)備分配獨享通道帶寬,不共享總線帶寬,支持端對端的可靠性傳輸。PCI-E在軟件層面上兼容的PCI技術(shù)和設(shè)備,支持PCI設(shè)備和內(nèi)存模組的初始化,也就是說驅(qū)動程序、操作系統(tǒng)完全兼容。

1 PCI設(shè)備與驅(qū)動關(guān)系

PCI設(shè)備通常由一組參數(shù)唯一地標(biāo)識,它們被vendorID,deviceID和class nodes所標(biāo)識,即設(shè)備廠商,型號等,這些參數(shù)保存在 pci_device_id結(jié)構(gòu)中。每個PCI設(shè)備都會被分配一個pci_dev變量。所有的PCI驅(qū)動程序都必須定義一個pci_driver結(jié)構(gòu)變量,在該變量中包含了這個PCI驅(qū)動程序所提供的不同功能的函數(shù),同時,在這個結(jié)構(gòu)中也包含了一個device_driver結(jié)構(gòu),這個結(jié)構(gòu)定義了PCI子系統(tǒng)與PCI設(shè)備之間的接口。在注冊PCI驅(qū)動程序時,這個結(jié)構(gòu)將被初始化,同時這個 pci_driver變量會被鏈接到pci_bus_type中的驅(qū)動鏈上去。在pci_driver中有一個成員struct pci_device_id *id_table,它列出了這個設(shè)備驅(qū)動程序所能夠處理的所有PCI設(shè)備的ID值。

2 基本框架

在用模塊方式實現(xiàn)PCI設(shè)備驅(qū)動程序時,通常至少要實現(xiàn)以下幾個部分:初始化設(shè)備模塊、設(shè)備打開模塊、數(shù)據(jù)讀寫和控制模塊、中斷處理模塊、設(shè)備釋放模塊、設(shè)備卸載模塊。下面給出一個典型的PCI設(shè)備驅(qū)動程序的基本框架,從中不難體會到這幾個關(guān)鍵模塊是如何組織起來的。

staticstruct pci_device_id example_pci_tbl [] __initdata ={

{PCI_VENDOR_ID_EXAMPLE,PCI_DEVICE_ID_EXAMPLE,PCI_ANY_ID,

PCI_ANY_ID,0,0, EXAMPLE},

{0,}};

struct example_pci {/* 對特定PCI設(shè)備進行描述的數(shù)據(jù)結(jié)構(gòu) */

unsigned int magic;

struct example_pci *next;/* 使用鏈表保存所有同類的PCI設(shè)備 */

/* ... */}

staticvoid example_interrupt(int irq,void*dev_id,struct pt_regs *regs){/* 中斷處理模塊 */

/* ... */}

staticstruct file_operations example_fops ={ /* 設(shè)備文件操作接口 */

owner: THIS_MODULE,/* demo_fops所屬的設(shè)備模塊 */

read: example_read,/* 讀設(shè)備操作*/

write: example_write,/* 寫設(shè)備操作*/

ioctl: example_ioctl,/* 控制設(shè)備操作*/

open: example_open,/* 打開設(shè)備操作*/

elease: example_release /* 釋放設(shè)備操作*/

/* ... */};

staticstruct pci_driver example_pci_driver ={/ * 設(shè)備模塊信息 */

name: example_MODULE_NAME,/* 設(shè)備模塊名稱 */

id_table: example_pci_tbl,/* 能夠驅(qū)動的設(shè)備列表 */

probe: example_probe,/* 查找并初始化設(shè)備 */

remove: example_remove /* 卸載設(shè)備模塊 */

/* ... */};

staticint __init example_init_module (void){

/* ... */}

staticvoid __exit example_cleanup_module (void){

pci_unregister_driver(&demo_pci_driver);

}

module_init( example_init_module);/* 加載驅(qū)動程序模塊入口 */

module_exit( example_cleanup_module);/* 卸載驅(qū)動程序模塊入口 */

3 主要數(shù)據(jù)結(jié)構(gòu)

上面這段代碼給出了一個典型的PCI設(shè)備驅(qū)動程序的框架,是一種相對固定的模式。主要用了幾個重要的數(shù)據(jù)結(jié)構(gòu)。

struct pci_device_id {

__u32 vendor, device;/* Vendor and device ID or PCI_ANY_ID*/

__u32 subvendor, subdevice;/* Subsystem ID's or PCI_ANY_ID */

__u32 class, class_mask;/* (class,subclass,prog-if) triplet */

kernel_ulong_t driver_data;/* Data private to the driver */

};

vendorID:標(biāo)識硬件制造商,是一個16位的寄存器。

deviceID:設(shè)備ID,由制造商選擇,也是一個16位的寄存器。

class:每個外部設(shè)備屬于某個類(class),也是一個16位的寄存器。

struct pci_driver {

struct list_head node;

char*name;

conststruct pci_device_id *id_table;/* must be non-NULL for probe to be called */

int(*probe)(struct pci_dev *dev,conststruct pci_device_id *id);/* New device inserted */

void(*remove)(struct pci_dev *dev);/* Device removed */

/* ... */};

struct pci_driver它的作用并不僅僅是識別設(shè)備的id_table結(jié)構(gòu),還包括了檢測設(shè)備的函數(shù)probe()和卸載設(shè)備的函數(shù)remove(),

struct pci_dev {

struct list_head bus_list;/* node in per-bus list */

struct pci_bus *bus;/* bus this device is on */

struct pci_bus *subordinate;/* bus this device bridges to */

void*sysdata;/* hook for sys-specific extension */

struct proc_dir_entry *procent;/* device entry in /proc/bus/pci */

struct pci_slot *slot;/* Physical slot this device is in */

unsignedint devfn;/* encoded device & function index */

unsignedshort vendor;

unsignedshort device;

/* ... */};

它詳細(xì)描述了一個PCI設(shè)備幾乎所有的硬件信息,包括廠商ID、設(shè)備ID、各種資源等。

4 結(jié)束語

Linux PCI設(shè)備驅(qū)動實際包括Linux PCI設(shè)備驅(qū)動和具體設(shè)備本身驅(qū)動兩部分,Linux PCI驅(qū)動是內(nèi)核自帶的,而我們需要完成的就是設(shè)備本身的驅(qū)動,比如本人做的超聲數(shù)據(jù)采集卡的驅(qū)動。

參考文獻

[1]:(美)博韋深入理解Linux內(nèi)核[M],中國電力出版社,第三版。

[2]:(美)科波,LINUX設(shè)備驅(qū)動程序(第3版)[M],中國電力出版社,第三版。

作者簡介

林齊梅(1984-),男,廣東汕頭人,學(xué)士學(xué)位,研究方向:超聲探傷儀設(shè)備研發(fā)。

主站蜘蛛池模板: 国产v精品成人免费视频71pao| 中文字幕亚洲电影| 精品国产一区二区三区在线观看 | 毛片基地视频| 国产高清在线观看| 四虎综合网| 99一级毛片| 午夜天堂视频| 亚洲日韩欧美在线观看| 国产美女无遮挡免费视频| 一级毛片高清| 欧洲av毛片| 视频国产精品丝袜第一页| 亚洲无码A视频在线| 谁有在线观看日韩亚洲最新视频| 激情爆乳一区二区| 精品一区国产精品| 国产传媒一区二区三区四区五区| 亚洲欧洲日本在线| 2048国产精品原创综合在线| 免费无码又爽又黄又刺激网站| 91在线国内在线播放老师| 午夜精品福利影院| 午夜日b视频| v天堂中文在线| 伊人久久大线影院首页| 国产精品页| 亚洲色无码专线精品观看| 欧亚日韩Av| 亚洲91在线精品| 午夜福利视频一区| 中文字幕中文字字幕码一二区| 亚洲成肉网| 久久婷婷六月| 国产亚洲男人的天堂在线观看| 日本免费福利视频| 久久国产精品嫖妓| 一级毛片无毒不卡直接观看| 久久久久夜色精品波多野结衣| 国产欧美网站| 福利国产在线| 青青青国产视频手机| 日本欧美一二三区色视频| 国产一区亚洲一区| a毛片免费观看| 91成人在线观看| 激情无码视频在线看| 亚洲视频免| 波多野结衣视频网站| 国产黄网永久免费| 在线欧美一区| 欧美啪啪一区| 欧美一级在线看| av尤物免费在线观看| 午夜国产大片免费观看| 国产伦精品一区二区三区视频优播 | 一区二区三区四区精品视频| 国产午夜一级毛片| 欧美人人干| 99青青青精品视频在线| 免费又黄又爽又猛大片午夜| 又爽又黄又无遮挡网站| 亚洲,国产,日韩,综合一区| 一本大道视频精品人妻| 怡红院美国分院一区二区| 再看日本中文字幕在线观看| 精品少妇人妻av无码久久| 在线观看热码亚洲av每日更新| 国产主播一区二区三区| 996免费视频国产在线播放| av一区二区无码在线| 国产成人久视频免费| 一级看片免费视频| 亚洲AV永久无码精品古装片| 久久国产乱子伦视频无卡顿| 亚洲欧美不卡视频| 99热这里只有精品在线播放| 99热这里只有精品国产99| 强奷白丝美女在线观看| 亚洲国产午夜精华无码福利| 日韩精品成人在线| 蝌蚪国产精品视频第一页|