91精品人妻系列动画无码 - 国产精品夜间视频香蕉 - 91丝袜人妻一区二区三区 - 久久伊伊香蕉精品网站

信盈達—您身邊的嵌入式&人工智能專家
全國免費咨詢熱線:400-8788-909

嵌入式培訓:Linux平臺下Pci總線驅動詳解

時間:2018-08-22 00:00:00 來源:信盈達 作者:信盈達

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

?

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

?

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

?

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總線與系統(tǒng)連接的設備的驅動主要包括兩部分:第一PCI總線驅動,第二,設備本身的驅動,包括字符設備,網絡設備,tty設備,音頻設備等。PCI驅動的核心是pci_driver,在探測函數(shù)中完成資源的申請,并注冊相應的字符設備,網絡設備,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內存地址

?

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

?

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




信盈達2008年在深圳特區(qū)南山高新科技園成立。自成立至今近九年來專注為企業(yè)和個人提供高端方案設計、高端嵌入式/Android培訓等服務。公司下設信盈達實訓學院、信盈達研發(fā)中心、信盈達教學儀器三大業(yè)務板塊。九年來公司堅持"技術領先、服務領先",以雄厚的實力和專業(yè)的品質成為國內唯一有實力從產品最底層研發(fā)到系統(tǒng)層開發(fā)的嵌入式實訓、產品解決方案提供商。為中國IT行業(yè)提供最具價值的職業(yè)教育服務。專業(yè)嵌入式、物聯(lián)網、人工智能、Java、單片機等課程,想了解更多信息點擊立馬咨詢?