質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

3回答

1135閲覧

Dueにスケッチアップロードするとセキュリティビットが有効になるのか

Alyn

総合スコア51

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/06/30 07:06

編集2021/07/01 12:10

Arduino DueのMicrocontroller「AT91SAM3X8E」のセキュリティ・ビットを有効にすればフラッシュメモリの読み書きを禁止にできるそうです。

そのセキュリティ・ビットを有効にするにはEEFC0ユーザーインターフェースの「Set General Purpose NVM Bit 0」コマンドを使用して行うそうです。

しかしそのEEFC0ユーザーインターフェースとはソフトウェアなのかハードウェアなのか、そしてその使い方を調べても分かりませんでした。

~~EEFC0の使い方を教えてください。
~~
【EEFC】
Enhanced Embedded Flash Controller

【データシート】
https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-11057-32-bit-Cortex-M3-Microcontroller-SAM3X-SAM3A_Datasheet.pdf

追記1
bossac.exeを使ってbinファイルを書き込み時に-lと-sを追加することで恐らく一応フラッシュメモリをロックすることができたのですが、新しくソフトウェアを書き込む時にERASEするため本当にロックできているのかが分かりません。

ソフトウェア書き込み後に-rで読み出そうとすると「No device found COMxx」となるため読み出しができず、読み出しができるようになるにはERASEでフラッシュメモリのクリアをしてからでないとできませんでした。

追記2
Arduino IDEからArduino Dueにスケッチをアップロードするとセキュリティビットが有効になっているような挙動(追記1)をするのですが、それを確かめる方法が分かりません。

セキュリティビットがフラッシュメモリのどこのアドレスにあるのか教えてください。
データシートを読んだのですが、分かりませんでした。
以下のアドレスにいるような気がするのですが、どのビット位置にいるかが分かりませんでした。

Name: EEFC_FCR
Address: 0x400E0A04

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

スケッチをアップロードだけではセキュリティビットは有効にはなっていない可能性が非常に高いことがわかりました。
しかしスケッチをアップロードするとセキュリティを有効&リセット後の挙動をするのかは分かりませんでした。

セキュリティを有効にするには書き込む際に表示される、

bossac.exeから続く構文に「-l -s」を追加すれば「Set security」、「Lock all regions」と出るので有効にできるのではないかと思います。

投稿2021/07/02 06:11

編集2021/07/10 14:26
Alyn

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

データシートの7.1 にアドレス空間の表があって、
EFFC0はそのなかにマッピングされているように見えますが、どう思いますか?

あとは18章19章あたり?

(Dueは持ってないのであまり深入りする気もないけれど)


なんやかんやでDueを入手してしまったので確かめてみました。
EEFC0について(これってどうにも16進文字列に見えちゃうけど、Enhanced Embedded Flash Controller Zero なんですね)
データシート18.4.3.7より、GPNVMのbit0に1を立てればセキュリティ保護が有効になることがわかります。
データシート18.4.3.5より、GPNVMへの書き込みは、EEFC_FCR(Flash Command Register)にSGPBコマンドを書き込めばいいことがわかります。EEFC0_FCRは18.5.2 より0x400E0A04、SGPBコマンドは18.3.3より0x0b。ビット0をセットするので、FARG=0。この他に、FCRに書き込むときにはFKEYを付けなければいけませんから、結局
(int)0x400e0a04=0x5a00000b;
とすれば保護モードに入ることがわかります。
なお、書き込み手順として18.4.3(Figure18-5)にEEFC_FSR(0x400e0a08)のFRDY(bit0)を見てから書くようになっています。
ので、

Arduino

1#define EEFC_FSR (*(int*)0x400e0a08) 2#define EEFC_FCR (*(int*)0x400e0a04) 3#define SETGPNVM (0x0b) 4#define FLASHKEY (0x5a000000) 5 6void setSecurity() { 7 int fsr; 8 do { 9 fsr = EEFC_FSR; 10 } while (!(fsr & 1)); 11 EEFC_FCR = FLASHKEY | (0) << 18 | SETGPNVM; 12}

というところでしょう。

