source: azure_iot_hub_f767zi/trunk/asp_baseplatform/monitor/arch/armv4.c@ 457

Last change on this file since 457 was 457, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 9.6 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2003-2008 by Ryosuke Takeuchi
7 * GJ Business Division RICOH COMPANY,LTD. JAPAN
8 *
9 * 上記著作権者は,Free Software Foundation によって公表されている
10 * GNU General Public License の Version 2 に記述されている条件か,以
11 * 下の(1)~(4)の条件を満たす場合に限り,本ソフトウェア(本ソフトウェ
12 * アを改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
13 * 利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを再利用可能なバイナリコード(リロケータブルオブ
18 * ジェクトファイルやライブラリなど)の形で利用する場合には,利用
19 * に伴うドキュメント(利用者マニュアルなど)に,上記の著作権表示,
20 * この利用条件および下記の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを再利用不可能なバイナリコードの形または機器に組
22 * み込んだ形で利用する場合には,次のいずれかの条件を満たすこと.
23 * (a) 利用に伴うドキュメント(利用者マニュアルなど)に,上記の著作
24 * 権表示,この利用条件および下記の無保証規定を掲載すること.
25 * (b) 利用の形態を,別に定める方法によって,上記著作権者に報告する
26 * こと.
27 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
28 * 害からも,上記著作権者を免責すること.
29 *
30 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者は,
31 * 本ソフトウェアに関して,その適用可能性も含めて,いかなる保証も行わ
32 * ない.また,本ソフトウェアの利用により直接的または間接的に生じたい
33 * かなる損害に関しても,その責任を負わない.
34 *
35 * @(#) $Id$
36 */
37
38/*
39 * TOPPERS/ASP用タスクモニタCPU依存プログラム.
40 *
41 */
42
43#include <itron.h>
44#include <sil.h>
45#include <stdio.h>
46#include "kernel_impl.h"
47#include "task.h"
48#include "task_expansion.h"
49#include "monitor.h"
50
51extern void _kernel_break_wait();
52
53#define set_align(a, b) ((ulong_t)a & ~(b-1))
54
55/*
56 * レジスタの構造体
57 */
58typedef struct t_reg{
59 uint32_t r4;
60 uint32_t r5;
61 uint32_t r6;
62 uint32_t r7;
63 uint32_t r8;
64 uint32_t r9;
65 uint32_t r10;
66 uint32_t r11;
67 uint32_t spsr;
68 uint32_t r0;
69 uint32_t r1;
70 uint32_t r2;
71 uint32_t r3;
72 uint32_t ip;
73 uint32_t lr;
74 uint32_t pc;
75}T_REG;
76
77/*
78 * メモリのマッピング定義構造体
79 */
80
81typedef struct t_memdef{
82 uint32_t mstart;
83 uint32_t mend;
84 uint8_t mtype;
85 uint8_t mstate;
86}T_MEMDEF;
87
88/*
89 * ARM4のメモリマッピング
90 */
91
92static T_MEMDEF const memdefine[] = {
93#if defined(__AT91SAM7S128__)
94 {0x00000000, 0x0001FFFF, MEMORY_AREA, MREAD_ONLY },
95 {RAM_START, RAM_START+RAM_SIZE-1, MEMORY_AREA, MREAD_WRITE},
96 {0xFFFF0000, 0xFFFFFFFF, PORT_AREA, MREAD_WRITE}
97#elif defined(MINDSTORMSNXT)
98 {0x00000000, RAM_SIZE-1, MEMORY_AREA, MREAD_ONLY },
99 {0x001C0000, 0x001FFFFF, MEMORY_AREA, MREAD_ONLY },
100 {RAM_START, RAM_START+RAM_SIZE-1, MEMORY_AREA, MREAD_WRITE},
101 {0xFFFF0000, 0xFFFFFFFF, PORT_AREA, MREAD_WRITE}
102#elif defined(__LPC2388__)
103 {0x00000000, 0x0007FFFF, MEMORY_AREA, MREAD_ONLY },
104 {0x3FFFC000, 0x3FFFFFFF, PORT_AREA, MREAD_WRITE},
105 {RAM_START, RAM_START+RAM_SIZE-1, MEMORY_AREA, MREAD_WRITE},
106 {0x80000000, 0x8000FFFF, MEMORY_AREA, MREAD_ONLY },
107 {0x81000000, 0x8100FFFF, MEMORY_AREA, MREAD_ONLY },
108 {0xE0000000, 0xE008FFFF, PORT_AREA, MREAD_WRITE},
109 {0xE01FC000, 0xE01FFFFF, PORT_AREA, MREAD_WRITE},
110 {0xFFEF0000, 0xFFFFFFFF, PORT_AREA, MREAD_WRITE}
111#elif (__TARGET_ARCH_ARM == 5)
112 {0x01BC0000, 0x01BC0FFF, MEMORY_AREA, MREAD_WRITE},
113 {0x01BC1000, 0x01BC17FF, PORT_AREA, MREAD_WRITE},
114 {0x01C00000, 0x01C07FFF, PORT_AREA, MREAD_WRITE},
115 {0x01C08000, 0x01C087FF, PORT_AREA, MREAD_WRITE},
116 {0x01C10000, 0x01C11FFF, PORT_AREA, MREAD_WRITE},
117 {0x01C14000, 0x01C14FFF, PORT_AREA, MREAD_WRITE},
118 {0x01C20000, 0x01C23FFF, PORT_AREA, MREAD_WRITE},
119 {0x01C40000, 0x01C42FFF, PORT_AREA, MREAD_WRITE},
120 {0x01D00000, 0x01D02FFF, PORT_AREA, MREAD_WRITE},
121 {0x01D0C000, 0x01D0DFFF, PORT_AREA, MREAD_WRITE},
122 {0x01D10000, 0x01D11FFF, PORT_AREA, MREAD_WRITE},
123 {0x01E00000, 0x01E0FFFF, PORT_AREA, MREAD_WRITE},
124 {0x01E10000, 0x01E10FFF, PORT_AREA, MREAD_WRITE},
125 {0x01E13000, 0x01E1BFFF, PORT_AREA, MREAD_WRITE},
126 {0x01E20000, 0x01E28FFF, PORT_AREA, MREAD_WRITE},
127 {0x01E2C000, 0x01E2CFFF, PORT_AREA, MREAD_WRITE},
128 {0x01E30000, 0x01E383FF, PORT_AREA, MREAD_WRITE},
129 {0x01F00000, 0x01F03FFF, PORT_AREA, MREAD_WRITE},
130 {0x01F06000, 0x01F08FFF, PORT_AREA, MREAD_WRITE},
131 {0x01F0C000, 0x01F0EFFF, PORT_AREA, MREAD_WRITE},
132 {0x01F10000, 0x01F11FFF, PORT_AREA, MREAD_WRITE},
133 {0x01C40000, 0x01C42FFF, PORT_AREA, MREAD_WRITE},
134 {0xC0000000, 0xC3FFFFFF, MEMORY_AREA, MREAD_WRITE},
135 {0xFFFD0000, 0xFFFDFFFF, MEMORY_AREA, MREAD_ONLY },
136 {0xFFFEE000, 0xFFFEFFFF, PORT_AREA, MREAD_WRITE},
137 {0xFFFF0000, 0xFFFF1FFF, MEMORY_AREA, MREAD_WRITE}
138#else
139#error "No board type in ARMV4 groups."
140#endif
141};
142
143static T_REG sreg;
144
145/******************************************************************************
146 * ハードウェアポート属性参照関数
147 ******************************************************************************/
148/*
149 * アドレスからメモリ領域属性を取り出す
150 * mode=0:領域の型
151 * mode=1:読み取り書き込み属性
152 */
153
154char
155getMemoryType(ulong_t address, int_t mode)
156{
157 int_t count = sizeof(memdefine) / sizeof(T_MEMDEF);
158 int_t i;
159
160 for(i = 0 ; i < count ; i++){
161 if(address >= memdefine[i].mstart && address <= memdefine[i].mend){
162 if(mode == 0)
163 return memdefine[i].mtype;
164 else
165 return memdefine[i].mstate;
166 }
167 }
168 return NONE_AREA;
169}
170
171/*
172 * アドレスからアライン後のアドレスを取り出す
173 */
174
175ulong_t
176MonAlignAddress(ulong_t address)
177{
178 return address;
179}
180
181/******************************************************************************
182 * メモリアクセス用関数
183 ******************************************************************************/
184/*
185 * メモリ領域に対する読み出し関数
186 * 領域のチェックを行い、エラーならゼロを返す
187 */
188int_t
189MemoryRead(ulong_t address, intptr_t p, int_t type)
190{
191 int_t len;
192
193 switch(getMemoryType(address, 0)){
194 case PORT_AREA:
195 if(type == 2){
196 len = 2;
197 *((UH *)p) = sil_reh_mem((VP)address);
198 }
199 else if(type == 4){
200 len = 4;
201 *((UW *)p) = sil_rew_mem((VP)address);
202 }
203 else{
204 len = 1;
205 *((UB *)p) = sil_reb_mem((VP)address);
206 }
207 break;
208 case MEMORY_AREA:
209 if(type == 2){
210 len = 2;
211 *((UH *)p) = *((UH *)set_align(address, len));
212 }
213 else if(type == 4){
214 len = 4;
215 *((UW *)p) = *((UW *)set_align(address, len));
216 }
217 else{
218 len = 1;
219 *((UB *)p) = *((UB *)address);
220 }
221 break;
222 default:
223 len = 0;
224 break;
225 }
226 return len;
227}
228
229/*
230 * メモリ領域に対する書き込み関数
231 * 領域のチェックを行い、エラーならゼロを返す
232 */
233int_t
234MemoryWrite(ulong_t address, intptr_t p, int_t type)
235{
236 int_t len;
237
238 switch(getMemoryType(address, 0)){
239 case PORT_AREA:
240 if(type == 2){
241 len = 2;
242 address = set_align(address, len);
243 sil_wrh_mem((VP)address, *((UH *)p));
244 }
245 else if(type == 4){
246 len = 4;
247 address = set_align(address, len);
248 sil_wrw_mem((VP)address, *((UW *)p));
249 }
250 else{
251 len = 1;
252 sil_wrb_mem((VP)address, *((UB *)p));
253 }
254 break;
255 case MEMORY_AREA:
256 if(getMemoryType(address, 1) == MREAD_ONLY){
257 len = 0;
258 }
259 else if(type == 2){
260 len = 2;
261 *((UH *)address) = *((UH *)set_align(p, len));
262 }
263 else if(type == 4){
264 len = 4;
265 *((UW *)address) = *((UW *)set_align(p, len));
266 }
267 else{
268 len = 1;
269 *((UB *)address) = *((UB *)p);
270 }
271 break;
272 default:
273 len = 0;
274 break;
275 }
276 return len;
277}
278
279/******************************************************************************
280 * モニタ用関数
281 ******************************************************************************/
282/*
283 * レジスタ内容の表示
284 */
285void
286display_registers(ID tskid)
287{
288 ER ercd;
289 T_RTST rtst;
290
291 ercd = ref_tst(tskid, &rtst);
292 if(ercd == E_OK){
293 if(rtst.tskpc == (FP)_kernel_break_wait){
294 sreg = *((T_REG *)rtst.tsksp);
295 printf(" PC =%08lx SP =%08x IR =%08x", (long)sreg.pc, (UW)((long)rtst.tsksp+sizeof(T_REG)), sreg.lr);
296 printf(" IP =%08x SR=%08x\n", sreg.ip, sreg.spsr);
297 printf(" R0 =%08x R1 =%08x R2 =%08x", sreg.r0, sreg.r1, sreg.r2);
298 printf(" R3 =%08x R4 =%08x R5 =%08x\n", sreg.r3, sreg.r4, sreg.r5);
299 printf(" R6 =%08x R7 =%08x R8 =%08x", sreg.r6, sreg.r7, sreg.r8);
300 printf(" R9 =%08x R10=%08x R11=%08x\n", sreg.r9, sreg.r10, sreg.r11);
301 printf(" %08lx %08x\n", (long)sreg.pc, *((UW*)((sreg.pc+3) & ~3)));
302 return;
303 }
304 else if(rtst.tskstat == TTS_DMT){
305 printf(" wait in activate_r() !!\n");
306 return;
307 }
308 }
309 printf(" wait in dispatch() !!\n");
310}
311
Note: See TracBrowser for help on using the repository browser.