source: asp3_wo_tecs/trunk/arch/arm_gcc/doc/rza1_memo.txt@ 306

Last change on this file since 306 was 306, checked in by ertl-honda, 7 years ago

3.1.0を反映

File size: 9.7 KB
Line 
1
2 TOPPERSプロジェクト 設計メモ
3 ルネサス RZ/AおよびGR-PEACHに関するメモ
4
5 作成者
6: 高田広章(名古屋大学)
7 最終更新: 2016年3月21日
8
9○メモの位置づけ
10
11このメモは,ルネサス RZ/Aと,それを用いたボードであるGR-PEACHに関して,
12TOPPERSカーネルをポーティングするにあたって必
13要となる事項
14をまとめたもの
15である.
16
17○目次
18
19・参考文献
20・RZ/Aとは?
21・RZ/A1チップ依存部
22
23○参考文献
24
25[1] RZ/A1Hグループ,RZ/A1Mグループ ユーザーズマニュアル ハードウェア編
26Rev.2.00 2015.05
27r01uh0403jj0200_rz_a1h.pdf
28
29[2] RZ/A1Lグループ ユーザーズマニュアル ハードウェア編
30Rev.2.00 2015.05
31r01uh0437jj0200_rz_a1l.pdf
32
33○RZ/Aシリーズとは?
34
35RZ/Aシリーズとは,ARM Cortex-A9コアを搭載したルネサスの一連のマイコンの
36総称で,現時点で以下の4つのチップがある.
37
38・RZ/A1L
39・RZ/A1LU
40・RZ/A1M
41・RZ/A1H
42
43これらはいずれも,動作周波数400MHzのARM Cortex-A9コアを1つ搭載している
44が,搭載するRAM容量や周辺デバイスに違いがある.
45
46○RZ/A1チップ依存部
47
48TOPPERS/ASP3カーネルでは,上の4つのチップをRZ/A1と総称し(今後,RZ/A2x
49が出てくると想像し,RZ/A1と称している),そのå…
50±é€šéƒ¨ã‚’arch/arm_gcc/rza1
51ディレクトリに置くことにする.ただし,現時点で4つのチップすべてに対応で
52きているわけではない.
53
54○コア
55
56・ARM Cortex-A9 MPCore × 1コア(Revision: r3p0)
57 命令キャッシュ:32KB
58 データキャッシュ:32KB
59 TLBエントリ:128
60 Jazelle,メディアプロセッシングエンジン,FPU,PTMインタフェース
61 内
62蔵の割込みコントローラは使用しない
63 プライベートメモリ領域のベースアドレス:0xf0000000
64
65・内
66蔵のタイマは実装
67されている模様だが,割込みをかけることができない
68
69○割込みコントローラ
70
71・コア外に割込みコントローラを搭載
72・ARM PrimeCell Generic Interrupt Controller(PL390)
73 - ARM GICアーキテクチャ仕様 バージョン1に対応
74・割込み優å…
75ˆé †ä½ï¼š32レベル設定可能
76
77・レジスタの番地
78| 0xfcfef800 ICR0 割込みコントロールレジスタ0
79| 0xfcfef802 ICR1 割込みコントロールレジスタ1
80| 0xfcfef804 IRQRR IRQ割込み要求レジスタ
81
82 0xe8201000 ICDDCR 分é…
83å™¨åˆ¶å¾¡ãƒ¬ã‚¸ã‚¹ã‚¿
84 → ディストリビュータ制御レジスタ(GICD_CTLR)
85 ……
86 ※ 割込みアクティブセットレジスタは,割込みアクティブビットレジスタ
87 ※ 割込みアクティブクリアレジスタは無い
88| 0xe8201d00 ppi_status PPIステータスレジスタ
89| 0xe8201d04 spi_status0 SPIステータスレジスタ0
90| ……
91| 0xe8201d44 spi_status16 SPIステータスレジスタ16
92 0xe8201f00 ICDSGIR ソフトウェア生成割込みレジスタ
93
94 0xe8202000 ICCICR CPUインタフェース制御レジスタ
95 → CPUインタフェース制御レジスタ(GICC_CTLR)
96 ……
97
98 割込みコントロールレジスタ0(ICR0)
99 - NMIå…
100¥åŠ›ãƒ¬ãƒ™ãƒ«ã®èª­ã¿å‡ºã—
101 - NMIエッジセレクトの設定/読み出し
102 - NMI割込み要求の読み出し/クリア
103
104 割込みコントロールレジスタ1(ICR1)
105 - IRQ7〜IRQ0に対して,ローレベル,立ち下がりエッジ,立ち上がりエッ
106 ジ,両エッジの設定/読み出し
107 → IRQ割込みトリガ設定はこのレジスタで行い,GIC側はレベルに設定する
108
109 IRQ割込み要求レジスタ(IRQRR)
110 - IRQ7〜IRQ0の割込み要求の読み出し/クリア
111
112・割込み要因と割込みID
113 - NMI割込み … CPUにFIQで通知
114 - IRQ割込み
115 - 内
116蔵周辺モジュール割込み
117 - 端子割込み
118
119・IRQ割込みと内
120蔵周辺モジュール割込みに対して,割込みコンフィギュレーショ
121 ンレジスタ(GICD_ICFGRn)を指定された値に初期化する.
122 → gic_kernel_impl.cにフックをå…
123¥ã‚Œã‚‹ã“とが必
124要
125 → 一括して初期化しなくても正しく動いている
126
127○シリアルインタフェース
128
129・RZ/A1は,FIFO内
130蔵シリアルコミュニケーションインタフェースを持つ
131 RZ/A1H:8ポート
132 RZ/A1L:5ポート
133
134・ポート毎のレジスタ
135 SCSMR シリアルモードレジスタ オフセット:0x00 16ビット
136 SCBRR ビットレートレジスタ オフセット:0x04 8ビット
137 SCSCR シリアルコントロールレジスタ オフセット:0x08 16ビット
138 SCFTDR 送信FIFOデータレジスタ オフセット:0x0C 8ビット
139 SCFSR シリアルステータスレジスタ オフセット:0x10 16ビット
140 SCFRDR 受信FIFOデータレジスタ オフセット:0x14 8ビット
141 SCFCR FIFOコントロールレジスタ オフセット:0x18 16ビット
142 SCFDR FIFOデータカウントレジスタ オフセット:0x1C 16ビット
143 SCSPTR シリアルポートレジスタ オフセット:0x20 16ビット
144 SCLSR ラインステータスレジスタ オフセット:0x24 16ビット
145 SCEMR シリアル拡張モードレジスタ オフセット:0x28 16ビット
146
147○OSタイマ
148
149・2チャンネルのOSタイマを持つ
150 - 32ビットタイマ
151・2つの動作モード
152・P0φで駆動
153 - P0φは33.33MHz(最大)
154 - ユーザーズマニュアルには33.33MHzと表記されているが,400MHzの12分
155 周なので,実際には,33.333333…MHzと思われる
156
157・インターバルタイマモード
158 - 一定間隔で割込みを発生させる場合に使用
159 - 指定値から0までダウンカウント(周期は,指定値+1)
160 - 0から指定値に戻る時に割込みが発生
161
162 - 指定値を変更すると,次に戻る時に反映
163 - すぐに指定値を反映させることも可能
164
165 - カウント開始時に割込みを発生させる機能がある(使途が不明)
166 - 0になった後にカウントを止めるモードはない(ワンショットはできない)
167
168・フリーランニングコンペアモード
169 - 0x00000000から0xffffffffまでカウントアップ
170 - 指定値になったら,割込みが発生
171
172 - 指定値の設定時に,指定値を過ぎていた場合の対策が課題
173 → 読み込んで,指定値を過ぎていたら,GICを操作して割込み要求を出す
174
175・チャネル毎のレジスタ
176 OSTMnCMP コンペアレジスタ オフセット:0x00 RW 32ビット
177 →「指定値」を設定
178 OSTMnCNT カウントレジスタ オフセット:0x04 R 32ビット
179 OSTMnTE カウントイネーブルステータスレジスタ 0x10 R 8ビット
180 OSTMnTS カウント開始トリガレジスタ オフセット:0x14 W 8ビット
181 OSTMnTT カウント停止トリガレジスタ オフセット:0x18 W 8ビット
182 OSTMnCTL 制御レジスタ オフセット:0x20 RW 8ビット
183 → 動作モードとカウント開始時の割込みの有無を設定
184
185・33.33…MHzのクロックでうまくいくか?
186 - タイマが巡回する周期を求める
187 2^32(= 4,294,967,296)/33.33…
188 = 2^32(= 4,294,967,296)*3/100
189 = 128,849,018.88μs(約2分)
190 → これを 128,849,019μs と丸めるのは許容範囲
191 この誤差は,水晶発振子の精度よりも小さい
192
193 - カウンタ値 * 3 / 100 をμs単位の時刻とすると
194
195 カウンタ値 μs単位時刻(カウンタ値 * 3 / 100)
196 0〜33 [34] 0
197 34〜66 [33] 1
198 67〜99 [33] 2
199 100〜133 [34] 3
200 … …
201 4294967200〜4294967233 [34] 128,849,016
202 4294967234〜4294967266 [33] 128,849,017
203 4294967267〜4294967295 [29] 128,849,018
204 → 最後だけ間隔が29になる
205 → かつ,long longでの計算が必
206要
207
208 - (x / 4 + x / 4000000000) * 3 / 25 をμs単位の時刻とすると
209 where x = カウンタ値
210 カウンタ値 μs単位時刻(カウンタ値 * 3 / 100)
211 0〜35 [36] 0
212 36〜67 [32] 1
213 68〜99 [32] 2
214 100〜135 [36] 3
215 136〜167 [32] 4
216 168〜199 [32] 5
217 … …
218 3999999900〜3999999935 [36] 119999997
219 3999999936〜3999999967 [32] 119999998
220 3999999968〜3999999999 [32] 119999999
221 4000000000〜4000000031 [32] 120000000 … ここが32になる
222 4000000032〜4000000063 [32] 120000001
223 4000000064〜4000000095 [32] 120000002
224 … …
225 4294967196〜4294967231 [36] 128849016
226 4294967232〜4294967263 [32] 128849017
227 4294967264〜4294967295 [32] 128849018 … 最後も32が維持される
228 ※ 32と36の間でばらつくのは,4で割っているのでやむをえない
229
230 - y = (x - z * 999999999) * 3 / 100 + z * 30000000 をμs単位の時刻とすると
231 where x = カウンタ値, z = x / 1000000000
232 すべての間隔が33か34のいずれかに落ち着く
233
234----------------------------------------------------------------------
235#!/usr/bin/env ruby
236# -*- coding: utf-8 -*-
237
238def calc(x)
239# y = (x / 4 + x / 4000000000) * 3 / 25
240 z = x / 1000000000
241 y = (x - z * 999999999) * 3 / 100 + z * 30000000
242 return(y)
243end
244
245xx = yy = -1
2460.upto(200).each do |x|
247 y = calc(x)
248 if (y != yy)
249 if yy >= 0
250 puts(sprintf("%d - %d [%d] ... %d", xx, x-1, x - xx, yy))
251 end
252 yy = y
253 xx = x
254 end
255end
256
257xx = yy = -1
2583999999800.upto(4000000200).each do |x|
259 y = calc(x)
260 if (y != yy)
261 if yy >= 0
262 puts(sprintf("%d - %d [%d] ... %d", xx, x-1, x - xx, yy))
263 end
264 yy = y
265 xx = x
266 end
267end
268
269xl = xx = yy = -1
2704294967100.upto(4294967295).each do |x|
271 y = calc(x)
272 if (y != yy)
273 if yy >= 0
274 puts(sprintf("%d - %d [%d] ... %d", xx, x-1, x - xx, yy))
275 end
276 yy = y
277 xx = x
278 end
279 xl = x
280end
281puts(sprintf("%d - %d [%d] ... %d", xx, xl, xl + 1 - xx, yy))
282----------------------------------------------------------------------
283
284以上
Note: See TracBrowser for help on using the repository browser.