新聞中心
SPI(Serial Peripheral Interface)是一種同步的串行通信總線,特點是通信線路簡單、速度快、支持多從設(shè)備、全雙工通信等。在嵌入式系統(tǒng)中,SPI總線已經(jīng)成為一種常用的通信接口標(biāo)準。本文將深入介紹Linux下SPIDevice Driver的實現(xiàn)及工作原理。

十年的薩迦網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都營銷網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整薩迦建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“薩迦網(wǎng)站設(shè)計”,“薩迦網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
一、SPI總線簡介
SPI總線通信原理非常簡單,主機通過CLK(時鐘線)、MOSI(主設(shè)備輸出從設(shè)備輸入)、MISO(主設(shè)備輸入從設(shè)備輸出)以及SS(片選線)與從設(shè)備通信。時鐘線提供不間斷的時基信號,主機通過CLK控制數(shù)據(jù)傳輸時序。MOSI和MISO是雙向數(shù)據(jù)線,主機通過MOSI向從設(shè)備發(fā)送數(shù)據(jù),由從設(shè)備通過MISO返回數(shù)據(jù)。SS線安排從設(shè)備,當(dāng)某一從設(shè)備上的SS線被拉低(低電平)時,該從設(shè)備被選擇,通信開始;當(dāng)SS線被拉高(高電平)時,通信結(jié)束并釋放該從設(shè)備。
二、SPI設(shè)備驅(qū)動的實現(xiàn)方式
在Linux系統(tǒng)中,SPI設(shè)備驅(qū)動集成了到核心框架中的SPI總線、SPI從設(shè)備管理以及SPI設(shè)備驅(qū)動三個部分。其中,SPI總線關(guān)心的是SPI總線的控制,主要構(gòu)建了SPI總線模型,獨立于CPU的設(shè)備模型,從設(shè)備的設(shè)備模型,并提供了總線操作的API,對上層應(yīng)用程序?qū)PI總線控制提供相應(yīng)的機制;SPI從設(shè)備管理關(guān)心的是從設(shè)備的操作,即從設(shè)備的寄存器操作、通信協(xié)議以及錯誤處理等;SPI設(shè)備驅(qū)動關(guān)心的是從設(shè)備的具體功能和控制,常常是硬件操作的核心代碼和功能代碼。
對于SPI設(shè)備驅(qū)動而言,其實現(xiàn)方法又分為兩種,一種是將SPI設(shè)備驅(qū)動嵌入到內(nèi)核中,這種實現(xiàn)方式具有性能優(yōu)越性和可靠性,但是代碼的維護和修改難度比較大,通常在開發(fā)嵌入式系統(tǒng)時采用這種方式。另一種是將SPI設(shè)備驅(qū)動以內(nèi)核模塊的方式驅(qū)入內(nèi)核中,這種方式開發(fā)、維護比較容易,但通信效率較低。
在這里,我們主要介紹將SPI設(shè)備驅(qū)動編譯為內(nèi)核模塊的實現(xiàn)方式。
三、SPI設(shè)備驅(qū)動的框架
一個標(biāo)準的SPI設(shè)備驅(qū)動應(yīng)該具有以下部分:
(1)、與SPI總線控制相關(guān)的部分,包括SPI控制結(jié)構(gòu)、設(shè)備信息以及設(shè)備ID等;
(2)、與SPI從設(shè)備管理相關(guān)的部分,包括對SPI設(shè)備注冊、卸載、設(shè)備初始化以及數(shù)據(jù)傳輸?shù)墓芾淼?
(3)、與SPI硬件相關(guān)的部分,包括硬件操作函數(shù)、數(shù)據(jù)傳輸函數(shù)以及設(shè)備控制函數(shù)等。
以Spi Flash設(shè)備驅(qū)動為例,相應(yīng)代碼如下:
四、SPI設(shè)備的注冊
用戶可以通過以下系統(tǒng)調(diào)用API完成驅(qū)動的注冊:
int spi_register_driver(struct spi_driver* drv);//注冊SPI驅(qū)動
void spi_unregister_driver(struct spi_driver* drv);//注銷SPI驅(qū)動
其作用是將對應(yīng)的SPI驅(qū)動注冊到SPI總線驅(qū)動中,以實現(xiàn)對相應(yīng)硬件設(shè)備的控制管理。SPI驅(qū)動接線圖如下圖所示。
五、
SPI總線是嵌入式系統(tǒng)中常用的通信接口,其串行通信快、線路簡單、支持多從設(shè)備等特性使得SPI總線成為一種優(yōu)秀的通信接口標(biāo)準。SPI的硬件除了數(shù)據(jù)線之外還包含時鐘線和片選線,從而保證了其通信的可靠性和穩(wěn)定性。
Linux系統(tǒng)中提供了標(biāo)準化的SPI總線管理和SPI設(shè)備驅(qū)動API,用戶可以通過使用SPI總線驅(qū)動,將SPI設(shè)備接入到Linux內(nèi)核中,享受到Linux系統(tǒng)提供的各種便利。而SPI設(shè)備驅(qū)動則是具體控制SPI設(shè)備的核心部分,其編寫要確保良好的擴展性、跨平臺性以及高性能低耗能的特性,有利于為用戶應(yīng)用程序開發(fā)提供優(yōu)秀的支持。
綜上所述,對于嵌入式系統(tǒng)開發(fā)人員來說,了解和掌握SPI總線管理及其設(shè)備驅(qū)動開發(fā),對于提高系統(tǒng)運行效率和可靠性都是非常有益的。
相關(guān)問題拓展閱讀:
- 14-Linux gpio模擬spi
- Linux主機驅(qū)動與外設(shè)驅(qū)動分離?
14-Linux gpio模擬spi
首先是spidev,要在/dev/下面產(chǎn)生設(shè)備文件,需要spidev的支持
使用的是gpio模擬spi,gpio模擬spi的時序原理是bitbang文件實現(xiàn)的,所以這個也需要打開,如果是在openwrt下動態(tài)加載的話就是如下兩個配置
如果是直接內(nèi)核的話是如下兩個
跟I2C的arch層一樣,主要是devices的添加和board_info的添加,如下
對于platform_add_devices,因為是使用spi_gpio,所以name是”spi_gpio”這樣才可以與driver里面的spi_gpio相互匹配probe到。
因為SPI是可以一個總線上面掛多個,然后通過片選腳CS進行硬件切換,所以這變有個num_chipselect需要設(shè)置,如果有2個設(shè)置就設(shè)置2,一個設(shè)備就設(shè)置1,這邊設(shè)置好之后,后面board_info也要有對應(yīng)的個數(shù),而且片選引腳需要不同。
I2C是通過每個設(shè)備有自己不同的地址,通過地址來進行軟件切換。
對于board_info使用的是spidev,drivers/spi/spidev.c文件,該文件的內(nèi)容是注冊一個spidev驅(qū)動。該驅(qū)動是一個字符設(shè)備驅(qū)動。
如果設(shè)備與驅(qū)動匹配,那么就會執(zhí)行spidev_probe()的內(nèi)容。在spidev_probe()函數(shù)中會調(diào)用device_create()成功后在 /dev 目錄下就會生成 spidev 相關(guān)的設(shè)備節(jié)點。
這邊有幾個參數(shù)要注意:
調(diào)試過程想看一些細節(jié)的debug信息可以打開內(nèi)核的動態(tài)debug信息,這個在以前的print system里面有
printk的等級設(shè)置成8.
開始
定位到是 spi_gpio_request 的時候報錯
后仿橘者面就將zkernel/3.10.49/arch/mips/mtk/ziroom/zrmt7628.c里面GPIO的信息調(diào)整下,
因為SPI的引腳和LED的引腳號一樣
,內(nèi)核不知道哪里會檢測到。
修改后打印備薯如下:
之后在/dev/下面就生成了spidev1.0的設(shè)備
有了/dev/spidev1.0設(shè)備之后,就可以在應(yīng)用成操作改設(shè)備收發(fā)數(shù)據(jù)。
在drivers/spi/spidev.c里面已經(jīng)封裝好了ioctl的對應(yīng)接口,根據(jù)這些伍禪接口就可以測試使用。
在Documentation/spi/spidev_test.c下面有個應(yīng)用層的實例,打開看下就清除了。
$(cc) spidev_test.c -o spidev_test生成可執(zhí)行文件spidev_test
然后拷貝到板子上,將MOSI和MISO短接就可以測試回環(huán)數(shù)據(jù)是否正常。
有邏輯分析儀的接上logic看波形就更加直觀。
gpio模擬SPI:
在ARM Linux下使用GPIO模擬SPI時序詳解:
linux SPI驅(qū)動:
Linux主機驅(qū)動與外設(shè)驅(qū)動分離?
Linux中的SPI、IPC、USB等子系統(tǒng)都利用了典型的把主機驅(qū)動和外設(shè)驅(qū)動分離的想法,讓主辯舉姿機端只負責(zé)產(chǎn)生總線上的傳輸波形,而外設(shè)端只是通過標(biāo)準的API來讓主機端以適當(dāng)?shù)牟ㄐ卧L問自身。因此這里面就涉及了4個軟件模塊:
1)主機端的驅(qū)動。根據(jù)具體的IC、SPI、USB等控制器的硬件手冊,操作具體的IPC、SPI、USB等控制器,產(chǎn)生總線的各種波形。
2)連接主機和外設(shè)的紐帶。外設(shè)不直接調(diào)用主機端的驅(qū)動來產(chǎn)生波形,而是調(diào)一個標(biāo)準的API。由這個標(biāo)準的API把這個波形的傳輸請求間接“轉(zhuǎn)發(fā)”給了具體的主機端驅(qū)動。當(dāng)然,在這里,更好把關(guān)攜絕于波形的描述也以某種數(shù)據(jù)結(jié)構(gòu)標(biāo)準化。
3)外設(shè)端的驅(qū)動。外設(shè)接在I-C、SPI、USB這樣的總線上,但是它們本身可以是觸摸屏、網(wǎng)卡、聲卡或者任意一種類型的設(shè)備。我們在相關(guān)的i2c_driver、spi_driver、u_driver這種xxx_driver的probe () 函數(shù)中去注冊它具體的類答陵型。當(dāng)這些外設(shè)要求IP℃、SPI、USB等去訪問它的時候,它調(diào)用“連接主機和外設(shè)的紐帶”模塊的標(biāo)準API。
4)板級邏輯。板級邏輯用來描述主機和外設(shè)是如何互聯(lián)的,它相當(dāng)于一個“路由表”。假設(shè)板子上有多個SPI控制器和多個SPI外設(shè),那究竟誰接在誰上面管理互聯(lián)關(guān)系,既不是主機端的責(zé)任,也不是外設(shè)端的責(zé)任,這屬于板級邏輯的責(zé)任。這部分通常出現(xiàn)在arch/arm/mach-xxx下面或者arch/arm/bootldts下面。
linux spi總線驅(qū)動的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux spi總線驅(qū)動,深入理解Linux SPI總線驅(qū)動,14-Linux gpio模擬spi,Linux主機驅(qū)動與外設(shè)驅(qū)動分離?的信息別忘了在本站進行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)站欄目:深入理解LinuxSPI總線驅(qū)動(linuxspi總線驅(qū)動)
網(wǎng)址分享:http://m.fisionsoft.com.cn/article/cdpojci.html


咨詢
建站咨詢
