回答編集履歴
1
いろいろ追記
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ってのはちょっと考えものだけどねぇ...
|