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

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


咨詢(xún)
建站咨詢(xún)
