source: asp_fm/asp/target/cqfrkfm3_gcc/target_serial.c@ 150

Last change on this file since 150 was 150, checked in by mmatsu, 8 years ago

カーネル 1.9.2 に追従,シリアルポートIDの1と2を入れ替え

File size: 11.0 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) 2008-2011 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
10 * ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
11 * •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
12 * (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
13 * Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
14 * ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
15 * (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
16 * —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ…
17ƒƒ“ƒgi—˜—p
18 * ŽÒƒ}ƒjƒ…
19ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
20 * ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
21 * (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
22 * —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
23 * ‚ƁD
24 * (a) Ä”z•z‚É”º‚¤ƒhƒLƒ…
25ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ…
26ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
27 * ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
28 * (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
29 * •ñ‚·‚邱‚ƁD
30 * (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
31 * ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
32 * ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
33 * —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
34 * –Ɛӂ·‚邱‚ƁD
35 *
36 * –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
37 * ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
38 * ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
39 * ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
40 * ‚̐ӔC‚𕉂í‚È‚¢D
41 *
42 */
43
44/*
45 * ƒVƒŠƒAƒ‹I/OƒfƒoƒCƒXiSIOjƒhƒ‰ƒCƒo
46 */
47
48#include <kernel.h>
49#include <t_syslog.h>
50#include "target_serial.h"
51#include "target_syssvc.h"
52
53/*
54 * ƒŒƒWƒXƒ^Ý’è’l
55 */
56#define PORT2SIOPID(x) ((x) + 1)
57#define INDEX_PORT(x) ((x) - 1)
58#define GET_SIOPCB(x) (&siopcb_table[INDEX_PORT(x)])
59
60/*
61 * UARTƒŒƒWƒXƒ^’è‹`
62 */
63#define UART_SMR(x) (x + 0x00)
64#define UART_SCR(x) (x + 0x01)
65#define UART_ESCR(x) (x + 0x04)
66#define UART_SSR(x) (x + 0x05)
67#define UART_RDR(x) (x + 0x08)
68#define UART_TDR(x) (x + 0x08)
69#define UART_BGR(x) (x + 0x0c)
70#define UART_BGR0(x) (x + 0x0c)
71#define UART_BGR1(x) (x + 0x0d)
72#define UART_ISBA(x) (x + 0x10)
73#define UART_ISMK(x) (x + 0x11)
74#define UART_FCR0(x) (x + 0x14)
75#define UART_FCR1(x) (x + 0x15)
76#define UART_FBYTE1(x) (x + 0x18)
77#define UART_FBYTE2(x) (x + 0x19)
78
79/*
80 * ƒVƒŠƒAƒ‹I/Oƒ|[ƒg‰Šú‰»ƒuƒƒbƒN‚Ì’è‹`
81 */
82typedef struct sio_port_initialization_block {
83 uint32_t base;
84 INTNO intno_rx;
85 INTNO intno_tx;
86 uint16_t bps_setting; /* ƒ{[ƒŒ[ƒg‚̐ݒè’l */
87} SIOPINIB;
88
89/*
90 * Œ“—pGPIOƒ|[ƒg‰Šú‰»ƒuƒƒbƒN‚Ì’è‹`
91 */
92typedef struct gpio_port_initialization_block {
93 uint32_t pfr; /* PFRxƒŒƒWƒXƒ^ƒAƒhƒŒƒX */
94 uint32_t pfr_set; /* PFRxƒŒƒWƒXƒ^‚ðƒZƒbƒg‚·‚éƒrƒbƒg */
95 uint32_t pcr; /* PCRxƒŒƒWƒXƒ^ƒAƒhƒŒƒX */
96 uint32_t pcr_set; /* PCRxƒŒƒWƒXƒ^‚ðƒZƒbƒg‚·‚éƒrƒbƒg */
97 uint32_t epfr; /* EPFRxxƒŒƒWƒXƒ^ƒAƒhƒŒƒX */
98 uint32_t epfr_clr; /* EPFRxxƒŒƒWƒXƒ^‚ðƒNƒŠƒA‚·‚éƒrƒbƒg */
99 uint32_t epfr_set; /* EPFRxxƒŒƒWƒXƒ^‚ðƒZƒbƒg‚·‚éƒrƒbƒg */
100 uint32_t ade; /* ADEƒŒƒWƒXƒ^ƒAƒhƒŒƒX */
101 uint32_t ade_clr; /* ADEƒŒƒWƒXƒ^‚ðƒNƒŠƒA‚·‚éƒrƒbƒg */
102} GPIOINIB;
103
104/*
105 * ƒVƒŠƒAƒ‹I/Oƒ|[ƒgŠÇ—ƒuƒƒbƒN‚Ì’è‹`
106 */
107struct sio_port_control_block {
108 const SIOPINIB *p_siopinib; /* ƒVƒŠƒAƒ‹I/Oƒ|[ƒg‰Šú‰»ƒuƒƒbƒN */
109 const GPIOINIB *p_gpioinib; /* Œ“—pGPIOƒ|[ƒg‰Šú‰»ƒuƒƒbƒN */
110 intptr_t exinf; /* Šg’£î•ñ */
111 bool_t opnflg; /* ƒI[ƒvƒ“Ï‚݃tƒ‰ƒO */
112};
113
114/*
115 * ƒVƒŠƒAƒ‹I/Oƒ|[ƒg‰Šú‰»ƒuƒƒbƒN
116 */
117const SIOPINIB siopinib_table[TNUM_SIOP] = {
118 {(uint32_t)FM3_MFS4_UART_BASE, (INTNO)IRQ_VECTOR_MFS4RX, (INTNO)IRQ_VECTOR_MFS4TX, MFS4_BPS_SETTING},
119 {(uint32_t)FM3_MFS0_UART_BASE, (INTNO)IRQ_VECTOR_MFS0RX, (INTNO)IRQ_VECTOR_MFS0TX, MFS0_BPS_SETTING},
120 {(uint32_t)FM3_MFS3_UART_BASE, (INTNO)IRQ_VECTOR_MFS3RX, (INTNO)IRQ_VECTOR_MFS3TX, MFS3_BPS_SETTING},
121};
122
123/*
124 * Œ“—pGPIOƒ|[ƒg‰Šú‰»ƒuƒƒbƒN
125 */
126const GPIOINIB gpioinib_table[TNUM_SIOP] = {
127 {(uint32_t)FM3_GPIO_PFR0, (uint32_t)((1 << 5) | (1 << 6)), (uint32_t)FM3_GPIO_PCR0, (uint32_t)(1<<5), (uint32_t)FM3_GPIO_EPFR08, (uint32_t)~0x000000f0, (uint32_t)0x000000f0, (uint32_t)FM3_GPIO_ADE, (uint32_t)0},
128 {(uint32_t)FM3_GPIO_PFR2, (uint32_t)((1 << 1) | (1 << 2)), (uint32_t)FM3_GPIO_PCR2, (uint32_t)(1<<1), (uint32_t)FM3_GPIO_EPFR07, (uint32_t)~0x000000f0, (uint32_t)0x00000050, (uint32_t)FM3_GPIO_ADE, (uint32_t)(1 << 31)},
129 {(uint32_t)FM3_GPIO_PFR4, (uint32_t)((1 << 8) | (1 << 9)), (uint32_t)FM3_GPIO_PCR4, (uint32_t)(1<<8), (uint32_t)FM3_GPIO_EPFR07, (uint32_t)~0x03c00000, (uint32_t)0x03c00000, (uint32_t)FM3_GPIO_ADE, (uint32_t)0},
130};
131
132/*
133 * ƒVƒŠƒAƒ‹I/Oƒ|[ƒgŠÇ—ƒuƒƒbƒN‚̃GƒŠƒA
134 */
135SIOPCB siopcb_table[TNUM_SIOP];
136
137/*
138 * ƒVƒŠƒAƒ‹I/Oƒ|[ƒgID‚©‚çŠÇ—ƒuƒƒbƒN‚ðŽæ‚èo‚·‚½‚߂̃}ƒNƒ
139 */
140#define INDEX_SIOP(siopid) ((uint_t)((siopid) - 1))
141#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
142
143/*
144 * SIOƒhƒ‰ƒCƒo‚̏‰Šú‰»
145 */
146void
147sio_initialize(intptr_t exinf)
148{
149 SIOPCB *p_siopcb;
150 uint_t i;
151
152 /*
153 * ƒVƒŠƒAƒ‹I/Oƒ|[ƒgŠÇ—ƒuƒƒbƒN‚̏‰Šú‰»
154 */
155 for (p_siopcb = siopcb_table, i = 0; i < TNUM_SIOP; p_siopcb++, i++) {
156 p_siopcb->p_siopinib = &(siopinib_table[i]);
157 p_siopcb->p_gpioinib = &(gpioinib_table[i]);
158 p_siopcb->opnflg = false;
159 }
160}
161
162
163/*
164 * ƒVƒŠƒAƒ‹I/Oƒ|[ƒg‚̃I[ƒvƒ“
165 */
166SIOPCB *
167sio_opn_por(ID siopid, intptr_t exinf)
168{
169 SIOPCB *p_siopcb;
170 const SIOPINIB *p_siopinib;
171 const GPIOINIB *p_gpioinib;
172 bool_t opnflg;
173 ER ercd;
174
175 p_siopcb = get_siopcb(siopid);
176 p_siopinib = p_siopcb->p_siopinib;
177 p_gpioinib = p_siopcb->p_gpioinib;
178
179 /*
180 * ƒI[ƒvƒ“‚µ‚½ƒ|[ƒg‚ª‚ ‚é‚©‚ðopnflg‚É“Ç‚ñ‚Å‚¨‚­D
181 */
182 opnflg = p_siopcb->opnflg;
183
184 p_siopcb->exinf = exinf;
185
186 /*
187 * ƒn[ƒhƒEƒFƒA‚̏‰Šú‰»
188 */
189 sil_wrw_mem((uint32_t *)p_gpioinib->pfr, sil_rew_mem((uint32_t *)p_gpioinib->pfr) | p_gpioinib->pfr_set);
190 sil_wrw_mem((uint32_t *)p_gpioinib->pcr, sil_rew_mem((uint32_t *)p_gpioinib->pcr) | p_gpioinib->pcr_set);
191 sil_wrw_mem((uint32_t *)p_gpioinib->epfr, (sil_rew_mem((uint32_t *)p_gpioinib->epfr) & p_gpioinib->epfr_clr) | p_gpioinib->epfr_set);
192 sil_wrw_mem((uint32_t *)p_gpioinib->ade, sil_rew_mem((uint32_t *)p_gpioinib->ade) & ~p_gpioinib->ade_clr);
193
194 uint32_t base = p_siopinib->base;
195
196 sil_wrb_mem((uint8_t *)UART_SCR(base), 0);
197 sil_wrb_mem((uint8_t *)UART_SMR(base), SMR_MD_UART | SMR_SOE);
198 sil_wrh_mem((uint16_t *)UART_BGR(base), p_siopinib->bps_setting);
199 sil_wrb_mem((uint8_t *)UART_ESCR(base), ESCR_DATABITS_8);
200 sil_wrb_mem((uint8_t *)UART_SCR(base), SCR_RXE | SCR_TXE);
201
202 /*
203 * ƒVƒŠƒAƒ‹I/OŠ„ž‚݂̃}ƒXƒN‚ð‰ðœ‚·‚éD
204 */
205 if (!opnflg) {
206 ercd = ena_int(p_siopinib->intno_rx);
207 assert(ercd == E_OK);
208 ercd = ena_int(p_siopinib->intno_tx);
209 assert(ercd == E_OK);
210 }
211
212 return(p_siopcb);
213}
214
215/*
216 * ƒVƒŠƒAƒ‹I/Oƒ|[ƒg‚̃Nƒ[ƒY
217 */
218void
219sio_cls_por(SIOPCB *p_siopcb)
220{
221 /*
222 * ƒVƒŠƒAƒ‹I/OŠ„ž‚Ý‚ðƒ}ƒXƒN‚·‚éD
223 */
224 if (!(p_siopcb->opnflg)) {
225 dis_int(p_siopcb->p_siopinib->intno_rx);
226 dis_int(p_siopcb->p_siopinib->intno_tx);
227 }
228}
229
230/*
231 * SIO‚ÌŠ„ž‚݃T[ƒrƒXƒ‹[ƒ`ƒ“
232 */
233
234Inline bool_t
235sio_putready(SIOPCB* p_siopcb)
236{
237 return (sil_reb_mem((uint8_t *)UART_SSR(p_siopcb->p_siopinib->base)) & SSR_TDRE) != 0;
238}
239
240Inline bool_t
241sio_getready(SIOPCB* p_siopcb)
242{
243 char ssr = sil_reb_mem((uint8_t *)UART_SSR(p_siopcb->p_siopinib->base));
244
245 if ((ssr & (SSR_ORE | SSR_FRE | SSR_PE)) != 0)
246 {
247 sil_wrb_mem((uint8_t *)UART_SSR(p_siopcb->p_siopinib->base), ssr | SSR_REC);
248 return 0;
249 }
250 if ((ssr & SSR_RDRF) != 0)
251 {
252 return 1;
253 }
254 return 0;
255}
256
257void
258sio_tx_isr(intptr_t exinf)
259{
260 SIOPCB *p_siopcb;
261
262 p_siopcb = get_siopcb(exinf);
263
264 if (sio_putready(p_siopcb)) {
265 sio_irdy_snd(p_siopcb->exinf);
266 }
267}
268
269void
270sio_rx_isr(intptr_t exinf)
271{
272 SIOPCB *p_siopcb;
273
274 p_siopcb = get_siopcb(exinf);
275
276 if (sio_getready(p_siopcb)) {
277 sio_irdy_rcv(p_siopcb->exinf);
278 }
279}
280
281/*
282 * ƒVƒŠƒAƒ‹I/Oƒ|[ƒg‚Ö‚Ì•¶Žš‘—M
283 */
284bool_t
285sio_snd_chr(SIOPCB *p_siopcb, char c)
286{
287 if (sio_putready(p_siopcb)) {
288 sil_wrh_mem((uint16_t *)UART_TDR(p_siopcb->p_siopinib->base), (uint16_t)c);
289
290 return true;
291 }
292
293 return false;
294}
295
296/*
297 * ƒVƒŠƒAƒ‹I/Oƒ|[ƒg‚©‚ç‚Ì•¶ŽšŽóM
298 */
299int_t
300sio_rcv_chr(SIOPCB *p_siopcb)
301{
302 int_t c = -1;
303
304 if (sio_getready(p_siopcb)) {
305 c = sil_reh_mem((uint16_t *)UART_RDR(p_siopcb->p_siopinib->base)) & 0xFF;
306 }
307
308 return c;
309}
310
311/*
312 * ƒVƒŠƒAƒ‹I/Oƒ|[ƒg‚©‚ç‚̃R[ƒ‹ƒoƒbƒN‚Ì‹–‰Â
313 */
314void
315sio_ena_cbr(SIOPCB *p_siopcb, uint_t cbrtn)
316{
317 switch (cbrtn) {
318 case SIO_RDY_SND:
319 sil_wrb_mem((uint8_t *)UART_SCR(p_siopcb->p_siopinib->base), sil_reb_mem((uint8_t *)UART_SCR(p_siopcb->p_siopinib->base)) | SCR_TIE);
320 break;
321 case SIO_RDY_RCV:
322 sil_wrb_mem((uint8_t *)UART_SCR(p_siopcb->p_siopinib->base), sil_reb_mem((uint8_t *)UART_SCR(p_siopcb->p_siopinib->base)) | SCR_RIE);
323 break;
324 }
325}
326
327/*
328 * ƒVƒŠƒAƒ‹I/Oƒ|[ƒg‚©‚ç‚̃R[ƒ‹ƒoƒbƒN‚Ì‹ÖŽ~
329 */
330void
331sio_dis_cbr(SIOPCB *p_siopcb, uint_t cbrtn)
332{
333 switch (cbrtn) {
334 case SIO_RDY_SND:
335 sil_wrb_mem((uint8_t *)UART_SCR(p_siopcb->p_siopinib->base), sil_reb_mem((uint8_t *)UART_SCR(p_siopcb->p_siopinib->base)) & ~SCR_TIE);
336 break;
337 case SIO_RDY_RCV:
338 sil_wrb_mem((uint8_t *)UART_SCR(p_siopcb->p_siopinib->base), sil_reb_mem((uint8_t *)UART_SCR(p_siopcb->p_siopinib->base)) & ~SCR_RIE);
339 break;
340 }
341}
342
343/*
344 * 1•¶Žšo—́iƒ|[ƒŠƒ“ƒO‚ł̏o—́j
345 */
346void sio_pol_snd_chr(char c, ID siopid)
347{
348 uint32_t base = siopinib_table[INDEX_PORT(siopid)].base;
349
350 sil_wrh_mem((uint16_t *)UART_TDR(base), (uint16_t)c);
351 while(0 == (sil_reb_mem((uint8_t *)UART_SSR(base)) & (1 << 1)));
352
353 /*
354 * o—Í‚ªŠ®‘S‚ɏI‚í‚é‚Ü‚Å‘Ò‚Â
355 */
356 volatile int n = 300000000/BPS_SETTING;
357 while(n--);
358}
359
360/*
361 * ƒ^[ƒQƒbƒg‚̃VƒŠƒAƒ‹‰Šú‰»
362 */
363void target_uart_init(ID siopid)
364{
365 const SIOPINIB *p_siopinib = &siopinib_table[INDEX_PORT(siopid)];
366 const GPIOINIB *p_gpioinib = &gpioinib_table[INDEX_PORT(siopid)];
367
368 sil_wrw_mem((uint32_t *)p_gpioinib->pfr, sil_rew_mem((uint32_t *)p_gpioinib->pfr) | p_gpioinib->pfr_set);
369 sil_wrw_mem((uint32_t *)p_gpioinib->pcr, sil_rew_mem((uint32_t *)p_gpioinib->pcr) | p_gpioinib->pcr_set);
370 sil_wrw_mem((uint32_t *)p_gpioinib->epfr, (sil_rew_mem((uint32_t *)p_gpioinib->epfr) & p_gpioinib->epfr_clr) | p_gpioinib->epfr_set);
371 sil_wrw_mem((uint32_t *)p_gpioinib->ade, sil_rew_mem((uint32_t *)p_gpioinib->ade) & ~p_gpioinib->ade_clr);
372
373 uint32_t base = siopinib_table[INDEX_PORT(siopid)].base;
374
375 sil_wrb_mem((uint8_t *)UART_SCR(base), 0);
376 sil_wrb_mem((uint8_t *)UART_SMR(base), SMR_MD_UART | SMR_SOE);
377 sil_wrh_mem((uint16_t *)UART_BGR(base), p_siopinib->bps_setting);
378 sil_wrb_mem((uint8_t *)UART_ESCR(base), ESCR_DATABITS_8);
379 sil_wrb_mem((uint8_t *)UART_SCR(base), SCR_TXE);
380}
Note: See TracBrowser for help on using the repository browser.