国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx

嵌入式Linux下SPI總線驅(qū)動程序設(shè)計

2017-07-19 11:30:56李傳璽
電子科技 2017年8期
關(guān)鍵詞:外設(shè)驅(qū)動程序內(nèi)核

孫 帥,李傳璽

(航天科工深圳集團有限公司 南京分公司,江蘇 南京 211100)

?

嵌入式Linux下SPI總線驅(qū)動程序設(shè)計

孫 帥,李傳璽

(航天科工深圳集團有限公司 南京分公司,江蘇 南京 211100)

給出了一種提高軟件使用效率的設(shè)計方法,以SPI驅(qū)動程序為例,通過外設(shè)和處理器相分離的設(shè)計思想,在外設(shè)模型和處理器模型之間增加一層虛擬總線,達到降低外設(shè)驅(qū)動與主機控制器驅(qū)動耦合的目的。實際測試結(jié)果表明,該方法實現(xiàn)了主機和外設(shè)任意組合的功能,具備較高的應用價值。

SPI總線;設(shè)備驅(qū)動; Linux; 嵌入式

Linux操作系統(tǒng)在嵌入式領(lǐng)域得到廣泛的應用,不僅是因為良好的內(nèi)核性能,更是展示了其在開源上的優(yōu)勢[1],使得符合驅(qū)動規(guī)范的外設(shè)器件,均能得到操作系統(tǒng)的有效支持。然而,由于外設(shè)器件種類繁多,且外設(shè)驅(qū)動和處理器結(jié)構(gòu)相關(guān)[2-3],若驅(qū)動程序移植在不同的處理器上,將導致驅(qū)動軟件存在多個版本,這給產(chǎn)品開發(fā)和系統(tǒng)維護帶來了較大的困難。

為提高外設(shè)驅(qū)動程序的使用效率,降低設(shè)備驅(qū)動和處理器結(jié)構(gòu)的耦合程度,本文以Linux設(shè)備驅(qū)動模型為基礎(chǔ),用設(shè)備和處理器相分離的思想設(shè)計串行外設(shè)接口SPI(Serial Peripheral Interface)驅(qū)動[4],在外設(shè)驅(qū)動和處理器驅(qū)動之間增加一層SPI虛擬總線,該總線對內(nèi)對外隱藏了對端的不確定性,使得外設(shè)驅(qū)動與主機控制器驅(qū)動不相關(guān),實現(xiàn)主機和外設(shè)任意組合的功能。最后通過嵌入式平臺的測試,驗證了該虛擬總線的隔離功能。

1 SPI虛擬總線結(jié)構(gòu)

在Linux非總線結(jié)構(gòu)的驅(qū)動中,用戶應用程序訪問SPI物理設(shè)備需要經(jīng)過內(nèi)核空間的相關(guān)調(diào)用[5],如圖1中不含虛線部分。內(nèi)核的設(shè)備協(xié)議驅(qū)動層需要了解外設(shè)的通信協(xié)議和數(shù)據(jù)結(jié)構(gòu),并負責SPI功能的具體實現(xiàn)[6]。而總線驅(qū)動結(jié)構(gòu)則是以Linux設(shè)備驅(qū)動模型為基礎(chǔ)[7],采用設(shè)備和處理器相分離的思想,在硬件設(shè)備和內(nèi)核協(xié)議驅(qū)動之間增加一層SPI虛擬總線,分離出設(shè)備協(xié)議驅(qū)動層關(guān)于硬件的功能,如圖1中的虛線部分。SPI總線由SPI核心接口層和SPI控制器驅(qū)動層組成。

圖1 SPI虛擬總線結(jié)構(gòu)

SPI核心接口層提供核心數(shù)據(jù)結(jié)構(gòu)的相關(guān)定義、SPI控制器驅(qū)動和設(shè)備驅(qū)動的注冊、注銷管理等API[8]。其與具體的處理器平臺無關(guān):向下屏蔽了物理總線控制器的差異,規(guī)范統(tǒng)一的訪問策略和接口參數(shù);向上提供了統(tǒng)一的協(xié)議,以便內(nèi)核空間的設(shè)備協(xié)議驅(qū)動層通過總線進行數(shù)據(jù)收發(fā)。SPI控制器驅(qū)動層負責將上層協(xié)議驅(qū)動的數(shù)據(jù)按SPI總線的時序要求發(fā)送給設(shè)備,并從設(shè)備收到的數(shù)據(jù)返回給上層的協(xié)議驅(qū)動[9]。SPI控制器驅(qū)動為系統(tǒng)中每條SPI總線實現(xiàn)相應的讀寫方法,同時負責管理具體的硬件資源,諸如DMA、中斷向量等。

2 SPI總線驅(qū)動設(shè)計

2.1 SPI核心接口層

