Linux MTD SPIドライバでE_ERR/P_ERRステータス エラーを確認する方法– KBA220225- Community Translated (JA)

Version 1

    Community Translated by HiOm_1802421          Version: **

     

    Translation - English: How to Check E_ERR/P_ERR Status Errors in the Linux MTD SPI Driver – KBA220225

     

    質問:

    Linux MTD SPIドライバにフラッシュ プログラム/消去 失敗ステータスの確認を追加するにはどうすればよいですか?

     

    回答:

    Linuxマスターコードは、SPIドライバのプログラム/消去 失敗を確認しません。次の手順は、このエラーチェック機能をドライバに追加します。

     

    1. E_ERRおよびP_ERRビット フィールド定義をFL-SおよびFS-SのSPIドライバーに追加します。(FL-Lの場合は、ステータス レジスタ-1ではなくステータス レジスタ-2を使用します)

      • include/linux/mtd/spi-nor.hを開きます
      • ステータス レジスタ ビットの定義を探し、以下を置き換えます。

    #define SR_TB BIT(5) /* Top/Bottom protect */ 以下へ置き換え: #define SR_E_ERR BIT(5) /* Erase error occurred */#define SR_P_ERR BIT(6) /* Programming error occurred */

      • Flash opcodesセクションを探し、Clear Status Register opcodeを追加します

    #define SPINOR_OP_CLSR 0x30 /* Clear status register */ 2. E_ERRおよびP_ERRステータス ビット確認をステータス レディ確認サブ ルーチンに追加します。

      • drivers/mtd/spi-nor/spi-nor.cを開きます。
      • clear_st() サブ ルーチンを追加します。

    /** Clear status register* Returns negative if error occurred.*/static inline int clear_sr(struct spi_nor *nor){    return nor->write_reg(nor, SPINOR_OP_CLSR, NULL, 0);}

      • 消去またはプログラム失敗が発生したときのユーザー通知サブルーチンを追加します。例:user_error_handler()
      • static inline int spi_nor_sr_ready(struct spi_nor *nor) を探します。
      • 次のコードを変更します。

    int sr = read_sr(nor);

    if (sr < 0)

        return sr;

    else

        return !(sr & SR_WIP);

     

    以下へ変更:

     

    int sr = read_sr(nor);

    if (sr < 0)

        return sr;

    else if ((sr & SR_E_ERR) || (sr & SR_P_ERR))

    {

        user_error_handler();

        write_enable(nor);

        clear_sr(nor);

    }

    return !(sr & SR_WIP);