既存のデータを保存し、突然の電源喪失に対処する際のデータ損失を回避することは、データ製品の高速ストレージと取得のユーザーにとって非常に重要です。この問題には多くの解決策がありますが、その中でも強誘電体メモリ (FRAM) は良い選択です。FRAM は書き込み速度が速い不揮発性メモリで、データを不揮発的に保存しながら RAM と同様の操作が可能です。
この記事では、Forlinx OK3568-C 開発ボードを利用して、SPI0 インターフェイスを使用して PB85RS2MC (FRAM) チップを接続する、FRAM を採用するソリューションを紹介します。この記事で説明されているドライバー ファイルとアプリケーション ファイルは、Forlinx Embedded のテクニカル サポートに問い合わせることで入手できます。
修正-
SPI デバイスを追加するには、次の手順を実行する必要があります。 デバイス ツリーに説明を追加 → デバイス ツリー説明内の対応するデバイス ドライバー → カーネルにデバイス ドライバーが追加
結果-
OK3568-linux-source/kernel/arch/arm64/boot/dts/rockchip/OK3568-C-common.dtsi を変更します。
以下を変更します。
次に、適応プロセスを紹介します。
ドライバー1名
menuconfig で fm25、pb85、およびその他の一般的に使用される FRAM ワードを検索しましたが、同様のドライバーがないことがわかりました。したがって、ドライバーを手書きするか移植する必要があります。色々なサイトを探した結果、W25Q64用のドライバを見つけました。PB85RS2MC と W25Q64 のさまざまなオペレーション コードを比較した結果、それらが非常に似ていることに気づきました。そこで、W25Q64ドライバをPB85RS2MCに移植することにしました。
PB85RS2MC チップのマニュアルの説明によると、さまざまなオペコードは次のとおりです。
コマンド名 |
コマンドの説明 |
オペコード |
---|---|---|
ミソサザイ | ライトイネーブルラッチコマンド | 0000 0110B |
WRDI | リセット イネーブル ラッチ コマンド ライト イネーブル ラッチ コマンド | 0000 0100B |
読む | 読み取りコマンド | 0000 0011B |
書く | 書き込みコマンド | 0000 0010B |
RDID | デバイスのシリアル番号読み取りコマンド | 1001 1111B |
FSTRD | 高速リードコマンド | 0000 1011B |
寝る | スリープコマンド | 1011 1001B |
RDSR | ステータスレジスタの読み取り | 0000 0101B |
WRSR | 書き込みステータスレジスタ | 0000 0001B |
したがって、次のオペコードは、次のドライバで使用されるようにドライバ内でマクロ定義されています。
まず、initi 関数と exit 関数、つまり spidev _ init と spidev _ exit をドライバーで実行する必要があります。init 関数は、キャラクターデバイスの初期化、登録などを行います。exit 関数は、終了時に登録した内容をすべて解放します。これは、デバイス ツリーの互換性属性の値と一致する必要があります。そうでない場合、一致は失敗します。さらに、ドライバーとデバイス ツリーは、互換性属性の値によって照合されます。この属性は、デバイス ツリーの互換性属性の値と同じである必要があります。そうしないと、試合は失敗します。ドライバでの互換値は以下のとおりです。
ドライバーとデバイス ツリーの一致が成功したら、プローブ関数を実行する必要があります。プローブ関数は、初期化とプライマリ デバイス番号とセカンダリ デバイス番号の登録を実行します。ドライバーとデバイス ツリーが正常に一致しているかどうかは、spi_probe success が出力されるかどうかによって判断できます。
PB85RS2MC チップのマニュアルで読み取り条件を確認し、FRAM メモリ セルからデータを読み取ります。これには、READ オペコード、SI に入力された任意の 24 ビット アドレスが必要です。最初の spi_transfer 構造体は、データを読み取る前にデバイスを準備するためにコマンド cmd を SPI デバイスに送信するために使用され、2 番目は SPI デバイスにアドレスを送信するために使用され、3 番目はデバイスから読み取られたデータを受信するために使用されます。
このコードは、SPI デバイスからの同期読み取りを実装し、データをユーザー空間にコピーします。
PB85RS2MC チップのマニュアルで書き込み条件を確認してください。WREN コマンドを使用して書き込みイネーブル ラッチを設定します。WREN コマンドは、書き込み動作 (WRITE コマンド) の前に書き込みイネーブル ラッチを設定する必要があり、WRITE コマンドは FRAM メモリ セル アレイにデータを書き込みます。WRITE オペコード、任意の 24 ビット アドレス、および 8 ビット書き込みデータが SI に入力されます。
次のコードは、SPI デバイスに書き込みイネーブル コマンドを送信する機能を実装します。
このコードは、SPI デバイスへのデータの同期書き込みを実装します。最初に書き込み許可コマンドを送信し、次にアドレス情報とデータを送信します。
次のコードは、ユーザー空間データをデバイスの送信バッファにコピーし、spidev_sync_write 関数を呼び出してデータを SPI デバイスに書き込むことにより、SPI デバイスにデータを同期的に書き込みます。
2 アプリケーション
SPI デバイスにデータを書き込むには、lseek を呼び出して、SPI デバイス全体にデータを書き込むことができるように、書き込まれるデータの場所を変更します。/writeframAPP /dev/pb85rs 0 forlinx
(0 は書き込むアドレス、forlinx は書き込む内容)
SPI デバイスからデータを読み取るには、lseek を呼び出して、SPI デバイス全体で読み取れるように、読み取りデータの場所を変更します。/readframAPP /dev/pb85rs 0
(0は読み出すデータのアドレス)
3 実際のテスト
(1) まず、fram.ko、readframAPP、writefram APP を OK3568-C 開発ボードの任意のフォルダーにコピーします。
(2) insmodでfram.koモジュールをロード、spi_probe成功!は、ドライバーがデバイス ツリーと正常に一致することを示しています。
(3) /dev/ の下を見て、pb85rs デバイスがあるかどうかを確認します。
(4)使用する。/writeframAPP /dev/pb85rs 1500 forlinx
デバイスにデータを書き込みます。1500 はアドレス、forlinx は書き込む内容です。
(5)使用します。/readframAPP /dev/pb85rs 1500
(1500は読み出すデータのアドレスです)
4 停電試験
停電から 1 日経過した後、PB85RS2MC を再度読み取ると、データがまだ存在していることがわかりました。PB85RS2MC 強誘電体メモリチップの電源オフ時のデータ保持特性を検証します。
この時点で、 OK3568-C 開発ボードへの新しい SPI 強誘電体メモリ チップの追加が完了しました。
元は www.forlinx.net で公開されています。