對于做快速存儲采集數據類產品的用戶來說,在處理突發掉電情況時需要保存現有數據并避免數據丟失,這種情況下有很多種解決方案,鐵電存儲器(FRAM) 就是個很好的選擇。FRAM是一種具有快速寫入速度的非易失性存儲器,既可以進行非易失性數據存儲,又可以像RAM一樣操作。
本文將借助飛凌嵌入式OK3568-C開發板來為大家介紹一種采用FRAM的方案——使用SPI0掛載PB85RS2MC (FRAM) 芯片。本文所描述的驅動文件和應用文件,可聯系飛凌嵌入式的技術支持獲取。
![wKgaomUNLLWAGEVUAAswXLOa2P8057.png](https://file1.elecfans.com/web2/M00/A5/AB/wKgaomUNLLWAGEVUAAswXLOa2P8057.png)
修改思路——
我們要添加一個SPI設備,需要進行如下操作:在設備樹中添加描述→設備樹描述中對應設備驅動→設備驅動添加到內核。
修改結果——
修改 OK3568-linux-source/kernel/arch/arm64/boot/dts/rockchip/OK3568-C-common.dtsi
修改如下:
![wKgZomUNLLSANdvaAABPzdVFgIY691.png](https://file1.elecfans.com/web2/M00/A7/70/wKgZomUNLLSANdvaAABPzdVFgIY691.png)
接下來筆者為大家介紹一下適配的過程。
1驅動程序
我們在menuconfig中搜索fm25、pb85等比較常用的FRAM字眼,發現并沒有類似的驅動程序,這時就需要手寫或者移植一個驅動程序。在搜遍各大網站之后找到了一個W25Q64的驅動,對比了一下PB85RS2MC的各種操作碼以后,發現兩者的操作碼大差不差,因此就決定將W25Q64的驅動移植過來。根據PB85RS2MC芯片手冊中敘述,各種操作碼為:
![wKgaomUNLLSALoEvAABtDv-Auc8420.png](https://file1.elecfans.com/web2/M00/A5/AB/wKgaomUNLLSALoEvAABtDv-Auc8420.png)
![wKgaomUNLLSAZXBHAACtEB3NdO8457.png](https://file1.elecfans.com/web2/M00/A5/AB/wKgaomUNLLSAZXBHAACtEB3NdO8457.png)
因此,在驅動程序中宏定義以下操作碼,以便在接下來的驅動程序中使用:
![wKgaomUNLLSAEDX6AABfbutbbhc581.png](https://file1.elecfans.com/web2/M00/A5/AB/wKgaomUNLLSAEDX6AABfbutbbhc581.png)
首先要在驅動程序中進行初始化函數和退出函數,也就是spidev_init和spidev_exit,init函數里就是進行字符設備的初始化,注冊等的操作,exit函數就是要把我們注冊的東西在退出時都釋放掉,再者就是驅動程序和設備樹匹配,匹配是通過compatible屬性值匹配的,這里我們一定要和設備樹中的compatible屬性值一致,否則會匹配不成功。驅動程序中.compatible值如下圖所示。
![wKgZomUNLLSADSg2AAAn3A8N7PU443.png](https://file1.elecfans.com/web2/M00/A7/70/wKgZomUNLLSADSg2AAAn3A8N7PU443.png)
驅動和設備樹匹配成功以后就要執行probe函數,這里probe函數執行了一些初始化和注冊主次設備號的操作。我們可以通過是否打印spi_probesuccess!來判斷驅動程序,是否和設備樹匹配成功。
![wKgaomUNLLWAE5y9AAEy-kKXQ6A161.png](https://file1.elecfans.com/web2/M00/A5/AB/wKgaomUNLLWAE5y9AAEy-kKXQ6A161.png)
從PB85RS2MC芯片手冊中看讀的條件,讀取FRAM存儲單元的數據,需要READ的操作碼,任意24位地址輸入到SI。第一個spi_transfer 結構體用于發送命令cmd 到SPI設備,在讀取數據之前準備設備,第二個是發送地址到SPI設備,第三個是接收從設備讀取的數據。
![wKgZomUNLLWAW-zNAAEMDpORhwQ830.png](https://file1.elecfans.com/web2/M00/A7/70/wKgZomUNLLWAW-zNAAEMDpORhwQ830.png)
這段代碼實現了從 SPI設備中同步讀取數據,并將數據復制到用戶空間的功能。
![wKgZomUNLLWAdGWzAADO54z3BBY537.png](https://file1.elecfans.com/web2/M00/A7/70/wKgZomUNLLWAdGWzAADO54z3BBY537.png)
從PB85RS2MC芯片手冊中看寫的條件,WREN命令用于設置寫使能鎖存器。需要在寫操作(WRITE命令)之前使用WREN命令設置寫使能鎖存器,WRITE命令將數據寫入 FRAM存儲單元陣列。WRITE操作碼、任意24位地址和8位寫入數據輸入到 SI。
下面這段代碼實現了向SPI設備發送寫入使能命令的功能。
![wKgZomUNLLaAZW4qAACHMMXcNdA300.png](https://file1.elecfans.com/web2/M00/A7/70/wKgZomUNLLaAZW4qAACHMMXcNdA300.png)
這段代碼實現了向SPI設備同步寫入數據的功能。它先發送寫入使能命令,然后發送地址信息和數據。
![wKgZomUNLLaAV59NAAEcFHGFPcA629.png](https://file1.elecfans.com/web2/M00/A7/70/wKgZomUNLLaAV59NAAEcFHGFPcA629.png)
下面這段代碼向 SPI設備中同步寫入數據的功能,將用戶空間的數據復制到設備的發送緩沖區,并調用spidev_sync_write 函數將數據寫入SPI 設備。
![wKgaomUNLLWAKSgqAAC3OevAyvI947.png](https://file1.elecfans.com/web2/M00/A5/AB/wKgaomUNLLWAKSgqAAC3OevAyvI947.png)
2應用程序
向SPI設備寫數據,調用lseek來改變寫入數據的位置,這樣就可以在整個SPI設備里寫數據,如./writeframAPP /dev/pb85rs 0 forlinx
(0是要寫入的地址,forlinx是要寫入的內容)。
![wKgZomUNLLWAH16AAABAno9ueFo543.png](https://file1.elecfans.com/web2/M00/A7/70/wKgZomUNLLWAH16AAABAno9ueFo543.png)
從SPI設備讀數據,調用lseek來改變讀取數據的位置,這樣就可以在整個SPI設備里讀數據,如./readframAPP /dev/pb85rs 0
(0是要讀取數據的地址)
![wKgaomUNLLWAYI3SAACa-WUUmYY162.png](https://file1.elecfans.com/web2/M00/A5/AB/wKgaomUNLLWAYI3SAACa-WUUmYY162.png)
3實際測試
(1)首先將fram.ko,readframAPP, writefram APP拷貝到OK3568-C開發板的任意文件夾中。
![wKgZomUNLLaAFlqKAAAHj-gd_2M770.png](https://file1.elecfans.com/web2/M00/A7/70/wKgZomUNLLaAFlqKAAAHj-gd_2M770.png)
(2)用insmod加載fram.ko模塊,出現spi_probesuccess!說明驅動和設備樹匹配成功。
![wKgaomUNLLaAO9AAAAAQhaNT3o0389.png](https://file1.elecfans.com/web2/M00/A5/AB/wKgaomUNLLaAO9AAAAAQhaNT3o0389.png)
(3)在/dev/下看有沒有pb85rs設備。
![wKgZomUNLLaAPZrEAABAHQ86q0g442.png](https://file1.elecfans.com/web2/M00/A7/70/wKgZomUNLLaAPZrEAABAHQ86q0g442.png)
(4)使用./writeframAPP /dev/pb85rs 1500 forlinx
向設備寫數據,1500是地址,forlinx是要寫入的內容。
![wKgaomUNLLaAaw_yAAAHhKDczY0550.png](https://file1.elecfans.com/web2/M00/A5/AB/wKgaomUNLLaAaw_yAAAHhKDczY0550.png)
(5)使用./readframAPP /dev/pb85rs 1500
(1500是要讀取數據的地址)
![wKgaomUNLLaARx76AAAH51tqjbc199.png](https://file1.elecfans.com/web2/M00/A5/AB/wKgaomUNLLaARx76AAAH51tqjbc199.png)
4斷電測試
斷電一天后重新讀取PB85RS2MC的數據,發現數據仍然存在。驗證了PB85RS2MC鐵電存儲芯片的斷電數據保留特性。
![wKgaomUNLLaARky6AAAH3EAxK3A543.png](https://file1.elecfans.com/web2/M00/A5/AB/wKgaomUNLLaARky6AAAH3EAxK3A543.png)
至此,我們就完成了在OK3568-C開發板上添加一個新的SPI鐵電存儲芯片的操作!
-
芯片
+關注
關注
456文章
51182瀏覽量
427278 -
SPI
+關注
關注
17文章
1722瀏覽量
92129 -
嵌入式開發
+關注
關注
18文章
1035瀏覽量
47717 -
fram
+關注
關注
2文章
283瀏覽量
79474 -
RK3568
+關注
關注
4文章
525瀏覽量
5235
發布評論請先 登錄
相關推薦
RK3568的顯示問題及其解決方法
RK3568內置MCU開發介紹之一
![<b class='flag-5'>RK3568</b>內置MCU開發介紹之一](https://file1.elecfans.com/web3/M00/00/A2/wKgZPGdLMg-AFkS0AAA5BGKqG3E264.png)
RK3568 編譯sdk技巧
![<b class='flag-5'>RK3568</b> 編譯sdk技巧](https://file.elecfans.com/web2/M00/43/4A/poYBAGJ9sjaAPEhHAAAvI_7i-HA907.jpg)
迅為RK3568驅動指南|如何在Linux中使用模擬SPI
![迅為<b class='flag-5'>RK3568</b>驅動指南|如何在Linux中使用模擬<b class='flag-5'>SPI</b>](https://file1.elecfans.com/web2/M00/00/D2/wKgaomarHwyAHEWdAABOS2lVvII317.png)
RK3568驅動指南|第十六篇 SPI-第195章 實踐:移植官方mcp2515驅動
![<b class='flag-5'>RK3568</b>驅動指南|第十六篇 <b class='flag-5'>SPI</b>-第195章 實踐:移植官方mcp2515驅動](https://file1.elecfans.com/web2/M00/00/9B/wKgaomap8vuAXJbjAABR7PlcAJ8424.png)
基于HD-RK3568-CORE設計的HD-RK3568-OPS主板上新!
![基于HD-<b class='flag-5'>RK3568</b>-CORE設計的HD-<b class='flag-5'>RK3568</b>-OPS主板上新!](https://file1.elecfans.com/web2/M00/D0/F0/wKgaomYiQwSAOur3AAAcESs8JdU178.jpg)
支持標準OPS接口,通用型RK3568工控板上新!
![支持標準OPS接口,通用型<b class='flag-5'>RK3568</b>工控板上新!](https://file1.elecfans.com/web2/M00/CB/A6/wKgaomYfQseAYUrnAACt5Ej5pZo472.png)
評論