回答編集履歴

1

いろいろ追記

2021/07/10 14:11

投稿

thkana
thkana

スコア7703

test CHANGED
@@ -9,3 +9,71 @@
9
9
 
10
10
 
11
11
  (Dueは持ってないのであまり深入りする気もないけれど)
12
+
13
+
14
+
15
+ ---
16
+
17
+ なんやかんやでDueを入手してしまったので確かめてみました。
18
+
19
+ EEFC0について(これってどうにも16進文字列に見えちゃうけど、Enhanced Embedded Flash Controller Zero なんですね)
20
+
21
+ データシート18.4.3.7より、GPNVMのbit0に1を立てればセキュリティ保護が有効になることがわかります。
22
+
23
+ データシート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を付けなければいけませんから、結局
24
+
25
+ *(int*)0x400e0a04=0x5a00000b;
26
+
27
+ とすれば保護モードに入ることがわかります。
28
+
29
+ なお、書き込み手順として18.4.3(Figure18-5)にEEFC_FSR(0x400e0a08)のFRDY(bit0)を見てから書くようになっています。
30
+
31
+ ので、
32
+
33
+ ```Arduino
34
+
35
+ #define EEFC_FSR (*(int*)0x400e0a08)
36
+
37
+ #define EEFC_FCR (*(int*)0x400e0a04)
38
+
39
+ #define SETGPNVM (0x0b)
40
+
41
+ #define FLASHKEY (0x5a000000)
42
+
43
+
44
+
45
+ void setSecurity() {
46
+
47
+ int fsr;
48
+
49
+ do {
50
+
51
+ fsr = EEFC_FSR;
52
+
53
+ } while (!(fsr & 1));
54
+
55
+ EEFC_FCR = FLASHKEY | (0) << 18 | SETGPNVM;
56
+
57
+ }
58
+
59
+ ```
60
+
61
+ というところでしょう。
62
+
63
+
64
+
65
+ これを走らせた後、Atmel Studio + Atmel ICEで見ると...というより見ようとすると、デバイスを検出できないのでちゃんとSecurity保護が効いているようです。ERASEを押しながらリセットするとデバイス検出可能になります(もちろんオールERASEされています)。
66
+
67
+
68
+
69
+ Arduino IDEから通常通りスケッチを書き込んだ時点ではSecurity保護は有効になっていませんでした(Atmel ICEが繋がりました)。
70
+
71
+
72
+
73
+ Arduino IDEからの書き込み時はALL ERASEされるので、Security保護がかかっていても全部消去/上書きされます。
74
+
75
+
76
+
77
+ bossacでの書き込み時は、先にbaudrateを1200にしておかないと接続できません(Windowsであれば先にmode comXX baud=1200)。Arduinoではボーレートを1200bpsにするとリセット、というのがよく使われて、Dueもそうなっています。しかし、接続のためのリセットで同時にいきなりALL ERASEがかかってしまう模様...つまりArduino Due + bossacではそもそもFlushの読み出しはできない、ということですね(JTAGやSWDを使えば読めますけれど)。
78
+
79
+ しかし、Teratermとかで繋いで1200bpsに設定するといきなりERASEってのはちょっと考えものだけどねぇ...