色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > Linux平臺下pci總線驅動

Linux平臺下pci總線驅動 時間:2018-08-16      來源:未知

Pci總線介紹

PCI總線是一種高性能局部總線,是為了滿足外設間以及外設與主機間高速數據傳輸而提出來的。

PCI總線系統要求有一個PCI控制卡,它必須安裝在一個PCI插槽內。根據實現方式不同,PCI控制器可以與CPU一次交換32位或64位數據,它允許智能PCI輔助適配器利用一種總線主控技術與CPU并行地執行任務。PCI允許多路復用技術,即允許一個以上的電子信號同時存在于總線之上。

每個PCI設備有許多地址配置的寄存器,初始化時要通過這些寄存器來配置該設備的總線地址,一旦完成配置以后,CPU就可以訪問該設備的各項資源了。PCI標準規定每個設備的配置寄存器組多可以有256個連續的字節空間,開頭64個字節叫頭部,分為0型(PCI設備)和1型(PCI橋)頭部,頭部開頭16個字節是設備的類型、型號和廠商等。

PCI總線架構

所有的根總線都鏈接在pci_root_buses鏈表中。Pci_bus ->device鏈表鏈接著該總線下的所有設備。而pci_bus->children鏈表鏈接著它的下層總線,對于pci_dev來說,pci_dev->bus指向它所屬的pci_bus. Pci_dev->bus_list鏈接在它所屬bus的device鏈表上。此外,所有pci設備都鏈接在pci_device鏈表中。

Linux下PCI驅動的代碼模型

一個通過PCI總線與系統連接的設備的驅動主要包括兩部分:第一PCI總線驅動,第二,設備本身的驅動,包括字符設備,網絡設備,tty設備,音頻設備等。PCI驅動的核心是pci_driver,在探測函數中完成資源的申請,并注冊相應的字符設備,網絡設備,tty設備,音頻設備等。以下代碼以三星平臺s3c24XX為例,

static struct pci_device_id buttons_pci_tbl[] __initdata={

{PCI_ANY_ID,PCI_ANY_ID,PCI_ANY_ID,PCI_ANY_ID,0,0,0},

{0,}

}; //PCI設備支持項

static irqreturn_t buttons_interrupt(int irq, void *dev_id)

{

//中斷處理程序

}

static int s3c24xx_buttons_open(struct inode *inode, struct file *file)

{

}

static int s3c24xx_buttons_close(struct inode *inode, struct file *file)

{

}

static int s3c24xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)

{

}

static struct file_operations dev_fops = {

.owner = THIS_MODULE,

.open = s3c24xx_buttons_open,

.release = s3c24xx_buttons_close,

.read = s3c24xx_buttons_read,

};

static struct miscdevice misc = {

.minor = MISC_DYNAMIC_MINOR,

.name = DEVICE_NAME,

.fops = &dev_fops,

};

static int pci_key__probe (struct pci_dev *pdev, const struct pci_device_id *ent)

{

int ret;

pci_enable_device(pdev); //使能PCI設備

pci_set_master(pdev);

ret = misc_register(&misc); //注冊雜項設備

printk (DEVICE_NAME"\tinitialized\n");

return ret;

}

static int pci_key__remove (struct pci_dev *pdev, const struct pci_device_id *ent)

{

pci_disable_device(pdev);

misc_deregister(&misc);

return 0;

}

static struct pci_driver pci_key_driver = {

.name = "pci_key",

.id_table =buttons_pci_tbl,

.probe = pci_key__probe,

.remove = pci_key__remove,

};

static int __init dev_init(void)

{

return pci_register_driver(&pci_key_driver);

}

static void __exit dev_exit(void)

{

pci_unregister_driver(&pci_key_driver);

}

module_init(dev_init);

module_exit(dev_exit);

PCI I/O和PCI內存地址

這兩個地址空間用來實現PCI設備和Linux核心中設備驅動程序之間的通訊。例如DEC21141快速以太網設備的內部寄存器被映射到PIC I/O空間上時,其對應的Linux設備驅動可以通過對這些寄存器的讀寫來控制此設備。PCI視頻卡通常使用大量的PCI內存空間來存儲視頻信息。

在PCI系統建立并通過用PCI配置頭中的命令域來打開這些地址空間前,系統決不允許對它們進行存取。值得注意的是只有PCI配置代碼讀取和寫入PCI配置空間,Linux設備驅動只讀寫PCI I/O和PCI內存地址。 那是因為當系統初始化階段完成后,每個PCI設備的地址空間都已經應設在PCI總線上了,驅動程序直接通過總線地址就可以訪問PCI設備,當然也可以去讀寫配置空間,但這沒有必要。

以上只是PCI部分的簡介,可以參考《linux內核情景分析》PCI驅動一章,講得非常詳細。

上一篇:exynos4412內存分析

下一篇:二叉樹基本概念講解及創建

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区
主站蜘蛛池模板: 97在线免费观看| 清纯唯美日韩制服另类| 欧美性高潮床叫视频| 国产一区二区视频在线观看| 日韩性xxxx爱| 国产精品扒开腿做爽爽爽男男| 久久黄色av网站| 亚洲精品日韩欧美| 日韩美女毛茸茸| 色综合久久久久久中文网| 精品网站999www| 中文字幕亚洲欧美日韩高清| 亚洲a中文字幕| 国产mv免费观看入口亚洲| 国产精品三级美女白浆呻吟 | 国产精品69av| 精品久久久久久久久中文字幕| 亚洲欧美一区二区三区久久 | 日韩欧美中文免费| 97超级碰碰碰久久久| 欧美日韩国产二区| 97人人模人人爽人人喊中文字 | 国产精品视频最多的网站| 日韩欧美在线国产| 全色精品综合影院| 日韩av中文字幕在线免费观看 | 欧美日韩亚洲视频| 欧美日韩xxxxx| 国产成人精品日本亚洲| 亚洲黄色av网站| 亚洲精品国产精品自产a区红杏吧 亚洲精品国产精品乱码不99按摩 亚洲精品国产精品久久清纯直播 亚洲精品国产精品国自产在线 | 亚洲精品一区在线观看香蕉| 国产精品久久久久久一区二区| 亚洲最大的av网站| 91久久精品久久国产性色也91| 国产免费一区二区三区在线观看| 精品视频—区二区三区免费| 欧美日韩精品二区| 成人信息集中地欧美| 国产在线视频一区| 自拍亚洲一区欧美另类|