![PCie驅(qū)動綜述_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/9/8d45c289-2189-47cd-8e49-ad9e0c5177ce/8d45c289-2189-47cd-8e49-ad9e0c5177ce1.gif)
![PCie驅(qū)動綜述_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/9/8d45c289-2189-47cd-8e49-ad9e0c5177ce/8d45c289-2189-47cd-8e49-ad9e0c5177ce2.gif)
![PCie驅(qū)動綜述_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/9/8d45c289-2189-47cd-8e49-ad9e0c5177ce/8d45c289-2189-47cd-8e49-ad9e0c5177ce3.gif)
![PCie驅(qū)動綜述_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/9/8d45c289-2189-47cd-8e49-ad9e0c5177ce/8d45c289-2189-47cd-8e49-ad9e0c5177ce4.gif)
![PCie驅(qū)動綜述_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/9/8d45c289-2189-47cd-8e49-ad9e0c5177ce/8d45c289-2189-47cd-8e49-ad9e0c5177ce5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 PCie 驅(qū)動Pcie設(shè)備上有三種地址空間:PCI的I/O空間、PCI的存儲空間和PCI的配置空間。Pce的配置空間:PCI有三個相互獨(dú)立的物理地址空間:設(shè)備存儲器地址空間、I/O地址空間和配置空間。配置空間是PCI所特有的一個物理空間。由于PCI支持設(shè)備即插即用,所以PCI設(shè)備不占用固定的內(nèi)存地址空間或I/O地址空間,而是由操作系統(tǒng)決定其映射的基址。系統(tǒng)加電時,BIOS檢測PCI總線,確定所有連接在PCI總線上的設(shè)備以及它們的配置要求,并進(jìn)行系統(tǒng)配置。所以,所有的PCI設(shè)備必須實(shí)現(xiàn)配置空間,從而能夠?qū)崿F(xiàn)參數(shù)的自動配置,實(shí)現(xiàn)真正的即插即用。PCI總線規(guī)范定義的配置空間總長度為256個字節(jié),配
2、置信息按一定的順序和大小依次存放。前64個字節(jié)的配置空間稱為配置頭,對于所有的設(shè)備都一樣,配置頭的主要功能是用來識別設(shè)備、定義主機(jī)訪問PCI卡的方式(I/O訪問或者存儲器訪問,還有中斷信息)。其余的192個字節(jié)稱為本地配置空間,主要定義卡上局部總線的特性、本地空間基地址及范圍等。·一般來說,基于pcie總線的驅(qū)動,需要涉及到pci_driver pci_dev pci_device_id .pci_device_id : 用于標(biāo)識pcie設(shè)備,通過上圖的廠商Id 設(shè)備Id 功能號等 唯一確定一個pcie設(shè)備,內(nèi)核通過這個結(jié)構(gòu)體確認(rèn)驅(qū)動與設(shè)備是否匹配。pci_dev : 一般pcie
3、設(shè)備都具有熱拔插功能,當(dāng)內(nèi)核檢測到有pcie設(shè)備插入時,會與相應(yīng)的Pci_driver : 當(dāng)有相應(yīng)的設(shè)備匹配會調(diào)用驅(qū)動的相關(guān)方法,驅(qū)動中通常要做的是讀出Base Adrress Register1-6 的值,這是pcies設(shè)備6個內(nèi)存空間的基地址,然后通過ioremap方法映射成虛擬地址,至于6個內(nèi)存空間的具體含義需要依賴于設(shè)備。在用模塊方式實(shí)現(xiàn)PCI設(shè)備驅(qū)動程序時,通常至少要實(shí)現(xiàn)以下幾個部分:初始化設(shè)備模塊、設(shè)備打開模塊、數(shù)據(jù)讀寫和控制模塊、中斷處理模塊、設(shè)備釋放模塊、設(shè)備卸載模塊。例如/* 指明該驅(qū)動程序適用于哪一些PCI設(shè)備 */static struct pci_device_id
4、demo_ids = PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82810_IG1) , PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82810_IG3) , PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82810E_IG) , PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82815_CGC) , PCI_DEVICE(PCI_VENDOR_ID_INTE
5、L, PCI_DEVICE_ID_INTEL_82845G_IG) , 0, ,;這個 pci_device_id 結(jié)構(gòu)需要被輸出到用戶空間, 來允許熱插拔和模塊加載系統(tǒng)知道什么模塊使用什么硬件設(shè)備. 宏 MODULE_DEVICE_TABLE 完成這個. 例如:MODULE_DEVICE_TABLE(pci, demo_ids);struct demo_card unsigned int magic; /* 使用鏈表保存所有同類的PCI設(shè)備 */ struct demo_card *
6、next; /* . */* 中斷處理模塊 */static void demo_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* . */* 設(shè)備文件操作接口 */static struct file_operations demo_fops = owner: THIS_MODULE, /* demo
7、_fops所屬的設(shè)備模塊 */ read: demo_read, /* 讀設(shè)備操作*/ write: demo_write, /* 寫設(shè)備操作*/ ioctl: demo_ioctl, /*
8、控制設(shè)備操作*/ mmap: demo_mmap, /* 內(nèi)存重映射操作*/ open: demo_open, /* 打開設(shè)備操作*/ release: demo_release /* 釋放設(shè)備操作*/&
9、#160; /* . */;/* 設(shè)備模塊信息 */static struct pci_driver demo_pci_driver = name: demo_MODULE_NAME, /* 設(shè)備模塊名稱 */ id_table: demo_idsl, /* 能夠驅(qū)動的設(shè)備列表 */ probe:
10、 demo_probe, /* 設(shè)備與驅(qū)動匹配時調(diào)用 remove: demo_remove /* 卸載設(shè)備模塊 */ /* . */; 3. 初始化設(shè)備模塊在Linux系統(tǒng)下,想要完成對一個PCI設(shè)備的初始化,需要完成以下工作:檢查PCI總線是否被Linux內(nèi)核支持;檢查設(shè)備是否插在總線插槽上,如果在的話則保存它所占用的插槽
11、的位置等信息。讀出配置頭中的信息提供給驅(qū)動程序使用。當(dāng)Linux內(nèi)核啟動并完成對所有PCI設(shè)備進(jìn)行掃描、登錄和分配資源等初始化操作的同時,會建立起系統(tǒng)中所有PCI設(shè)備的拓?fù)浣Y(jié)構(gòu),此后當(dāng)PCI驅(qū)動程序需要對設(shè)備進(jìn)行初始化時,一般都會調(diào)用如下的代碼:static int _init demo_init_module (void) /* 檢查系統(tǒng)是否支持PCI總線 */ if (!pci_present() return -ENODEV;
12、0; /* 注冊硬件驅(qū)動程序 */ if (!pci_register_driver(&demo_pci_driver) pci_unregister_driver(&demo_pci_driver); return -ENODEV;
13、 /* . */ return 0; 驅(qū)動程序首先調(diào)用函數(shù)pci_present( )檢查PCI總線是否已經(jīng)被Linux內(nèi)核支持,如果系統(tǒng)支持PCI總線結(jié)構(gòu),這個函數(shù)的返回值為0,如果驅(qū)動程序在調(diào)用這個函數(shù)時得到了一個非0的返回值,那么驅(qū)動程序就必須得中止自己的任務(wù)了。調(diào)用pci_register_driver( )函數(shù)來注冊PCI設(shè)備的驅(qū)動程序,此時需要提供一個pci_driver結(jié)構(gòu),在該結(jié)構(gòu)中給出的probe探測例程將負(fù)責(zé)完成對硬件的檢測工作。 static
14、int _init demo_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id) struct demo_card *card; /* 啟動PCI設(shè)備 */ if (pci_enable_device(pci_dev) return -EIO; /* 設(shè)備DMA標(biāo)識 */
15、60; if (pci_set_dma_mask(pci_dev, DEMO_DMA_MASK) return -ENODEV; /* 在內(nèi)核空間中動態(tài)申請內(nèi)存 */ if (card = kmalloc(sizeof(struct demo_card), GFP_KERNEL) = NULL) prin
16、tk(KERN_ERR "pci_demo: out of memoryn"); return -ENOMEM; memset(card, 0, sizeof(*card); /* 讀取PCI配置信息 */ card->iobase = pci_resource_start (pci_dev, 1); ca
17、rd->pci_dev = pci_dev; card->pci_id = pci_id->device; card->irq = pci_dev->irq; card->next = devs; card->magic = DEMO_CARD_MAGIC; /* 設(shè)置成總線主DMA模式 */ pci_s
18、et_master(pci_dev); /* 申請I/O資源 */ request_region(card->iobase, 64, card_namespci_id->driver_data); return 0; 4. 打開設(shè)備模塊在這個模塊里主要實(shí)現(xiàn)申請中斷、檢查讀寫模式以及申請對設(shè)備的控制權(quán)等。在申請控制權(quán)的時候,非阻塞方式遇忙返回,否則進(jìn)程主動接受調(diào)度,進(jìn)入睡眠狀態(tài),等待其它進(jìn)程釋放對設(shè)備的控制權(quán)。static int demo_open(str
19、uct inode *inode, struct file *file) /* 申請中斷,注冊中斷處理程序 */ request_irq(card->irq, &demo_interrupt, SA_SHIRQ, card_namespci_id->driver_data, card) /* 檢查讀寫模式 */ if(file->f_mode
20、 & FMODE_READ) /* . */ if(file->f_mode & FMODE_WRITE) /* . */ /* 申請對設(shè)備的控制權(quán) */ down(&card->op
21、en_sem); while(card->open_mode & file->f_mode) if (file->f_flags & O_NONBLOCK) /* NONBLOCK模式,返回-EBUSY */
22、60; up(&card->open_sem); return -EBUSY; else /* 等待調(diào)度,獲得控制權(quán) */
23、60; card->open_mode |= f_mode & (FMODE_READ | FMODE_WRITE); up(&card->open_sem); /* 設(shè)備打開計數(shù)增1 */
24、; MOD_INC_USE_COUNT; /* . */ 在對資源的訪問方式上,除了有I/O指令以外,還有對外設(shè)I/O內(nèi)存的訪問。對這些內(nèi)存的操作一方面可以通過把I/O內(nèi)存重新映射后作為普通內(nèi)存進(jìn)行操作,另一方面也可以通過總線主DMA(Bus Master DMA)的方式讓設(shè)備把數(shù)據(jù)通過DMA傳送到系統(tǒng)內(nèi)存中。 釋放設(shè)備模塊主要負(fù)責(zé)釋放對設(shè)備的控制權(quán),釋放占用的內(nèi)存和中斷等,所做的事情正好與打開設(shè)備模塊
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度企業(yè)品牌活動贊助合同
- 二零二五年度農(nóng)業(yè)用地經(jīng)營權(quán)轉(zhuǎn)讓合同
- 2025版工程招投標(biāo)擔(dān)保合同條款解讀3篇
- 《幼兒課程目標(biāo)確立》課件
- 二零二五版股權(quán)激勵計劃執(zhí)行合同
- 《RAAS臨床應(yīng)用》課件
- 《銷售管理心理學(xué)》課件
- 2025年度供應(yīng)鏈金融中介擔(dān)保合同協(xié)議書模板2篇
- 二零二五年度破碎機(jī)設(shè)備租賃與環(huán)保技術(shù)引進(jìn)合同3篇
- 薪酬與福利管理的創(chuàng)新趨勢
- 項目設(shè)計報告范文高中
- 《千年古村上甘棠》課件
- 部編版小學(xué)語文二年級下冊電子課文《小馬過河》
- 《醫(yī)療機(jī)構(gòu)工作人員廉潔從業(yè)九項準(zhǔn)則》專題解讀
- 愛車講堂 課件
- 成立商會的可行性報告5則范文
- 市場監(jiān)督管理局反電信網(wǎng)絡(luò)詐騙工作總結(jié)
- 2024-2030年中國免疫細(xì)胞存儲行業(yè)發(fā)展模式及投資戰(zhàn)略分析報告
- 家庭清潔課件教學(xué)課件
- 湖南財政經(jīng)濟(jì)學(xué)院《常微分方程》2023-2024學(xué)年第一學(xué)期期末試卷
- 2011年公務(wù)員國考《申論》真題卷及答案(地市級)
評論
0/150
提交評論