bootloaderのプロテクト anchor.png

ATMEL AVRには,Flash ROMに書き込んだプログラムやEEPROMを保護するためにその設定が行えるロックビットがあります。
このロックビットを操作することによって,プログラム領域,EEPROM領域,ブートローダー領域に対して,読み書きの保護(プロテクト)をすることが出来る。

もしこのロックビットの設定によりフラッシュ領域などの書き込みをプロテクトした場合,再度プログラムすることが出来なくなる。
この場合は,デバイスを消去することによりロックビットやプログラム領域をもとに戻すことで,再プログラミング出来るようになる。

Page Top

ロックビットの仕様 anchor.png

ロックビットの詳細はAVRデバイスのデータシートを参照する。

ATmega328/ATmega328Pのロックビットは以下のようになっている。

名称bit内容既定値
-70
-60
BLB125ブートローダー領域保護bit1
BLB1141
BLB023応用領域保護bit1
BLB0121
LB21Flash ROMとEEPROMに対する保護用bit1
LB101


LB種別LB2LB1内容
111機能なし
210Flash ROM, EEPROMの書き込みプロテクト。FUSE Bit固定される。
300Flash ROM, EEPROMの書き込み・読み出しプロテクト。FUSE Bitとロックビットが固定される


LB0種別BLB02BLB01内容
111LPM, SPM命令が応用領域をアクセスすることに対してプロテクトなし。
210応用領域へのSPM命令はプロテクト。
300応用領域へのSPM命令はプロテクト。ブートローダー領域のLPM命令による応用領域からの読み込みがプロテクト。
401ブートローダー領域でのLPM命令による応用領域からの読み込みが制限される。


LB1種別BLB12BLB11内容
111LPM,SPM命令がブートローダー領域をアクセスすることに対してプロテクトなし。
210SPM命令によるブートローダー領域に書き込むことがプロテクトされる。
300SPM命令によるブートローダー領域に書き込むことがプロテクトされる。応用領域でのLPM命令によるブートローダー領域の読み込みがプロテクトされる。
401応用領域でのLPM命令によるブートローダー領域からの読み込みがプロテクトされる。
Page Top

ロックビットを使ってFlash ROMの読み書きを禁止する手順 anchor.png

ロックビットを操作するために,なんらかのAVR Writerを用意する。
用意したAVR WriterとターゲットのボードのISPコネクタを接続する。(ターゲットボードに書き込まれているbootloaderではロックビットの操作はできない。)

avrdudeを使用して接続ができているか確認する(COMポートなどは環境に合わせる)。

> avrdude -c stk500v2 -P COM1 -b 115200 -p m328
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.09s
avrdude.exe: Device signature = 0x1e9514 (probably m328)
avrdude.exe: safemode: Fuses OK (E:FD, H:D8, L:C2)
avrdude.exe done.  Thank you.

FUSEの現在の設定が表示される。

ロックビットの状態を確認してみる。

> avrdude -c stk500v2 -P COM1 -b 115200 -p m328 -U lock:r:con:h
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.07s
avrdude.exe: Device signature = 0x1e9514 (probably m328)
avrdude.exe: reading lock memory:
Reading | ################################################## | 100% 0.01s
avrdude.exe: writing output file "con"
0x2f
avrdude.exe: safemode: Fuses OK (E:FD, H:D8, L:C2)
avrdude.exe done.  Thank you.

この場合ロックビットは0x2fに設定されていて,ブートローダー領域への書き込みがプロテクトされている。
デフォルト状態ではロックビットは0x3fで,なんのプロテクトもかかっていない。

Flash ROMを読んでファイルに書き出してみる。

> avrdude -c stk500v2 -P COM1 -b 115200 -p m328 -U flash:r:"program.hex":i
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.03s
avrdude.exe: Device signature = 0x1e9514 (probably m328)
avrdude.exe: reading flash memory:
Reading | ################################################## | 100% 19.98s
avrdude.exe: writing output file "program.hex"
avrdude.exe: safemode: Fuses OK (E:FD, H:D8, L:C2)
avrdude.exe done.  Thank you.

