linux主機(jī)驅(qū)動與外設(shè)驅(qū)動分離思想

linux主機(jī)驅(qū)動與外設(shè)驅(qū)動分離思想

ID:36285534

大小:77.11 KB

頁數(shù):10頁

時間:2019-05-08

linux主機(jī)驅(qū)動與外設(shè)驅(qū)動分離思想_第1頁
linux主機(jī)驅(qū)動與外設(shè)驅(qū)動分離思想_第2頁
linux主機(jī)驅(qū)動與外設(shè)驅(qū)動分離思想_第3頁
linux主機(jī)驅(qū)動與外設(shè)驅(qū)動分離思想_第4頁
linux主機(jī)驅(qū)動與外設(shè)驅(qū)動分離思想_第5頁
資源描述:

《linux主機(jī)驅(qū)動與外設(shè)驅(qū)動分離思想》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。

1、Linux主機(jī)驅(qū)動與外設(shè)驅(qū)動分離思想1主機(jī)、外設(shè)驅(qū)動分離的意義在Linux設(shè)備驅(qū)動框架的設(shè)計中,除了有分層設(shè)計實(shí)現(xiàn)以外,還有分隔的思想。舉一個簡單的例子,假設(shè)我們要通過SPI總線訪問某外設(shè),在這個訪問過程中,要通過操作CPUXXX上的SPI控制器的寄存器來達(dá)到訪問SPI外設(shè)YYY的目的,最簡單的方法是:return_typexxx_write_spi_yyy(...){xxx_write_spi_host_ctrl_reg(ctrl);xxx_write_spi_host_data_reg(buf);while(!(xxx_spi_host_s

2、tatus_reg()&SPI_DATA_TRANSFER_DONE));...}如果按照這種方式來設(shè)計驅(qū)動,結(jié)果是對于任何一個SPI外設(shè)來講,它的驅(qū)動代碼都是CPU相關(guān)的。也就是說,當(dāng)然用在CPUXXX上的時候,它訪問XXX的SPI主機(jī)控制寄存器,當(dāng)用在XXX1的時候,它訪問XXX1的SPI主機(jī)控制寄存器:return_typexxx1_write_spi_yyy(...){xxx1_write_spi_host_ctrl_reg(ctrl);xxx1_write_spi_host_data_reg(buf);while(!(xxx1_spi

3、_host_status_reg()&SPI_DATA_TRANSFER_DONE));...}這顯然是不能接受的,因?yàn)檫@意味著外設(shè)YYY用在不同的CPUXXX和XXX1上的時候需要不同的驅(qū)動。那么,我們可以用如圖12.4的思想對主機(jī)控制器驅(qū)動和外設(shè)驅(qū)動進(jìn)行分離。這樣的結(jié)構(gòu)是,外設(shè)a、b、c的驅(qū)動與主機(jī)控制器A、B、C的驅(qū)動不相關(guān),主機(jī)控制器驅(qū)動不關(guān)心外設(shè),而外設(shè)驅(qū)動也不關(guān)心主機(jī),外設(shè)只是訪問核心層的通用的API進(jìn)行數(shù)據(jù)傳輸,主機(jī)和外設(shè)之間可以進(jìn)行任意的組合。圖12.4Linux設(shè)備驅(qū)動的主機(jī)、外設(shè)驅(qū)動分離如果我們不進(jìn)行如圖12.4的主機(jī)和外設(shè)

4、分離,外設(shè)a、b、c和主機(jī)A、B、C進(jìn)行組合的時候,需要9個不同的驅(qū)動。設(shè)想一共有m個主機(jī)控制器,n個外設(shè),分離的結(jié)果是需要m+n個驅(qū)動,不分離則需要m*n個驅(qū)動。LinuxSPI、I2C、USB、ASoC(ALSASoC)等子系統(tǒng)都典型地利用了這種分離的設(shè)計思想,在本章我們先以簡單一些的SPI為例,而I2C、USB、ASoC等則在后續(xù)章節(jié)會進(jìn)行詳細(xì)介紹。2LinuxSPI主機(jī)和設(shè)備驅(qū)動SPI(同步外設(shè)接口)是由摩托羅拉公司開發(fā)的全雙工同步串行總線,其接口由MISO(串行數(shù)據(jù)輸入),MOSI(串行數(shù)據(jù)輸出),SCK(串行移位時鐘),SS(從使能

5、信號)四種信號構(gòu)成,SS決定了唯一的與主設(shè)備通信的從設(shè)備,主設(shè)備通過產(chǎn)生移位時鐘來發(fā)起通訊。通訊時,數(shù)據(jù)由MOSI輸出,MISO輸入,數(shù)據(jù)在時鐘的上升或下降沿由MOSI輸出,在緊接著的下降或上升沿由MISO讀入,這樣經(jīng)過8/16次時鐘的改變,完成8/16位數(shù)據(jù)的傳輸。SPI模塊為了和外設(shè)進(jìn)行數(shù)據(jù)交換,根據(jù)外設(shè)工作要求,其輸出串行同步時鐘極性(CPOL)和相位(CPHA)可以進(jìn)行配置。如果CPOL=0,串行同步時鐘的空閑狀態(tài)為低電平;如果CPOL=1,串行同步時鐘的空閑狀態(tài)為高電平。如果CPHA=0,在串行同步時鐘的第一個跳變沿(上升或下降)數(shù)據(jù)

6、被采樣;如果CPHA=1,在串行同步時鐘的第二個跳變沿(上升或下降)數(shù)據(jù)被采樣。SPI接口時序如圖12.5所示。圖12.5SPI總線時序在Linux中,用代碼清單12.12的spi_master結(jié)構(gòu)體來描述一個SPI主機(jī)控制器驅(qū)動,其主要成員是主機(jī)控制器的序號(系統(tǒng)中可能存在多個SPI主機(jī)控制器)、片選數(shù)量、SPI模式和時鐘設(shè)置用到的函數(shù)、數(shù)據(jù)傳輸用到的函數(shù)等。代碼清單12.12spi_master結(jié)構(gòu)體1structspi_master{2structdevicedev;3s16bus_num;4u16num_chipselect;56/*設(shè)

7、置模式和時鐘*/7int(*setup)(structspi_device*spi);89/*雙向數(shù)據(jù)傳輸*/10int(*transfer)(structspi_device*spi,11structspi_message*mesg);1213void(*cleanup)(structspi_device*spi);14};分配、注冊和注銷SPI主機(jī)的API由SPI核心提供:structspi_master*spi_alloc_master(structdevice*host,unsignedsize);intspi_register_mas

8、ter(structspi_master*master);voidspi_unregister_master(structspi_master*mas

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。