SPI核心接口層主要包含spi_master、spi_device和spi_driver這3個數(shù)據(jù)結(jié)構(gòu)。spi_master結(jié)構(gòu)用于表示SPI控制器,其規(guī)定了總線編號、控制器的片選信號、工作模式、消息鏈表以及消息隊列[10];spi_device結(jié)構(gòu)用于描述SPI設(shè)備,包括片選索引、數(shù)據(jù)單位、中斷編號等信息;spi_driver結(jié)構(gòu)則對應spi_device操作方法的實現(xiàn)[11]。當系統(tǒng)加載模塊時,內(nèi)核首先通過spi_register_master( )注冊spi_master結(jié)構(gòu)到系統(tǒng)中,然后調(diào)用spi_register_board_info( )將每個spi_board_info掛在全局鏈表變量上,以遍歷已經(jīng)注冊到系統(tǒng)中的控制器,匹配相應的控制器并獲取同名的spi_master結(jié)構(gòu)指針,隨后通過spi_new_device( )向系統(tǒng)增加SPI設(shè)備,最終調(diào)用spi_register_driver( )完成spi_driver的注冊。

2.2 SPI控制器驅(qū)動層

SPI控制器驅(qū)動層主要包含platform_device和platform_devic[12]兩個數(shù)據(jù)結(jié)構(gòu)。在platform_device中定義了控制器所需的寄存器地址、DMA通道資源、中斷編號和設(shè)備名稱。其中,設(shè)備名稱用于匹配相應的控制器驅(qū)動[13]。platform_device對應platform_device平臺驅(qū)動的操作方法。以飛思卡爾IMX為例,在系統(tǒng)初始化階段,SPI控制器以mxs-spi為名稱通過mxs_get_device( )向系統(tǒng)注冊平臺設(shè)備[14],同時mxs_spi_init( )以mxs-spi為名稱向系統(tǒng)添加平臺驅(qū)動。平臺總線匹配platform_device和platform_device,觸發(fā)probe( )函數(shù)回調(diào)以完成SPI控制器的注冊過程[15]。至此,連接內(nèi)核設(shè)備協(xié)議和硬件外設(shè)的SPI虛擬總線創(chuàng)建完成。

2.3 SPI模型的初始化

在初始化階段,spi_init( )向系統(tǒng)注冊一個名為SPI的總線類型,同時為SPI控制器注冊名為spi_master的設(shè)備類,使文件系統(tǒng)類型創(chuàng)建節(jié)點文件sys/bus/spi、sys/class/spi_master,表明SPI總線中spi_bus_type結(jié)構(gòu)的match字段指向了spi_match_device( )函數(shù),該函數(shù)用于匹配SPI總線上的設(shè)備和驅(qū)動。同時,SPI設(shè)備和其驅(qū)動通過總線互相進行匹配[16],使得設(shè)備能夠找到正確的驅(qū)動程序進行控制和驅(qū)動。

static int __init spi_init(void)

{

buf = kmalloc(SPI_BUFSIZ, GFP_KERNEL);

status = bus_register(&spi_bus_type); //注冊SPI的總線類型

status = class_register(&spi_master_class); //注冊spi_master的設(shè)備類

}

3 SPI總線驗證

通過上述對SPI虛擬總線的分析和創(chuàng)建,本章節(jié)以飛思卡爾的IMX平臺為例,測試SPI總線及其外設(shè)的連接狀態(tài)。其中,外設(shè)為74HC595,定義命名為spidev的設(shè)備平臺,設(shè)備驅(qū)動的數(shù)據(jù)結(jié)構(gòu)如下

static struct spi_driver spidev_spi_driver = {

.driver = {

.name ="spidev",

.owner =THIS_MODULE,

},

.probe =spidev_probe,//探測并匹配相應的外設(shè)

};

IMX正常啟動后,登入系統(tǒng)并切換到總線級的目錄下進行觀測,如圖2所示。Linux在總線視圖的目錄中自動創(chuàng)建SPI目錄,該目錄下注冊名為SPI1.0的總線,這層總線使用名為spidev的驅(qū)動,而驅(qū)動最終又指向名為SPI1.0的總線,表明SPI1.0總線創(chuàng)建成功并具備掛載外設(shè)的功能。

圖2 使用終端觀測到的SPI虛擬總線

進入設(shè)備級的目錄后,如圖3所示。外設(shè)已映射到名為SPI1.0的總線,并使用序號1的控制器以及控制器的第1個片選信號。該外設(shè)已綁定名為spidev的驅(qū)動,掛載到 /bus/spi的子系統(tǒng)中,這與在總線級目錄下觀測的結(jié)果一致。

圖3 使用終端觀測SPI總線連接的外設(shè)信息

4 結(jié)束語

提出了一種提高SPI驅(qū)動使用效率的設(shè)計方法,以Linux設(shè)備驅(qū)動模型為基礎(chǔ),在外設(shè)驅(qū)動和處理器驅(qū)動之間增加SPI虛擬總線,實現(xiàn)主機和外設(shè)任意組合的功能。經(jīng)過測試,使用本方法設(shè)計的SPI驅(qū)動,降低設(shè)備驅(qū)動和處理器結(jié)構(gòu)的耦合程度,且工作性能穩(wěn)定,具備一定的工程實用性。

