《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 嵌入式Linux下PCI設備驅動的設計與實現
嵌入式Linux下PCI設備驅動的設計與實現
來源:微型機與應用2011年第12期
袁愛平
(長沙民政職業技術學院 軟件學院, 湖南 長沙410004)
摘要: PCI局部總線具有使用方便、數據傳輸率高等特點,已成為計算機必備的一種接口。Linux是一種日趨成熟完善的操作系統,越來越多的軟硬件廠商開始使用Linux平臺開發自己的產品,因而對基于該平臺的設備驅動程序的需求也愈來愈多。介紹了Linux驅動程序開發的一般方法,并實現了流媒體數據緩存PCI卡在Linux環境下的驅動程序。
Abstract:
Key words :

摘   要: PCI局部總線具有使用方便、數據傳輸率高等特點,已成為計算機必備的一種接口。Linux是一種日趨成熟完善的操作系統,越來越多的軟硬件廠商開始使用Linux平臺開發自己的產品,因而對基于該平臺的設備驅動程序的需求也愈來愈多。介紹了Linux驅動程序開發的一般方法,并實現了流媒體數據緩存PCI卡在Linux環境下的驅動程序。
關鍵詞: Linux操作系統; PCI總線; 設備驅動; 流媒體數據緩存卡

    隨著通用處理器和嵌入式技術的迅猛發展,越來越多的電子設備需要由處理器控制。目前大多數CPU和外部設備都會提供PCI總線的接口,PCI總線已成為計算機系統中一種應用廣泛、通用的總線標準[1]。Linux因其開放源代碼以及穩定的性能,越來越受到廣大用戶青睞。同時,基于Linux內核的嵌入式操作系統應用勢頭強勁,開發基于Linux的設備驅動程序,具有很強的實用性和可移植性[2]。
1 PCI總線概述
    PCI(Peripheral Component Interconnect)總線,即外部設備互連,是現在流行的一種連接PC和外圍設備的總線結構[3]。PCI提供了一組完整的總線接口規范,可以在33 MHz時鐘頻率、32 bit數據總線寬度的條件下達到峰值132 Mb/s的傳輸速率;它能支持一種稱為線性突發的數據傳輸模式,可確保總線不斷滿載數據;采用總線主控與同步操作,顯著改善PCI的性能;PCI獨立于處理器的結構,用戶可隨意增添外圍設備,以擴展電腦系統而不必擔心在不同時鐘頻率下會導致性能下降。
2 PCI設備驅動程序的設計與實現
 Linux中將設備分成字符設備、塊設備和網絡設備三種類型,通過主設備號和從設備號實現對設備的描述。其中主設備號描述控制該設備的驅動程序,即驅動程序與主設備號一一對應,從設備號用來區分同一個驅動程序控制的不同設備[5]。
 PCI設備屬于字符設備。本設計采用模塊方式實現PCI卡驅動程序。驅動程序主要由設備注冊和注銷、設備探測和移除、設備中斷處理和系統調用等函數組成。
2.1 設備注冊和注銷
 使用一個設備之前,必須保證己經對它進行注冊,這項工作一般是在設備初始化時完成。設備初始化函數中調用函數register_chrdev()來注冊字符設備。流媒體數據緩存PCI卡驅動程序的注冊代碼如下:
 #define MAJOR_NUM 128
    register_chrdev(MAJOR_NUM,"pci_card",&pci_card_fops);
    將設備的主設備號設為128,設備名稱為pci_card。pci_card_fops是一個file_operations結構指針,這個結構是設備驅動程序所提供的入口點位置,在設備注冊時向系統進行登記,以便系統在適當時調用。pci_card_fops定義如下:
 static struct file_operations pci_card_fop={
          owner:THIS_MODULE,
          open:pic_card_open,
          release:pic_card_release,
          read:pic_card_read,
          write:pic_card_write,
          ioctl:pic_card_ioctl
 };
 當不再使用此設備時,需調用unregister_chrdev()函數注銷驅動程序。
