AN889の日記

組込みエンジニアのブログ

【Linux】Infineon(旧Cypress)製QSPIフラッシュS25Hxのお話

ECC機能

SPIフラッシュS25HxをLinuxで使ったときの話です。
このSPIフラッシュ上にJffs2領域を作り、Linuxでマウントしてファイルを書き込もうとするのですが、“Programming Error occurred”が表示され書き込めません。

メーカーからはLinuxドライバーのパッチが提供されてますが、コレでは解決しません。
https://community.infineon.com/t5/Nor-Flash/About-writing-data-less-than-the-page-size-for-S25HL02GT/td-p/411773

調べてみると、このSPIフラッシュはECC機能があるのですが、これが関係していました。
ECC機能には

  • 1ビットエラー検出・訂正(以下、1ビットエラー)
  • 1ビットエラー検出・訂正と2ビットエラー検出(以下、2ビットエラー)

の2通りあって、工場出荷状態は2ビットエラーになってます。

このフラッシュは16バイトを一つのデータユニットとしており、ECC 2ビットではデータユニット内の追記ができません。
例えば、アドレス 0x0000_1000 から4バイト書いた状態で、アドレス 0x0000_1004 から4バイト書くことができないのです。
JFFS2 はフラッシュの消去部分を順に使うため、この制約で Program Error が発生してました。
ECC 1ビットではこれができます。
なので、JFFS2 等の書込み可能なファイルシステムを使う場合は、ECC 1ビットに設定する必要があります。
S25HxではCFR4V[3](Configuration Register 4のビット3)を0にすることで設定できます。

データシートはここにあります。
https://www.infineon.com/dgdl/Infineon-S25HS256T_S25HS512T_S25HS01GT_S25HL256T_S25HL512T_S25HL01GT_256_Mb_512_Mb_1_Gb_SEMPER_Flash_Quad_SPI_1_8_V_3-DataSheet-v69_00-EN.pdf?fileId=8ac78c8c7f2a768a017f52f1a4242c57&da=t

ウェアレベリング機能

また、このフラッシュはウェアレベリング機能があるので使用上の注意が必要です。
デフォルトはウェアレベリング機能有効で、これだと高耐久(High Endurance)モードなのでデータ保持保証が最小2年になります。
ウェアレベリング機能無効にすると、長期保持(Long Retention)モードになってこれだとデータ保持保証が最小25年になります。
デフォルトのウェアレベリング機能有効のまま使うと、運用開始で2年経過するとデータが消えて機器が動作不正になる可能性あるので要注意です。各モードは書換回数も違うので、これも要注意です。

  書換回数 データ保持期間
長期保持モード 500回以内 最小25年
高耐久モード 300,000回以内 最小2年

ウェアレベリング機能有効/無効設定はEFXx(Infineon Endurance Flex Architecture Selection)レジスターでするのですが、設定は一回のみなので、これも要注意です。

さいごに

ECCありフラッシュは少ないので、このフラッシュを使いたいのですが、使用上の注意がいろいろ必要なのが難点です。
Infineonさん、1G/2Gビット容量でECCありかつウェアレベリング機能なしの製品をぜひお願いします!!