うまく書き出せている。(読み込みはプロテクトされていない。)

ロックビットを0x00(全領域書き込みも読み込みもプロテクト)に書き換えてみる。

> avrdude.exe -c stk500v2 -P COM1 -b 115200 -p m328 -U lock:w:0x00:m
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.03s
avrdude.exe: Device signature = 0x1e9514 (probably m328)
avrdude.exe: reading input file "0x00"
avrdude.exe: writing lock (1 bytes):
Writing | ################################################## | 100% 0.03s
avrdude.exe: 1 bytes of lock written
avrdude.exe: verifying lock memory against 0x00:
avrdude.exe: load data lock data from input file 0x00:
avrdude.exe: input file 0x00 contains 1 bytes
avrdude.exe: reading on-chip lock data:
Reading | ################################################## | 100% 0.01s
avrdude.exe: verifying ...
avrdude.exe: 1 bytes of lock verified
avrdude.exe: safemode: Fuses OK (E:FD, H:D8, L:C2)
avrdude.exe done.  Thank you.

Flash ROMを再度読んで書き出してみる。

> avrdude.exe -c stk500v2 -P COM1 -b 115200 -p m328 -U flash:r:"program2.hex":i
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.03s
avrdude.exe: Device signature = 0x1e9514 (probably m328)
avrdude.exe: reading flash memory:
Reading | ################################################## | 100% 19.94s
avrdude.exe: Flash is empty, resulting file has no contents.
avrdude.exe: writing output file "program2.hex"
avrdude.exe: safemode: Fuses OK (E:FD, H:D8, L:C2)
avrdude.exe done.  Thank you.

program2.hexはファイルサイズが小さく,読み出しが出来ていない。

Page Top

再度プログラムの読み書きが出来るようにする anchor.png

ロックビットを操作してプロテクトされている状態を解除するには,AVRデバイスをチップ消去する必要がある。

Page Top

Arduino IDEを使う場合 anchor.png

Arduino IDEを使って「ブートローダーを書き込む」作業を行うと,チップ消去を実行した後にブートローダーが書き込まれる。
Arduino IDEを使う場合でも,なんらかのAVR Writerを使用する。

Page Top

avrdudeを使ってチップ消去を行う anchor.png

avrdudeでチップ消去を行うには,-eオプションを使う。

接続する。

> avrdude -c stk500v2 -P COM1 -b 115200 -p m328
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.09s
avrdude.exe: Device signature = 0x1e9514 (probably m328)
avrdude.exe: safemode: Fuses OK (E:FD, H:D8, L:C2)
avrdude.exe done.  Thank you.

FUSEの現在の設定が表示される。

  • eオプションを使ってチップ消去する。
    > avrdude.exe -c stk500v2 -P COM1 -b 115200 -p m328 -e
    avrdude.exe: AVR device initialized and ready to accept instructions
    Reading | ################################################## | 100% 0.03s
    avrdude.exe: Device signature = 0x1e9514 (probably m328)
    avrdude.exe: erasing chip
    avrdude.exe: safemode: Fuses OK (E:FD, H:D8, L:C2)
    avrdude.exe done.  Thank you.

ロックビットを確認する。

> avrdude.exe -c stk500v2 -P COM1 -b 115200 -p m328 -U lock:r:con:h
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.03s
avrdude.exe: Device signature = 0x1e9514 (probably m328)
avrdude.exe: reading lock memory:
Reading | ################################################## | 100% 0.01s
avrdude.exe: writing output file "con"
0x3f
avrdude.exe: safemode: Fuses OK (E:FD, H:D8, L:C2)
avrdude.exe done.  Thank you.

これでチップ消去された。ロックビットがデフォルトの0x3fに戻っている。


新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 238, today: 2, yesterday: 1
最終更新: 2022-10-19 (水) 11:00:30 (JST) (527d) by yuji