2.2 設備探測和移除
 在掃描到新的PCI設備后,系統需要調用設備驅動程序實現的探測函數以查找與設備相匹配的PCI驅動。流媒體數據緩存PCI卡設備驅動的探測函數pic_card_probe()的主要實現代碼如下:
 pci_card = kmalloc(sizeof(struct pci_card),GFP_KERNEL);
                             //為設備實例分配存儲空間
 pci_enable_device(dev);                      //激活PCI設備
 spin_lock_init(pci_card ->lock);
                        //初始化特定設備實例的私有化數據
 pci_read_config_byte(dev,PCI_REVISION_ID,(u8*)&(pci_
 card ->rev_id));                  //讀取配置信息
 pci_card->mem_base=pci_resource_start(dev, 0);
                              //讀取I/O資源的配置信息
 pci_request_regions(dev,"pic_card");      //申請I/O區域
 pci_set_master(dev);                 //設置成總線主模式
 pic_card->mem_start=ioremap(pic_card->mem_base,
 pic_card->mem_size);              // I/O內存映射
 設備移除函數主要完成釋放映射的虛擬地址、釋放I/O區域、關閉PCI設備和釋放為設備實例分配的內核空間等功能。
2.3 中斷處理
 流媒體數據緩存卡驅動中的中斷處理程序主要負責識別中斷、響應中斷和喚醒睡眠的進程,中斷處理代碼如下:
 inl(pci_card->iobase+PCI_CARD_INT_STA); // 識別中斷
 outl(status&INT_MASK, pci_card->iobase + PCI_CARD_
INT_STA);                                         //響應中斷
 wake_up_interruptible(&pci_card->wq);   //喚醒睡眠進程
2.4 系統調用
 用戶進程利用系統調用對設備文件進行諸如read/write操作時,系統調用通過設備文件的主設備號找到相應的設備驅動程序,然后讀取這個數據結構相應的函數指針,接著把控制權交給該函數。流媒體數據緩存PCI卡的系統調用函數主要包括設備的打開、關閉、讀寫和控制等。
 在使用PCI設備之前,必須先打開所要使用的PCI設備。當用戶在應用程序中調用open()函數時,應用程序就會自動進入驅動程序中的pci_card_open()函數。pic_card_open()函數主要負責增加模塊的使用計數,并根據pic_card_probe()讀到的中斷號申請中斷,注冊中斷處理程序。具體實現如下:
 MOD_INC_USE_COUNT
 request_irq(pci_card->irq,pci_card_interrupt,SA_SHIRQ,"pci_card",pci_card));
 在使用完PCI設備后,必須關閉PCI設備。當用戶在應用程序中調用close()函數時,應用程序就會自動進入驅動程序中的pci_card_release()函數。pci_card_release()函數的主要工作是釋放中斷和減少模塊的使用計數。
 用戶在應用程序中調用read()函數和write()函數對設備文件進行讀寫操作時,應用程序就會自動進入驅動程序中的pci_card_read()函數和pci_card_write()函數。pci_card_read()函數首先會阻塞在以pci_card->wq為隊頭的等待隊列上。當流媒體數據緩存卡上的數據準備好,即pci_card->state變為READY時,pci_card_read()函數會被喚醒。函數被喚醒后,會先將數據從設備I/O內存拷貝到內核空間,再從內核空間拷貝給用戶進程,實現方式如下:
 wait_event_interruptible(pci_card->wq,pci_card->state==READY);
 memcpy_fromio(pbuf,pci_card->mem_start,count);
 copy_to_user(buf,pbuf,count));
 而pci_card_write()函數的主要工作是將數據從用戶進程拷貝到內核空間,再將內核空間中的數據拷貝到設備I/O內存,實現代碼如下:
 copy_from_user(pbuf,buf,count);
 memcpy_toio(pci_card->mem_start,pbuf,count);
 Linux是一種日趨成熟完善的操作系統,PCI總線已成為計算機系統中一種應用廣泛、通用的總線標準。本文針對流媒體數據緩存卡設備,結合PCI總線的特點,開發實現了流媒體數據緩存PCI卡在Linux環境下的設備驅動程序,本文介紹的驅動原理同樣適用其他PCI設備的開發。