これを走らせた後、Atmel Studio + Atmel ICEで見ると...というより見ようとすると、デバイスを検出できないのでちゃんとSecurity保護が効いているようです。ERASEを押しながらリセットするとデバイス検出可能になります(もちろんオールERASEされています)。

Arduino IDEから通常通りスケッチを書き込んだ時点ではSecurity保護は有効になっていませんでした(Atmel ICEが繋がりました)。

Arduino IDEからの書き込み時はALL ERASEされるので、Security保護がかかっていても全部消去/上書きされます。

bossacでの書き込み時は、先にbaudrateを1200にしておかないと接続できません(Windowsであれば先にmode comXX baud=1200)。Arduinoではボーレートを1200bpsにするとリセット、というのがよく使われて、Dueもそうなっています。しかし、接続のためのリセットで同時にいきなりALL ERASEがかかってしまう模様...つまりArduino Due + bossacではそもそもFlushの読み出しはできない、ということですね(JTAGやSWDを使えば読めますけれど)。
しかし、Teratermとかで繋いで1200bpsに設定するといきなりERASEってのはちょっと考えものだけどねぇ...

投稿2021/06/30 12:02

編集2021/07/10 14:11
thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Alyn

2021/07/10 14:24 編集

ありがとうございます。シリアル1200bpsにするとリセットだけでなくERASEもされていたのですね。だからセキュリティが効かないような挙動になったのですね。 「Arduino Due + bossacではそもそもFlushの読み出しはできない」とはどういうことでしょうか? 確かにセキュリティを入れずにスケッチを書き込んだ場合でも(bossac.exeからでは)デバイスを検出できなくなりますが、その理由は全く分かりませんでした。
thkana

2021/07/10 14:27

> 読み出しはできない bossacを繋ぐためにリセットした途端にERASEが掛かるわけです。まぁ、正確にいえばERASE後のデータが読めるわけですけれど(全部0xffかな)、意味ないです。 > 確かにセキュリティを入れずにスケッチを書き込んだ場合でもデバイスを検出できなくなります ちゃんと解析したわけじゃないですが、多分即スケッチ分のプログラムが走りはじめてしまってboassaの接続ができないのでしょう。
Alyn

2021/07/10 16:25

>多分即スケッチ分のプログラムが走りはじめてしまってboassaの接続ができないのでしょう。 なるほど!とても納得がいきました。ありがとうございます!
guest

0

その手のセキュリティビットというのは、誤操作や誤動作では簡単に書き換わらないように、特定の書き込み手順で書き換えるようになってます

そのCPU用のデバッガ(装置ね)を持ってきて書き換える、あるいは専用の書き込み機を制作して書き込む、ということをする必要があります。

投稿2021/06/30 07:15

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/06/30 07:16

まあ、人にそれを尋ねる、というレベルでは、あんましそういうのはいじらないほうがよろしいかと。
Alyn

2021/06/30 07:19 編集

回答ありがとうございます。やらなければならない事情がありまして…。ちなみにそれはPCとArduino DueのUSBポートの2つのうちのどちらかに接続すれば書き換えることはできますでしょうか。それともavrdudeのように別のマイコンを介してSPIで接続するのでしょうか
y_waiwai

2021/06/30 07:24

そのいずれでも無理です。 あなたの提示したデータシートに、それのアクセス手順が書いてありますんで翻訳でもして読んでみよう
Alyn

2021/06/30 08:03

Arduino Dueでは物理的不可能なのでしょうか?Pinが複数あったり、ICSPやJTAG、USBにDEBUGと書かれたポートと色々ついてますが。セキュリティビットの解除に使うERASEピンはスイッチ付きでボードにありました
y_waiwai

2021/06/30 08:07

データシートのアクセス手順を読んで頑張ってみてください ここんところがこう書いてるけどどうやればいいか、とかの具体的な質問ならお答えできるかと思います
Alyn

2021/06/30 08:25

データシートを読みましたが接続構成の記載が見当たらないため、どうやってコマンドを送るのか分かりませんでした。アクセス手順とはどこに記載してましたか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問