source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/armv4/at91sam7s/sys_support.S@ 26

Last change on this file since 26 was 26, checked in by ykominami, 12 years ago

initial

File size: 9.7 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2003 by Advanced Data Controls, Corp
9 * Copyright (C) 2004 by Embedded and Real-Time Systems Laboratory
10 * Graduate School of Information Science, Nagoya Univ., JAPAN
11 * Copyright (C) 2006 by GJ Business Division RICOH COMPANY,LTD. JAPAN
12 *
13 * 上記著作権者
14は,以下の (1)〜(4) の条件か,Free Software Foundation
15 * によってå…
16¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
17 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
18 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
19å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
20 * 利用と呼ぶ)することを無償で許諾する.
21 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
22 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
23 * スコード中に含まれていること.
24 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
25 * 用できる形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
27å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
28 * 者
29マニュアルなど)に,上記の著作権表示,この利用条件および下記
30 * の無保証規定を掲載すること.
31 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
32 * 用できない形で再é…
33å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
34 * と.
35 * (a) 再é…
36å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
37マニュアルなど)に,上記の著
38 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
39 * (b) 再é…
40å¸ƒã®å½¢æ…
41‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
42 * 報告すること.
43 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
44 * 害からも,上記著作権者
45およびTOPPERSプロジェクトをå…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
51 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
52 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
53 *
54 * @(#) $Id$
55 */
56
57#define _MACRO_ONLY
58#include "jsp_kernel.h"
59#include <at91sam7s.h>
60
61
62/*
63 * 低レベルのターゲットシステム依存の初期化
64 *
65 * スタートアップモジュールの中で,メモリ初期化の前に呼び出される.
66 */
67
68 .text
69 .align 2
70 .global hardware_init_hook
71hardware_init_hook:
72 ldr r10, =TADR_BASE_RSTC
73 ldr r0, =0xA5000c01 /* NRST enable */
74 str r0, [r10, #TOFF_RSTC_MR]
75 /* Set up FLASH wait state */
76 ldr r10, =TADR_MC_BASE
77 ldr r0, =(50<<MC_FMR_FMCN_SHIFT) | MC_FMR_FWS_1FWS
78 str r0, [r10, #TOFF_MC_FMR]
79 /* Disable Watchdog */
80 ldr r10, =TADR_WDT_BASE
81 ldr r0, =WDT_MR_WDDIS
82 str r0, [r10, #TOFF_WDT_MR]
83 /* Enable the main oscillator */
84 ldr r10, =TADR_PMC_BASE
85 ldr r0, =(6<<CKGR_MOR_OSCOUNT_SHIFT)|CKGR_MOR_MOSCEN
86 str r0, [r10, #TOFF_CKGR_MOR]
87 /* Wait for main oscillator to stabilize */
88oscillator_wait:
89 ldr r0, [r10, #TOFF_PMC_SR]
90 tst r0, #PMC_SR_MOSCS
91 beq oscillator_wait
92 /* Set up the PLL */
93 /* MCK=18.432[MHz]/(DIV=14)*((MUL=72)+1)/2=48054857[Hz] */
94 ldr r0, =(14<<CKGR_PLLR_DIV_SHIFT) | (28<<CKGR_PLLR_PLLCOUNT_SHIFT) | (72<<CKGR_PLLR_MUL_SHIFT)
95 str r0, [r10, #TOFF_CKGR_PLLR]
96 /* Wait for PLL to lock */
97PLLlock_wait:
98 ldr r0, [r10, #TOFF_PMC_SR]
99 tst r0, #PMC_SR_LOCK
100 beq PLLlock_wait
101 /* Select PLL as clock source */
102 ldr r0, =(PMC_MCKR_CSS_PLL_CLOCK|PMC_MCKR_PRES_CLK_2)
103 str r0, [r10, #TOFF_PMC_MCKR]
104 /* Setup the stack for each mode */
105 mov r0, sp
106 msr cpsr_c, #(CPSR_FIQ|CPSR_IRQ_BIT|CPSR_FIQ_BIT) /* Set up Fast Interrupt Mode and set FIQ Mode Stack */
107 ldr r8, =TADR_AIC_BASE /* Init the FIQ register */
108
109 msr cpsr_c, #(CPSR_IRQ|CPSR_IRQ_BIT|CPSR_FIQ_BIT) /* Set up Interrupt Mode and set IRQ Mode Stack */
110 mov r13, r0 /* Init stack IRQ */
111
112 msr cpsr_c, #(CPSR_SVC|CPSR_IRQ_BIT|CPSR_FIQ_BIT) /* Return Supervisor Mode and set Supervisor Mode */
113
114init_done:
115 mov pc, lr
116
117
118 .text
119 .align 2
120 .global software_init_hook
121software_init_hook:
122 mov pc, lr
123
124 .text
125 .align 2
126 .global software_term_hook
127software_term_hook:
128 mov pc, lr
129
130
131/*
132 *
133 * 割込みの出å…
134¥ã‚Šå£å‡¦ç†
135 *
136 */
137 .text
138 .align 4
139 .global IRQ_Handler
140IRQ_Handler:
141
142 /*
143 * 割込みモード
144 *
145 * cpsrがspsr_irqに復帰å…
146ˆãŒr14_irq(lp)にå…
147¥ã‚Šï¼Œ
148 * spsr_irqとr14_irqとr13(sp)_irqが r14,r13となる.
149 */
150
151 /*
152 * タスクの動作時モード(スーパーバイザーモード)へ
153 */
154 mov sp,#(CPSR_SVC | CPSR_FIQ_BIT | CPSR_IRQ_BIT)
155 msr cpsr_all, sp
156 stmfd sp!, {r0-r3,ip,lr,pc} /* pcはダミー */
157
158
159 /*
160 * spsrと戻り番地を取得するためにIRQモードへ
161 */
162 mov r0,#(CPSR_IRQ | CPSR_FIQ_BIT | CPSR_IRQ_BIT)
163 msr cpsr,r0
164 sub r0,lr,#4
165 mrs r1,spsr
166
167 /*
168 * スーパーバイザーモードに
169 */
170 and r2, r1, #CPSR_FIQ_BIT /* FIQビットの継承 */
171 orr r2, r2, #(CPSR_SVC|CPSR_IRQ_BIT)
172 msr cpsr_all, r2
173 str r0, [sp,#0x18] /* Store pc */
174 stmfd sp!,{r1} /* spsr */
175
176
177 /*
178 * 多重割り込みか判定
179 */
180 ldr r2, =interrupt_count
181 ldr r3, [r2]
182 add r0,r3,#1
183 str r0, [r2]
184 cmp r3, #0x00
185
186 moveq r2,sp /* ネスト割り込みでない場合 */
187 ldreq sp,=STACKTOP /* スタックの変更 */
188 stmeqfd sp!,{r2} /* タスクスタックの保存 */
189
190 /*
191 * 割り込み要因の判定.
192 */
193 ldr r3, =TADR_AIC_BASE
194 ldr r0, [r3, #TOFF_AIC_IVR]
195 str r3, [r3, #TOFF_AIC_IVR]
196
197 /*
198 * 割り込み許可
199 */
200 mrs r2, cpsr
201 and r2, r2, #~CPSR_IRQ_BIT /* 割込み許可 */
202 msr cpsr,r2
203
204 /*
205 * Call Handler
206 */
207 mov lr, pc
208 mov pc, r0
209
210 /*
211 * 割り込み禁止
212 */
213 mrs r2, cpsr
214 and r2, r2, #CPSR_FIQ_BIT /* FIQビットの継承 */
215 orr r2, r2, #(CPSR_SVC|CPSR_IRQ_BIT)
216 msr cpsr,r2
217
218 /*
219 * 割込みクリア
220 */
221 ldr r3, =TADR_AIC_BASE
222 mov r0, #0
223 str r0, [r3, #TOFF_AIC_EOICR]
224
225 /*
226 * 割込みネスト回数(interrupt_count) デクリメント
227 */
228 ldr r2, =interrupt_count
229 ldr r1, [r2]
230 sub r3, r1, #1
231 str r3, [r2]
232 cmp r3, #0x00
233 bne return_to_task_irq
234
235 /*
236 * タスクスタックの復帰
237 */
238 ldmfd sp!,{r0}
239 mov sp, r0
240
241 ldr r1, =reqflg /* Check reqflg */
242 ldr r0, [r1]
243 cmp r0, #0
244 beq return_to_task_irq
245 mov r0, #0
246 str r0, [r1] /* Clear reqflg */
247 b ret_int
248
249return_to_task_irq:
250 /*
251 * 復帰処理
252 * 割り込み許可となるがタスクコンテキスト上に保存しているため,
253 * 問題はない
254 */
255 ldmfd sp!,{r1} /* CPSRの復帰処理 */
256 mrs r2, cpsr /* FIQを継承 */
257 and r2, r2, #CPSR_FIQ_BIT
258 and r1, r1, #~CPSR_FIQ_BIT
259 orr r1, r1, r2
260 msr spsr, r1 /* 割り込み許可 */
261 ldmfd sp!,{r0-r3,ip,lr,pc}^ /*タスク復帰 + 割込み許可 */
262
263 .text
264 .align 4
265 .global FIQ_Handler
266FIQ_Handler:
267 /* Switch in SVC/User Mode to allow User Stack access for C code */
268 /* because the FIQ is not yet acknowledged */
269 /* Save and r0 in FIQ_Register */
270 mov r9, r0
271 ldr r0, [r8, #TOFF_AIC_FVR]
272 msr cpsr_c,#(CPSR_SVC|CPSR_IRQ_BIT|CPSR_FIQ_BIT)
273 /* Save scratch/used registers and LR in User Stack */
274 ldr sp, =(STACKTOP+FIQ_DATA_SIZE)
275 stmfd sp!, { r1-r3, r12, lr}
276 /* Branch to the routine pointed by the AIC_FVR */
277 mov r14, pc
278 bx r0
279 /* Restore scratch/used registers and LR from User Stack */
280 ldmia sp!, { r1-r3, r12, lr}
281 /* Leave Interrupts disabled and switch back in FIQ mode */
282 msr cpsr_c, #(CPSR_FIQ|CPSR_IRQ_BIT|CPSR_FIQ_BIT)
283 /* Restore the R0 ARM_MODE_SVC register */
284 mov r0, r9
285 /* Restore the Program Counter using the LR_fiq directly in the PC */
286 subs pc, lr, #4
287
288
Note: See TracBrowser for help on using the repository browser.