參考文獻
[1] 陳穎,唐超. 基于PCI總線驅動程序設計方法研究[J].微計算機信息,2008,12(1):272-274.
[2] 李善平,劉文峰,王煥龍. Linux與嵌入式系統[M].北京:清華大學出版社,2003.
[3] 宋有泉,高小鵬,龍翔. 嵌入式PCI網卡驅動程序的設計與優化[J]. 計算機工程,2007,3(2):264-266.
[4] 王峰,張文軍,余松煜. PCI設備驅動程序中幾個關鍵問題的設計與實現[J]. 測控技術,2002,21(8):58-60.
[5] 錢晨,徐榮華,王欽若. 基于Linux操作系統的設備驅動程序開發[J]. 微計算機信息,2004,20(9):131-133.
 

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          欧美视频中文字幕| 久久免费视频这里只有精品| 在线视频国产日韩| 国内精品模特av私拍在线观看| 一区二区日韩欧美| 久久精品av麻豆的观看方式| 亚洲视频精品| 欧美性大战久久久久久久| 亚洲一区在线观看视频| 久久av一区| 亚洲国产综合在线看不卡| 99视频有精品| 国产毛片精品国产一区二区三区| 亚洲欧洲免费视频| 亚洲黄色av| 欧美私人网站| 美乳少妇欧美精品| 亚洲三级电影全部在线观看高清| 欧美一区午夜视频在线观看| 亚洲无线观看| 久久综合给合久久狠狠色| 日韩亚洲欧美在线观看| 亚洲欧美区自拍先锋| 国产欧美一区二区白浆黑人| 久久影视精品| 国产一区二区日韩精品欧美精品| 亚洲欧美中文字幕| 欧美午夜精品久久久久久孕妇| 9l国产精品久久久久麻豆| 午夜日韩激情| 麻豆成人在线播放| 欧美极品影院| 国产麻豆日韩| 亚洲国产婷婷香蕉久久久久久| 亚洲一级特黄| 欧美在线视频日韩| 国产一区在线观看视频| 亚洲在线一区二区| 午夜精品免费在线| 久久精品一二三| 欧美www视频在线观看| 一区二区福利| 樱桃成人精品视频在线播放| 欧美与欧洲交xxxx免费观看| 欧美自拍丝袜亚洲| 亚洲丰满在线| 欧美日韩一区在线播放| 亚欧成人精品| 国产精品一区三区| 欧美好吊妞视频| 亚洲精品在线二区| 欧美美女操人视频| 久久人人爽爽爽人久久久| 亚洲人成绝费网站色www| 国产精品久久久久77777| 国产精品欧美日韩久久| 在线日本高清免费不卡| 欧美国产亚洲精品久久久8v| 亚洲免费视频在线观看| 午夜久久一区| 狼人社综合社区| 国产精品白丝jk黑袜喷水| 欧美激情第9页| 久久激情视频久久| 欧美在线观看一区| 欧美~级网站不卡| 激情亚洲网站| 国产欧美一区二区三区视频| 欧美福利视频一区| 国产精品毛片a∨一区二区三区|国| 欧美sm视频| 国产一区二区精品久久91| 亚洲欧美激情视频在线观看一区二区三区| 欧美视频一区二区三区四区| 亚洲第一网站免费视频| 亚洲欧美日韩一区在线观看| 久久精品电影| 亚洲国产一区二区三区青草影视| 欧美极品在线视频| 国产精品啊v在线| 日韩亚洲综合在线| 国产精品theporn88| 亚洲剧情一区二区| 在线观看av不卡| 在线日韩欧美视频| 久久精品视频播放| 日韩亚洲欧美在线观看| 亚洲国产欧美一区| 亚洲欧美另类国产| 欧美日韩一区二区三区在线看| 久久免费高清| 欧美日韩国产小视频| 久久精品99国产精品酒店日本| 亚洲第一精品影视| 国产精品久久久久久久久果冻传媒| 欧美国产精品劲爆| 欧美视频一区在线| 欧美亚州一区二区三区| 国产欧美日韩专区发布| 国内成人精品一区| 国产精品久久久久免费a∨大胸| 激情久久中文字幕| 亚洲激情视频在线| 欧美日韩精品免费观看视频完整| 久久精品五月婷婷| 久久国产精品久久国产精品| 亚洲国产免费| 国产日韩精品久久久| 激情视频亚洲| 欧美亚洲综合在线| 亚洲乱码国产乱码精品精天堂| 亚洲福利视频免费观看| 久久蜜臀精品av| 欧美精品九九| 欧美日本精品| 久久久成人精品| 久久久久久尹人网香蕉| 亚洲中字黄色| 野花国产精品入口| 亚洲精品中文字幕在线观看| 99在线|亚洲一区二区| 欧美va天堂| 亚洲片区在线| 国产综合色精品一区二区三区| 亚洲午夜免费福利视频| 欧美高清不卡| 亚洲娇小video精品| 在线日韩日本国产亚洲| 欧美一区视频在线| 亚洲性感美女99在线| 欧美午夜一区| 欧美日韩中文字幕精品| 欧美日韩国产成人在线| 国产又爽又黄的激情精品视频| 另类亚洲自拍| 欧美日韩18| 亚洲欧美成人在线| 免费一级欧美片在线观看| 亚洲欧美日韩综合aⅴ视频| 国产麻豆9l精品三级站| 国产精品视频不卡| 亚洲在线中文字幕| 欧美裸体一区二区三区| 久久午夜av| 一区二区三区 在线观看视| 亚洲国产精品t66y| av成人免费在线观看| 蜜臀va亚洲va欧美va天堂| 国产精品高潮呻吟久久| 午夜精品在线观看| 亚洲欧美精品中文字幕在线| 亚洲一区视频在线| 久久久久久有精品国产| 这里只有视频精品| 牛牛国产精品| 欧美在线视频不卡| 亚洲国产成人91精品| 欧美日韩视频专区在线播放| 国内一区二区三区在线视频| 91久久国产综合久久蜜月精品| 亚洲缚视频在线观看| 欧美日韩一区在线| 亚洲视频在线播放| 亚洲一区二区三区在线| 欧美激情一区二区三区成人| 亚洲精品小视频在线观看| 国产欧美一区二区精品性色| 国产一区二区主播在线| 国产丝袜一区二区| 久久久国产午夜精品| 国产欧美日韩伦理| 国产日韩精品综合网站| 亚洲国产精品va在线看黑人| 亚洲国产va精品久久久不卡综合| 亚洲精品国产精品国产自| 欧美成人免费观看| 激情五月综合色婷婷一区二区| 亚洲日本精品国产第一区| 国产日韩成人精品| 国产精品久久久久久久久久久久久久| 久久夜色精品国产欧美乱极品| 久久精品视频在线观看| 欧美日韩在线影院| 亚洲高清在线观看一区| 欧美日韩精品| 国产精品美女www爽爽爽| 亚洲午夜精品福利| 亚洲影院色无极综合| 欧美日韩国产经典色站一区二区三区| 欧美色偷偷大香| 欧美中文字幕精品| 亚洲手机在线| 久久久国产精彩视频美女艺术照福利| 一区二区三区国产在线| 亚洲欧美日韩第一区| 亚洲精品在线看| 一本久久知道综合久久| 免费成年人欧美视频| 免费毛片一区二区三区久久久| 亚洲视频自拍偷拍| 午夜精品久久久久久久| 久久se精品一区二区| 久久久久久噜噜噜久久久精品| 欧美日韩三区| 久久国产日韩欧美| 欧美在线资源| 欧美人在线视频| 性久久久久久久久久久久| 国产一区二区丝袜高跟鞋图片| 欧美日韩国产色综合一二三四| 亚洲精品女av网站| 久久噜噜噜精品国产亚洲综合| 国产精品人人爽人人做我的可爱| 欧美专区福利在线| 欧美日韩亚洲天堂| 欧美国产另类| 亚洲国产高清在线观看视频| 午夜精品视频在线观看| 韩日精品中文字幕| 亚洲免费观看高清完整版在线观看熊| 99国内精品久久| 欧美国产高潮xxxx1819| 国产一区深夜福利| 91久久精品日日躁夜夜躁欧美| 一区二区三区日韩在线观看| 黑丝一区二区三区| 午夜久久影院| 亚洲欧美www| 先锋影音国产精品| 久久一本综合频道| 欧美精品在线免费观看| 韩国av一区二区三区| 欧美一级一区| 欧美一区三区三区高中清蜜桃| 国产精品入口| 在线观看日产精品| 亚洲综合大片69999| 一区国产精品| 国产精品一区二区在线观看不卡| 亚洲品质自拍| 日韩亚洲不卡在线| 在线亚洲观看| 亚洲午夜羞羞片| 欧美伦理视频网站| 欧美私人啪啪vps| 欧美刺激性大交免费视频| 久久黄色影院| 国产麻豆精品在线观看| 久久人人爽人人| 一区二区三区四区蜜桃| 麻豆9191精品国产| 久久一综合视频| 亚洲综合色网站| 久久精品亚洲精品国产欧美kt∨| 欧美日韩专区| 亚洲日韩欧美视频一区| 久久激情五月婷婷| 亚洲视频观看| 国产九区一区在线| 亚洲综合色激情五月| 亚洲黄页一区| 欧美一区二区三区婷婷月色| 欧美在线一级va免费观看| 亚洲色图在线视频| 亚洲国产精品日韩| 国产精品福利片| 欧美二区在线播放| 久久精品视频在线免费观看| 欧美成人资源| 久久精品国产2020观看福利| 99riav国产精品| 亚洲欧美色婷婷| 午夜精品视频在线观看一区二区| 亚洲风情亚aⅴ在线发布| 国内外成人免费激情在线视频网站| 制服诱惑一区二区| 夜夜嗨一区二区三区| 国内不卡一区二区三区| 国内自拍视频一区二区三区| 久久偷窥视频| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲国产精品久久久久秋霞蜜臀| 久热精品视频在线观看| 国产精品久久久999| 久久综合亚洲社区| 久久久久免费观看| 久久男人av资源网站| 亚洲国产一区在线观看| 欧美不卡激情三级在线观看| 亚洲免费精彩视频| 宅男66日本亚洲欧美视频| 国产日韩亚洲欧美| 欧美视频在线免费看| 欧美日本亚洲视频| 亚洲美洲欧洲综合国产一区| 老**午夜毛片一区二区三区| 在线日本高清免费不卡| 亚洲一区欧美二区| 欧美四级伦理在线| 一本色道久久加勒比88综合| 国产精品久久久久一区二区| 亚洲欧洲精品一区二区| 欧美视频专区一二在线观看| 欧美日韩一区二区视频在线观看| 国产精品久久久久婷婷| 一区二区欧美国产| 欧美日本一区二区三区| 影音欧美亚洲| 久久亚洲春色中文字幕久久久| 欧美一区二区三区四区在线观看| 在线成人h网| 亚洲一区二区三区在线| 亚洲性视频h| 模特精品在线| 在线电影国产精品| 国产精品欧美精品| 欧美成人精品在线| 亚洲一级黄色片| 欧美日韩精品欧美日韩精品一| 久久成人综合视频| 欧美电影免费观看网站| 欧美日韩黄色大片| 亚洲一区二区三区三| 国产婷婷一区二区| 欧美视频在线一区二区三区| 国产精品第一页第二页第三页| 一区二区三区视频在线看| 国产精品成人一区二区三区夜夜夜|