linux PCI设备驱动
-
1.PCI 簡介
- 1.1 PCI 引腳
為處理數(shù)據(jù)、尋址、接口控制、仲裁以及系統(tǒng)功能,PC接口作為目標設(shè)備的設(shè)備至少有47條引腳。作為總線主設(shè)備的設(shè)備至少有49條引腳。必要的引腳在左邊,任選的引腳在右邊
- 1.2 傳輸速率
Transparent upgrade from 32-bit data path at 33 MHz
(132 MB/s peak) to 64-bit data path at 33 MHz
(264 MB/s peak) and from 32-bit data path at 66 MHz
(264 MB/s peak) to 64-bit data path at 66 MHz
(528 MB/s peak).- 1.3 PCI 的配置空間
所有的PCI都設(shè)備必須實現(xiàn)PCI協(xié)議規(guī)定必需的配置寄存器,以便系統(tǒng)上電時利用這些寄存器的信息來進行系統(tǒng)配置。
配置空間頭區(qū)域及功能:
- 1.1 PCI 引腳
- 設(shè)備識別
- 設(shè)備控制
- 設(shè)備狀態(tài)
- 基址寄存器。系統(tǒng)初始化代碼在引導(dǎo)操作系統(tǒng)之前,必須建立一個統(tǒng)一的地址映射關(guān)系,以確定系統(tǒng)中有多少存儲器和IO控制器,它們需要占用多少地址空間,當確定這些信息后,系統(tǒng)初始化代碼便可以吧IO控制器映射到合理的地址空間并引導(dǎo)系統(tǒng)。為了做到這種映射與相應(yīng)設(shè)備無關(guān),在配置空間頭區(qū)域中安排了一組供映射時使用的基址寄存器。
基地址設(shè)置過程:
查看pci 配置寄存器內(nèi)容:# hexdump /sys/bus/pci/devices/xxx/xxx/config 0000000 8086 2e30 0006 2090 0003 0600 0000 0000 0000010 0000 0000 0000 0000 0000 0000 0000 0000 0000020 0000 0000 0000 0000 0000 0000 1458 5000 0000030 0000 0000 00e0 0000 0000 0000 0000 0000 0000040 9001 fed1 0000 0000 4001 fed1 0000 0000 0000050 0000 0350 0009 0000 0000 0000 0000 0000 0000060 0005 e000 0000 0000 8001 fed1 0000 0000 0000070 0000 0000 0000 0000 0001 0000 0000 0000 0000080 0000 0000 0000 0000 0000 0000 0000 0000 0000090 1110 0011 0000 0000 03ff 0000 0a00 0079 00000a0 0020 0800 0000 7e00 0000 7de0 0000 7dd0 00000b0 8000 0000 0000 0000 0000 0000 0000 0000 00000c0 0000 0000 0000 0000 0000 0000 0000 0000 00000d0 0000 0000 0303 0000 6660 1366 aa55 aa55 00000e0 0009 610c 0b24 cfa7 9de2 812f 0000 0000 00000f0 0000 0000 0000 0000 0fa6 0005 0000 0000 0000100 0000 0000 0000 0000 0000 0000 0000 0000 * 0001000 -
2.PCI 驅(qū)動
- 2.1 注冊一個PCI設(shè)備驅(qū)動
為了被正確注冊到內(nèi)核, 所有的 PCI 驅(qū)動必須創(chuàng)建的主結(jié)構(gòu)是 struct pci_driver 結(jié)構(gòu).
這個結(jié)構(gòu)包含許多函數(shù)回調(diào)和變量, 來描述 PCI 驅(qū)動給 PCI 核心. 這里是這個結(jié)構(gòu)的一
個 PCI 驅(qū)動需要知道的成員:
總之, 為創(chuàng)建一個正確的 struct pci_driver 結(jié)構(gòu), 只有 4 個字段需要被初始化,一個PCI設(shè)備驅(qū)動的骨架如下:
static int probe(struct pci_dev *dev, const struct pci_device_id *id) {//... } static void remove(struct pci_dev *dev) {//... } static struct pci_driver pci_driver = { .name = "pci_skel", .id_table = ids, .probe = probe, .remove = remove, }; static int __init pci_skel_init(void) {return pci_register_driver(&pci_driver); } static void __exit pci_skel_exit(void) {pci_unregister_driver(&pci_driver); } module_init(pci_skel_init); module_exit(pci_skel_exit);- 2.2 probe 函數(shù)
pci_driver 的 probe()函數(shù)要完成 PCI 設(shè)備的初始化及其設(shè)備本身身份(字符、TTY、
網(wǎng)絡(luò)等)驅(qū)動的注冊。
- 2.3 常用的接口
- 2.1 注冊一個PCI設(shè)備驅(qū)動
-
3.小結(jié)
就跟USB、I2C、SPI、UART等常用接口一樣,PCI 也是一種通信接口,其最終的目的是實現(xiàn)數(shù)據(jù)交換,如果一個SPI接口的外設(shè)模塊要接在PCI接口上實現(xiàn)數(shù)據(jù)通信,那么中間需要加一個轉(zhuǎn)換芯片,如TIGER320.
PCI 設(shè)備的啟動分為兩個部分,第一部分是系統(tǒng)引導(dǎo)時,讀取配置寄存器信息(也就是常說的的配置空間)并確認好基址映射地址回寫到PCI設(shè)備的基址寄存器。第二部分是系統(tǒng)啟動后加載驅(qū)動,探測到該設(shè)備后,進行的初始化操作,如啟用PCI設(shè)備,申請IO空間,具體設(shè)備注冊,注冊中斷等。
參考資料:
1.《微機原理與接口技術(shù)》[劉立康]
2.《linux設(shè)備驅(qū)動程序》
總結(jié)
以上是生活随笔為你收集整理的linux PCI设备驱动的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全球人工智能技术大会即将开幕
- 下一篇: Linux集群管理软件clustersh