AVR Libc Home Page AVRs AVR Libc Development Pages
Main Page User Manual Library Reference FAQ Alphabetical Index Example Projects

定義

<avr/boot.h>: ブートローダサポートユーティリティ

定義

#define BOOTLOADER_SECTION   __attribute__ ((section (".bootloader")))
#define boot_spm_interrupt_enable()   (__SPM_REG |= (uint8_t)_BV(SPMIE))
#define boot_spm_interrupt_disable()   (__SPM_REG &= (uint8_t)~_BV(SPMIE))
#define boot_is_spm_interrupt()   (__SPM_REG & (uint8_t)_BV(SPMIE))
#define boot_rww_busy()   (__SPM_REG & (uint8_t)_BV(__COMMON_ASB))
#define boot_spm_busy()   (__SPM_REG & (uint8_t)_BV(__SPM_ENABLE))
#define boot_spm_busy_wait()   do{}while(boot_spm_busy())
#define GET_LOW_FUSE_BITS   (0x0000)
#define GET_LOCK_BITS   (0x0001)
#define GET_EXTENDED_FUSE_BITS   (0x0002)
#define GET_HIGH_FUSE_BITS   (0x0003)
#define boot_lock_fuse_bits_get(address)
#define boot_signature_byte_get(addr)
#define boot_page_fill(address, data)   __boot_page_fill_normal(address, data)
#define boot_page_erase(address)   __boot_page_erase_normal(address)
#define boot_page_write(address)   __boot_page_write_normal(address)
#define boot_rww_enable()   __boot_rww_enable()
#define boot_lock_bits_set(lock_bits)   __boot_lock_bits_set(lock_bits)
#define boot_page_fill_safe(address, data)
#define boot_page_erase_safe(address)
#define boot_page_write_safe(address)
#define boot_rww_enable_safe()
#define boot_lock_bits_set_safe(lock_bits)

詳しい説明

    #include <avr/io.h>
    #include <avr/boot.h>

このモジュールのマクロは、C言語インターフェースを特定のAVRプロセッサーのブートローダー・サポート機能に提供します。これらのマクロは、フラッシュメモリのすべてのサイズで機能するようになっています。

グローバル割込みは、これらのマクロに関して自動的に抑制(disable)されません。これらは、プログラマに任せられています。次のコード例を見てください。フラッシュを書き込む間に、グローバル割込みを許可しておくことの注意は、プロセッサのデータシートを見てください。

注釈:
すべてのAVRプロセッサーが、ブートローダー・サポートを提供しているわけではありません。ブートローダをサポートしているかは、プロセッサのデータシートを見てください。
Todo:
MarekのEメールから:小さいデバイス(ATmega64/128以外のすべて)で、__SPM_REGは、(より短い「in」と「out」インタラクションでアクセス出来る)I/Oスペースにある。ブート・ローダが限られたサイズであることから、これは有力な最適化できる可能性がある。
API使用例
以下のコードは、ブートAPIの典型的使用法を示しています。
    #include <inttypes.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    
    void boot_program_page (uint32_t page, uint8_t *buf)
    {
        uint16_t i;
        uint8_t sreg;

        // Disable interrupts.

        sreg = SREG;
        cli();
    
        eeprom_busy_wait ();

        boot_page_erase (page);
        boot_spm_busy_wait ();      // Wait until the memory is erased.

        for (i=0; i<SPM_PAGESIZE; i+=2)
        {
            // Set up little-endian word.

            uint16_t w = *buf++;
            w += (*buf++) << 8;
        
            boot_page_fill (page + i, w);
        }

        boot_page_write (page);     // Store buffer in flash page.
        boot_spm_busy_wait();       // Wait until the memory is written.

        // Reenable RWW-section again. We need this if we want to jump back
        // to the application after bootloading.

        boot_rww_enable ();

        // Re-enable interrupts (if they were ever enabled).

        SREG = sreg;
    }

定義ドキュメント

#define boot_is_spm_interrupt (  )    (__SPM_REG & (uint8_t)_BV(SPMIE))

SPM割込みが許可されているかチェック

#define boot_lock_bits_set (   lock_bits )    __boot_lock_bits_set(lock_bits)

ブートローダ・ロックビットを設定

Parameters:
lock_bitsどのブートローダ・ロックビットを設定するべきかのマスク
注釈:
ここでは、'設定されたビット'は、ゼロ値が書き込まれます。また、BLBxxビットのみが、この命令でプログラムされる点に注意してください。

例えば、フラッシュのブートローダメモリセクションの書込みにSPM命令を許可しないためには、次のようなマクロを使用するでしょう。

    boot_lock_bits_set (_BV (BLB11));
注釈:
ブートローダーロックビットやいくつかのロックビットのように、一旦設定されたなら、ブートローダ自体が次に消去されるチップ消去に寄らない限り、ブートローダーロックビットは再びクリアーされることはありません。
#define boot_lock_bits_set_safe (   lock_bits )
Value:
do { \
    boot_spm_busy_wait();                       \
    eeprom_busy_wait();                         \
    boot_lock_bits_set (lock_bits);             \
} while (0)

ロックビットを設定する前のEEPROMとSPM演算が完了するのを待つ以外は、boot_lock_bits_set()と同様です。

#define boot_lock_fuse_bits_get (   address )
Value:
(__extension__({                                           \
    uint8_t __result;                                      \
    __asm__ __volatile__                                   \
    (                                                      \
        "sts %1, %2\n\t"                                   \
        "lpm %0, Z\n\t"                                    \
        : "=r" (__result)                                  \
        : "i" (_SFR_MEM_ADDR(__SPM_REG)),                  \
          "r" ((uint8_t)(__BOOT_LOCK_BITS_SET)),           \
          "z" ((uint16_t)(address))                        \
    );                                                     \
    __result;                                              \
}))