[1] Jonatban Corbet.Linux設(shè)備驅(qū)動程序[M].3版.魏永明,耿岳,鐘書毅,譯.北京:中國電力出版社,2012.

[2] 楊俊成.嵌入式Linux設(shè)備驅(qū)動程序框架的研究[J].核電子學與探測技術(shù),2011,31(2):243-244.

[3] 胥霜霞.嵌入式Linux下Z85C30芯片設(shè)備驅(qū)動程序設(shè)計[J].電子科技,2014,27(5):116-117.

[4] 朱恩亮.Linux環(huán)境下USB設(shè)備驅(qū)動程序設(shè)計[J].電子

科技,2016,29(1):108-109.

[5] 宋寶華.Linux設(shè)備驅(qū)動開發(fā)詳解[M].北京:人民郵電出版社,2008.

[6] 孟浩依然.Linux內(nèi)核SPI總線驅(qū)動分析[EB/OL].(2012-12-11) [2015-09-06]http://www.cnblogs.com/liugf05/archive/2012/12/03/2800457.html.

[7] Marcus E,Stern H.高可用性系統(tǒng)設(shè)計[M].汪青青,盧祖英,譯.北京:清華大學出版社,2005.

[8] Droid Phone.Linux SPI總線和設(shè)備驅(qū)動架構(gòu)[EB/OL].(2014-04-12)[2015-02-16]http://blog.csdn.net/droidphone.

[9] Gene S.Getting Linux for your board[M].New York:Willy Press,2010.

[10] 劉剛.Linux系統(tǒng)移植[M].北京:清華大學出版社,2011.

[11] 孫天澤.嵌入式設(shè)計及Linux驅(qū)動開發(fā)指南[M].2版.北京:電子工業(yè)出版社,2007.

[12] Matthew N,Stone R.Linux程序設(shè)計[M].2版.楊曉蕓,譯.北京:機械工業(yè)出版社,2002.

[13] Daniel P Bovet.Understanding the Linux kernel[M].北京:中國電力出版社,2007.

[14] 王鎮(zhèn)道,胡贊民,陳迪平.基于ARM&Linux平臺IIC驅(qū)動程序的設(shè)計[J].微計算機信息,2011(5):1-3.

[15] 廣州致遠.嵌入式Linux開發(fā)教程[EB/OL].(2014-06-04)[2016-03-12]http://www.zlg.cn/ipc/down/down/id/92.html.

[16] 徐瑩彗.ARM9嵌入式系統(tǒng)設(shè)計-基于S3C2410與Linux[M].北京:北京航空航天大學出版社,2007.

SPI Bus Driver Under Embedded Linux Programming

SUN Shuai, LI Chuanxi

(Nanjing Company,Aerospace Science and Industry Group (Shenzhen) Co. LTD.,Nanjing 211100,China)

Presents a design method of increasing the service efficiency of the software, the SPI driver, for example, through the design idea of separating peripherals and processor, add a layer between peripherals model and processor model virtual bus, to reduce the coupling of the peripheral drive and the host controller driver. The actual test results show that this method can realize the function of the host and peripherals in any combination has higher application value.

SPI bus; device drivers; Linux; the embedded

2016- 10- 26

孫帥(1984-),男,碩士,工程師。研究方向:航天飛行控制計算機。李傳璽(1980-),男,碩士,工程師。研究方向:航天電力儀器。

10.16180/j.cnki.issn1007-7820.2017.08.027

TN919.71;TP316.2

A

1007-7820(2017)08-099-03

猜你喜歡
外設(shè)驅(qū)動程序內(nèi)核
萬物皆可IP的時代,我們當夯實的IP內(nèi)核是什么?
強化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
基于嵌入式Linux內(nèi)核的自恢復設(shè)計
Linux內(nèi)核mmap保護機制研究
Microchip推出具備雙ADC外設(shè)的全新器件,擴展其低成本8位PIC?單片機產(chǎn)品線
貼身呵護 必不可少的PSP外設(shè)
外設(shè)天地行情
外設(shè)天地行情
驅(qū)動程序更新與推薦
驅(qū)動程序更新與推薦
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
秦皇岛市| 逊克县| 台安县| 怀来县| 滦南县| 历史| 潮安县| 马关县| 筠连县| 神农架林区| 威海市| 南宫市| 盐边县| 吕梁市| 台前县| 和硕县| 临泽县| 永泰县| 通化县| 福鼎市| 龙游县| 忻城县| 溆浦县| 新邵县| 青田县| 广宗县| 彩票| 乡宁县| 普洱| 邹平县| 阿图什市| 岑溪市| 迭部县| 吴江市| 杂多县| 武义县| 南充市| 大足县| 尼玛县| 罗平县| 会泽县|