addressのロックかヒューズビットの読出し

addressパラメータは、GET_LOW_FUSE_BITS、GET_LOCK_BITS、GET_EXTENDED_FUSE_BITSやGET_HIGH_FUSE_BITSがありえます。

注釈:
ロックやヒューズビットの返値は、物理値です。すなわち、0を返すビットは、対応するヒューズやロックビットがプログラムされていることを意味しています。
#define boot_page_erase (   address )    __boot_page_erase_normal(address)

アドレスに含まれるフラッシュページを消去

注釈:
アドレスは、フラッシュ内では1バイトアドレスであり、ワードアドレスではありません。
#define boot_page_erase_safe (   address )
Value:
do { \
    boot_spm_busy_wait();                       \
    eeprom_busy_wait();                         \
    boot_page_erase (address);                  \
} while (0)

ページを消去する前に、EEPROMとSPM演算が完了するのを待つ以外は、boot_page_erase()と同様です。

#define boot_page_fill (   address,
  data 
)    __boot_page_fill_normal(address, data)

データワードで、フラッシュアドレスのブートローダの一時ページバッファを埋めます。

注釈:
アドレスは、1バイトのアドレスです。データは、ワード(2バイト)です。AVRは、バッファへのデータ書込みは、一度にワードです。しかし、バッファのアドレスはバイト単位です!そして、アドレスは呼び出すごとに2倍で増加させ、ワードフォーマットの2データバイトを送ってください!データのLSBは、下のアドレスに書かれ、データのMSBは高いアドレスに書かれます。
#define boot_page_fill_safe (   address,
  data 
)
Value:
do { \
    boot_spm_busy_wait();                       \
    eeprom_busy_wait();                         \
    boot_page_fill(address, data);              \
} while (0)

ページを埋める前に、EEPROMとSPM演算が完了するのを待つ以外は、boot_page_fill()同様です。

#define boot_page_write (   address )    __boot_page_write_normal(address)

アドレスに含まれるフラッシュページのブートローダ一時ページバッファに書き込む

注釈:
アドレスは、フラッシュ内では1バイトアドレスであり、ワードアドレスではありません。
#define boot_page_write_safe (   address )
Value:
do { \
    boot_spm_busy_wait();                       \
    eeprom_busy_wait();                         \
    boot_page_write (address);                  \
} while (0)

ページを書き込む前に、EEPROMとSPM演算が完了するのを待つ以外は、boot_page_write()と同様です。

#define boot_rww_busy (  )    (__SPM_REG & (uint8_t)_BV(__COMMON_ASB))

RWWセクションがビジーかチェック

#define boot_rww_enable (  )    __boot_rww_enable()

Read-While-Writeメモリセクションを許可する

#define boot_rww_enable_safe (  )
Value:
do { \
    boot_spm_busy_wait();                       \
    eeprom_busy_wait();                         \
    boot_rww_enable();                          \
} while (0)

RWWメモリを許可される前に、EEPROMとSPM演算が完了するのを待つ以外は、boot_rww_enable()と同様です。

#define boot_signature_byte_get (   addr )
Value:
(__extension__({                      \
      uint8_t __result;                         \
      __asm__ __volatile__                      \
      (                                         \
        "sts %1, %2\n\t"                        \
        "lpm %0, Z" "\n\t"                      \
        : "=r" (__result)                       \
        : "i" (_SFR_MEM_ADDR(__SPM_REG)),       \
          "r" ((uint8_t)(__BOOT_SIGROW_READ)),  \
          "z" ((uint16_t)(addr))                \
      );                                        \
      __result;                                 \
}))

addressのシグネチャRowバイトを読出し。いくつかのMCUタイプに対しては、この関数は、出荷時設定された発信器校正バイトを取り出すことができる。

addressパラメータは、データシートに定義されている 0-0x1f が可能です。

注釈:
この値は、MCUタイプに依存します。
#define boot_spm_busy (  )    (__SPM_REG & (uint8_t)_BV(__SPM_ENABLE))

SPM命令がビジーかチェック

#define boot_spm_busy_wait (  )    do{}while(boot_spm_busy())

SPM命令ビジー中停止する

#define boot_spm_interrupt_disable (  )    (__SPM_REG &= (uint8_t)~_BV(SPMIE))

SPM割込み不許可にする

#define boot_spm_interrupt_enable (  )    (__SPM_REG |= (uint8_t)_BV(SPMIE))

SPM割込みを許可する

#define BOOTLOADER_SECTION   __attribute__ ((section (".bootloader")))

.bootloaderと呼ばれる新しいセクション内に、関数または変数を宣言するのに用います。このセクションとその内容は、リンク時において別のアドレス(例えばブートローダNRWWエリア)に再配置することができます。

#define GET_EXTENDED_FUSE_BITS   (0x0002)

boot_lock_fuse_bits_getを使い、拡張ヒューズビットを読み出すためのアドレス

#define GET_HIGH_FUSE_BITS   (0x0003)

boot_lock_fuse_bits_getを使い、上位ヒューズビットを読み出すためのアドレス

#define GET_LOCK_BITS   (0x0001)

boot_lock_fuse_bits_getを使い、ロックビットを読み出すためのアドレス

#define GET_LOW_FUSE_BITS   (0x0000)

boot_lock_fuse_bits_getを使い、下位ヒューズビットを読み出すためのアドレス


Automatically generated by Doxygen 1.7.2 on Wed Feb 16 2011.

翻訳更新:2012年02月10日 by cega