source: azure_iot_hub/trunk/asp3_dcre/mbed/target/mbed_api.c@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 56.8 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2014-2018 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者
7は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
8 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9 * 変・再é…
10å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * スコード中に含まれていること.
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再é…
16å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
17å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
18 * 者
19マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再é…
23å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
24 * と.
25 * (a) 再é…
26å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
27マニュアルなど)に,上記の著
28 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
29 * (b) 再é…
30å¸ƒã®å½¢æ…
31‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
32 * 報告すること.
33 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
34 * 害からも,上記著作権者
35およびTOPPERSプロジェクトをå…
36è²¬ã™ã‚‹ã“と.
37 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
38 * 由に基づく請求からも,上記著作権者
39およびTOPPERSプロジェクトを
40 * å…
41è²¬ã™ã‚‹ã“と.
42 *
43 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
44お
45 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
46 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
47 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
48 * の責任を負わない.
49 *
50 * @(#) $Id: mbed_api.c 388 2019-05-22 11:25:18Z coas-nagasima $
51 */
52
53#include <stdint.h>
54#include <time.h>
55#include <gpio_api.h>
56#include <ticker_api.h>
57#include <serial_api.h>
58#include <kernel.h>
59#include <sil.h>
60#include <t_syslog.h>
61#include "rx630.h"
62#include "target_stddef.h"
63#include "target_kernel_impl.h"
64#include "scif.h"
65
66 /* PWM出力(490Hz) */
67#define TPU_BASE_COUNTER (48000000 / 4 / 490)
68
69void mbed_api_init()
70{
71}
72
73void error(const char *text)
74{
75 syslog(LOG_ERROR, text);
76}
77
78void core_util_critical_section_enter(void)
79{
80
81}
82
83void core_util_critical_section_exit(void)
84{
85
86}
87
88void wait_ms(int ms)
89{
90 dly_tsk(ms * 1000);
91}
92
93void us_ticker_init(void)
94{
95}
96
97void us_ticker_set_interrupt(timestamp_t timestamp)
98{
99}
100
101void us_ticker_disable_interrupt(void)
102{
103}
104
105void us_ticker_clear_interrupt(void)
106{
107}
108
109uint32_t us_ticker_read(void)
110{
111 SYSTIM result;
112 get_tim(&result);
113 return result;
114}
115
116void gpio_init(gpio_t *obj, PinName pin)
117{
118 obj->pin = pin;
119 obj->dir = PIN_INPUT;
120 obj->mode = PullDefault;
121}
122
123
124static bool_t pin_function_table[8] = {
125 true, true, true, true, true, true, true, true
126};
127
128static ER change_pin_function(int pin, bool_t gpio)
129{
130 ER result = E_PAR;
131
132 if ((pin < 0) || (pin >= 8))
133 return E_PAR;
134
135 if (pin_function_table[pin] == gpio)
136 return E_OK;
137
138 /* 汎用å…
139¥å‡ºåŠ›ãƒãƒ¼ãƒˆã«è¨­å®š */
140 switch (pin) {
141 case D0:
142 /* P21 */
143 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B1_BIT);
144 break;
145 case D1:
146 /* P20 */
147 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B0_BIT);
148 break;
149 case D2:
150 /* P22 */
151 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B2_BIT);
152 break;
153 case D3:
154 /* P23 */
155 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B3_BIT);
156 break;
157 case D4:
158 /* P24 */
159 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B4_BIT);
160 break;
161 case D5:
162 /* P25 */
163 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B5_BIT);
164 break;
165 case D6:
166 /* P32 */
167 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) & ~PORT_PMR_B2_BIT);
168 break;
169 case D7:
170 /* P33 */
171 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) & ~PORT_PMR_B3_BIT);
172 break;
173 default:
174 break;
175 }
176
177 /* 書き込みプロテクトレジスタの設定 PFSWEビットへの書き込みを許可 */
178 sil_wrb_mem(MPC_PWPR_ADDR, 0x00);
179 /* 書き込みプロテクトレジスタの設定 PxxFSレジスタへの書き込みを許可 */
180 sil_wrb_mem(MPC_PWPR_ADDR, 0x40);
181
182 switch (pin) {
183 /* P21/TIOCA3 */
184 case D0:
185 if (gpio) {
186 /* P21端子機能制御レジスタ P21とする */
187 sil_wrb_mem(MPC_P21PFS_ADDR, 0x00);
188 }
189 else {
190 /* P21端子機能制御レジスタ TIOCA3とする */
191 sil_wrb_mem(MPC_P21PFS_ADDR, 0x03);
192 }
193 result = E_OK;
194 break;
195 /* P20/TIOCB3 */
196 case D1:
197 if (gpio) {
198 /* P20端子機能制御レジスタ P20とする */
199 sil_wrb_mem(MPC_P20PFS_ADDR, 0x00);
200 }
201 else {
202 /* P20端子機能制御レジスタ TIOCB3とする */
203 sil_wrb_mem(MPC_P20PFS_ADDR, 0x03);
204 }
205 result = E_OK;
206 break;
207 /* P22/TIOCC3 */
208 case D2:
209 if (gpio) {
210 /* P22端子機能制御レジスタ P22とする */
211 sil_wrb_mem(MPC_P22PFS_ADDR, 0x00);
212 }
213 else {
214 /* P22端子機能制御レジスタ TIOCC3とする */
215 sil_wrb_mem(MPC_P22PFS_ADDR, 0x03);
216 }
217 result = E_OK;
218 break;
219 /* P23/TIOCD3 */
220 case D3:
221 if (gpio) {
222 /* P23端子機能制御レジスタ P23とする */
223 sil_wrb_mem(MPC_P23PFS_ADDR, 0x00);
224 }
225 else {
226 /* P23端子機能制御レジスタ TIOCD3とする */
227 sil_wrb_mem(MPC_P23PFS_ADDR, 0x03);
228 }
229 result = E_OK;
230 break;
231 /* P24/TIOCB4 */
232 case D4:
233 if (gpio) {
234 /* P24端子機能制御レジスタ P24とする */
235 sil_wrb_mem(MPC_P24PFS_ADDR, 0x00);
236 }
237 else {
238 /* P24端子機能制御レジスタ TIOCB4とする */
239 sil_wrb_mem(MPC_P24PFS_ADDR, 0x03);
240 }
241 result = E_OK;
242 break;
243 /* P25/TIOCA4 */
244 case D5:
245 if (gpio) {
246 /* P25端子機能制御レジスタ P25とする */
247 sil_wrb_mem(MPC_P25PFS_ADDR, 0x00);
248 }
249 else {
250 /* P25端子機能制御レジスタ TIOCA4とする */
251 sil_wrb_mem(MPC_P25PFS_ADDR, 0x03);
252 }
253 result = E_OK;
254 break;
255 /* P32/TIOCC0 */
256 case D6:
257 if (gpio) {
258 /* P32端子機能制御レジスタ P32とする */
259 sil_wrb_mem(MPC_P32PFS_ADDR, 0x00);
260 }
261 else {
262 /* P32端子機能制御レジスタ TIOCC0とする */
263 sil_wrb_mem(MPC_P32PFS_ADDR, 0x03);
264 }
265 result = E_OK;
266 break;
267 /* P33/TIOCD0 */
268 case D7:
269 if (gpio) {
270 /* P33端子機能制御レジスタ P33とする */
271 sil_wrb_mem(MPC_P33PFS_ADDR, 0x00);
272 }
273 else {
274 /* P33端子機能制御レジスタ TIOCD0とする */
275 sil_wrb_mem(MPC_P33PFS_ADDR, 0x03);
276 }
277 result = E_OK;
278 break;
279 default:
280 break;
281 }
282
283 /* 書き込みプロテクトレジスタの設定 書き込みを禁止 */
284 sil_wrb_mem(MPC_PWPR_ADDR, 0x80);
285
286 /* 機能ポートに設定 */
287 if (!gpio) {
288 switch (pin) {
289 /* P21/TIOCA3 */
290 case D0:
291 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B1_BIT);
292 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B1_BIT);
293 break;
294 /* P20/TIOCB3 */
295 case D1:
296 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B0_BIT);
297 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B0_BIT);
298 break;
299 /* P22/TIOCC3 */
300 case D2:
301 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B2_BIT);
302 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B2_BIT);
303 break;
304 /* P23/TIOCD3 */
305 case D3:
306 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B3_BIT);
307 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B3_BIT);
308 break;
309 /* P24/TIOCB4 */
310 case D4:
311 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B4_BIT);
312 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B4_BIT);
313 break;
314 /* P25/TIOCA4 */
315 case D5:
316 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B5_BIT);
317 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B5_BIT);
318 break;
319 /* P32/TIOCC0 */
320 case D6:
321 sil_wrb_mem(PORT3_PDR_ADDR, sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B2_BIT);
322 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B2_BIT);
323 break;
324 /* P33/TIOCD0 */
325 case D7:
326 sil_wrb_mem(PORT3_PDR_ADDR, sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B3_BIT);
327 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B3_BIT);
328 break;
329 default:
330 break;
331 }
332 }
333
334 pin_function_table[pin] = gpio;
335
336 return result;
337}
338
339static void change_pin_mode(gpio_t *obj)
340{
341 volatile __evenaccess uint8_t *pdr; int bit;
342
343 switch (obj->pin) {
344 case D0:
345 /* P21 */
346 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B1_BIT;
347 break;
348 case D1:
349 /* P20 */
350 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B0_BIT;
351 break;
352 case D2:
353 /* P22 */
354 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B2_BIT;
355 break;
356 case D3:
357 /* P23 */
358 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B3_BIT;
359 break;
360 case D4:
361 /* P24 */
362 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B4_BIT;
363 break;
364 case D5:
365 /* P25 */
366 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B5_BIT;
367 break;
368 case D6:
369 /* P32 */
370 pdr = PORT3_PDR_ADDR; bit = PORT_PDR_B2_BIT;
371 break;
372 case D7:
373 /* P33 */
374 pdr = PORT3_PDR_ADDR; bit = PORT_PDR_B3_BIT;
375 break;
376 case D8:
377 /* PC2 */
378 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B2_BIT;
379 break;
380 case D9:
381 /* PC3 */
382 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B3_BIT;
383 break;
384 case D10:
385 /* PC4 */
386 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B4_BIT;
387 break;
388 case D11:
389 /* PC6 */
390 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B6_BIT;
391 break;
392 case D12:
393 /* PC7 */
394 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B7_BIT;
395 break;
396 case D13:
397 /* PC5 */
398 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B5_BIT;
399 break;
400 default:
401 return;
402 }
403
404 volatile __evenaccess uint8_t *pcr = pdr + (PORT0_PCR_ADDR - PORT0_PDR_ADDR);
405
406 switch (obj->dir) {
407 case PIN_INPUT:
408 sil_wrb_mem(pdr, sil_reb_mem(pdr) & ~bit);
409 break;
410 case PIN_OUTPUT:
411 sil_wrb_mem(pdr, sil_reb_mem(pdr) | bit);
412 break;
413 default:
414 break;
415 }
416
417 switch (obj->mode) {
418 case PullUp:
419 sil_wrb_mem(pcr, sil_reb_mem(pcr) | bit);
420 break;
421 default:
422 sil_wrb_mem(pcr, sil_reb_mem(pcr) & ~bit);
423 break;
424 }
425}
426
427void gpio_mode(gpio_t *obj, PinMode mode)
428{
429 /* 汎用å…
430¥å‡ºåŠ›ãƒãƒ¼ãƒˆã«è¨­å®š */
431 change_pin_function(obj->pin, true);
432
433 obj->mode = mode;
434
435 change_pin_mode(obj);
436}
437
438void gpio_dir(gpio_t *obj, PinDirection direction)
439{
440 /* 汎用å…
441¥å‡ºåŠ›ãƒãƒ¼ãƒˆã«è¨­å®š */
442 change_pin_function(obj->pin, true);
443
444 obj->dir = direction;
445
446 change_pin_mode(obj);
447}
448
449void gpio_write(gpio_t *obj, int value)
450{
451 volatile __evenaccess uint8_t *podr;
452 int bit;
453
454 switch (obj->pin) {
455 case D0:
456 /* P21 */
457 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B1_BIT;
458 break;
459 case D1:
460 /* P20 */
461 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B0_BIT;
462 break;
463 case D2:
464 /* P22 */
465 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B2_BIT;
466 break;
467 case D3:
468 /* P23 */
469 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B3_BIT;
470 break;
471 case D4:
472 /* P24 */
473 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B4_BIT;
474 break;
475 case D5:
476 /* P25 */
477 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B5_BIT;
478 break;
479 case D6:
480 /* P32 */
481 podr = PORT3_PODR_ADDR; bit = PORT_PODR_B2_BIT;
482 break;
483 case D7:
484 /* P33 */
485 podr = PORT3_PODR_ADDR; bit = PORT_PODR_B3_BIT;
486 break;
487 case D8:
488 /* PC2 */
489 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B2_BIT;
490 break;
491 case D9:
492 /* PC3 */
493 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B3_BIT;
494 break;
495 case D10:
496 /* PC4 */
497 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B4_BIT;
498 break;
499 case D11:
500 /* PC6 */
501 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B6_BIT;
502 break;
503 case D12:
504 /* PC7 */
505 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B7_BIT;
506 break;
507 case D13:
508 /* PC5 */
509 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B5_BIT;
510 break;
511 default:
512 return;
513 }
514
515 switch (value) {
516 case 0:
517 sil_wrb_mem(podr, sil_reb_mem(podr) & ~bit);
518 break;
519 case 1:
520 sil_wrb_mem(podr, sil_reb_mem(podr) | bit);
521 break;
522 }
523}
524
525int gpio_read(gpio_t *obj)
526{
527 volatile __evenaccess uint8_t *pidr;
528 int bit;
529
530 switch (obj->pin) {
531 case D0:
532 /* P21 */
533 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B1_BIT;
534 break;
535 case D1:
536 /* P20 */
537 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B0_BIT;
538 break;
539 case D2:
540 /* P22 */
541 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B2_BIT;
542 break;
543 case D3:
544 /* P23 */
545 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B3_BIT;
546 break;
547 case D4:
548 /* P24 */
549 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B4_BIT;
550 break;
551 case D5:
552 /* P25 */
553 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B5_BIT;
554 break;
555 case D6:
556 /* P32 */
557 pidr = PORT3_PIDR_ADDR; bit = PORT_PIDR_B2_BIT;
558 break;
559 case D7:
560 /* P33 */
561 pidr = PORT3_PIDR_ADDR; bit = PORT_PIDR_B3_BIT;
562 break;
563 case D8:
564 /* PC2 */
565 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B2_BIT;
566 break;
567 case D9:
568 /* PC3 */
569 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B3_BIT;
570 break;
571 case D10:
572 /* PC4 */
573 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B4_BIT;
574 break;
575 case D11:
576 /* PC6 */
577 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B6_BIT;
578 break;
579 case D12:
580 /* PC7 */
581 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B7_BIT;
582 break;
583 case D13:
584 /* PC5 */
585 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B5_BIT;
586 break;
587 default:
588 return 0;
589 }
590
591 if ((sil_reb_mem(pidr) & bit) != 0) {
592 return 1;
593 }
594 else {
595 return 0;
596 }
597}
598
599void pin_function(PinName pin, int function)
600{
601}
602
603void pin_mode(PinName pin, PinMode mode)
604{
605
606}
607
608#define arduino_ad_table_count 64
609static uint16_t arduino_ad_table[8][arduino_ad_table_count];
610static int arduino_ad_pos = 0;
611static uint32_t arduino_ad_avelage[8];
612
613void analogin_init(analogin_t *obj, PinName pin)
614{
615 /*
616 * モジュールストップ機能の設定(S12AD)
617 */
618 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */
619 sil_wrw_mem(SYSTEM_MSTPCRA_ADDR,
620 sil_rew_mem(SYSTEM_MSTPCRA_ADDR) & ~SYSTEM_MSTPCRA_MSTPA17_BIT);
621 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */
622
623 /* 12bitADC初期化 */
624 sil_wrh_mem(S12AD_ADEXICR_ADDR, 0x0000); /* 温度センサ出力、内
625部基準電圧非選択 */
626 sil_wrh_mem(S12AD_ADANS0_ADDR, 0x00FF); /* 変換ポートAN000~AN007選択、AN008~AN015非選択 */
627 sil_wrh_mem(S12AD_ADANS1_ADDR, 0x0000); /* 変換ポートAN016~AN020非選択 */
628}
629
630uint16_t analogin_read_u16(analogin_t *obj)
631{
632 uint16_t result = 0;
633
634 switch (obj->pin) {
635 case A0:
636 /* *value = sil_reh_mem(S12AD_ADDR0_ADDR); */
637 result = (arduino_ad_avelage[0] / (arduino_ad_table_count));
638 break;
639 case A1:
640 /* *value = sil_reh_mem(S12AD_ADDR1_ADDR); */
641 result = (arduino_ad_avelage[1] / (arduino_ad_table_count));
642 break;
643 case A2:
644 /* *value = sil_reh_mem(S12AD_ADDR2_ADDR); */
645 result = (arduino_ad_avelage[2] / (arduino_ad_table_count));
646 break;
647 case A3:
648 /* *value = sil_reh_mem(S12AD_ADDR3_ADDR); */
649 result = (arduino_ad_avelage[3] / (arduino_ad_table_count));
650 break;
651 case A4:
652 /* *value = sil_reh_mem(S12AD_ADDR4_ADDR); */
653 result = (arduino_ad_avelage[4] / (arduino_ad_table_count));
654 break;
655 case A5:
656 /* *value = sil_reh_mem(S12AD_ADDR5_ADDR); */
657 result = (arduino_ad_avelage[5] / (arduino_ad_table_count));
658 break;
659 case A6:
660 /* *value = sil_reh_mem(S12AD_ADDR6_ADDR); */
661 result = (arduino_ad_avelage[6] / (arduino_ad_table_count));
662 break;
663 case A7:
664 /* *value = sil_reh_mem(S12AD_ADDR7_ADDR); */
665 result = (arduino_ad_avelage[7] / (arduino_ad_table_count));
666 break;
667 default:
668 return 0;
669 }
670
671 return 65535 - ((result << 4) | (result >> 8));
672}
673
674void arduino_tick()
675{
676 static volatile __evenaccess uint16_t *const regs[8] = {
677 S12AD_ADDR0_ADDR,
678 S12AD_ADDR1_ADDR,
679 S12AD_ADDR2_ADDR,
680 S12AD_ADDR3_ADDR,
681 S12AD_ADDR4_ADDR,
682 S12AD_ADDR5_ADDR,
683 S12AD_ADDR6_ADDR,
684 S12AD_ADDR7_ADDR
685 };
686 uint16_t ad_value;
687 int i;
688
689 /* ADCの変換結果取得 */
690 if ((sil_reb_mem(S12AD_ADCSR_ADDR) & S12AD_ADCSR_ADST_BIT) == 0) {
691 for (i = 0; i < 8; i++) {
692 arduino_ad_avelage[i] -= arduino_ad_table[i][arduino_ad_pos];
693 ad_value = sil_reh_mem(regs[i]);
694 arduino_ad_table[i][arduino_ad_pos] = ad_value;
695 arduino_ad_avelage[i] += ad_value;
696 }
697
698 arduino_ad_pos++;
699 if (arduino_ad_pos >= arduino_ad_table_count) {
700 arduino_ad_pos = 0;
701 }
702
703 /* 変換開始(シングルスキャンモード) */
704 sil_wrb_mem(S12AD_ADCSR_ADDR, S12AD_ADCSR_ADST_BIT);
705 }
706}
707
708void analogout_init(dac_t *obj, PinName pin)
709{
710}
711
712void analogout_write_u16(dac_t *obj, uint16_t value)
713{
714}
715
716void pwmout_init(pwmout_t* obj, PinName pin)
717{
718 /* PWM出力(490Hz) */
719 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */
720 sil_wrw_mem(SYSTEM_MSTPCRA_ADDR,
721 sil_rew_mem(SYSTEM_MSTPCRA_ADDR) & ~SYSTEM_MSTPCRA_MSTPA13_BIT); /* TPU0~TPU5 */
722 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */
723
724 /* カウンタクロックの選択、カウンタクリア要因の選択 */
725 sil_wrb_mem(TPU0_TCR_ADDR, (1 << TPU_TCR_TPSC_OFFSET) | (1 << TPU_TCR_CKEG_OFFSET)
726 | (1 << TPU_TCR_CCLR_OFFSET));
727 sil_wrb_mem(TPU3_TCR_ADDR, (1 << TPU_TCR_TPSC_OFFSET) | (1 << TPU_TCR_CKEG_OFFSET)
728 | (3 << TPU_TCR_CCLR_OFFSET));
729 sil_wrb_mem(TPU4_TCR_ADDR, (1 << TPU_TCR_TPSC_OFFSET) | (1 << TPU_TCR_CKEG_OFFSET)
730 | (3 << TPU_TCR_CCLR_OFFSET));
731 /* 波形出力レベルの選択 */
732 sil_wrb_mem(TPU0_TIORL_ADDR, (5 << TPU_TIORL_IOC_OFFSET) | (5 << TPU_TIORL_IOD_OFFSET));
733 sil_wrb_mem(TPU3_TIORH_ADDR, (5 << TPU_TIORH_IOA_OFFSET) | (5 << TPU_TIORH_IOB_OFFSET));
734 sil_wrb_mem(TPU3_TIORL_ADDR, (5 << TPU_TIORL_IOC_OFFSET) | (5 << TPU_TIORL_IOD_OFFSET));
735 sil_wrb_mem(TPU4_TIOR_ADDR, (5 << TPU_TIOR_IOA_OFFSET) | (5 << TPU_TIOR_IOB_OFFSET));
736 /* TGRyの設定 */
737 sil_wrh_mem(TPU0_TGRA_ADDR, TPU_BASE_COUNTER);
738 sil_wrh_mem(TPU0_TGRC_ADDR, 0);
739 sil_wrh_mem(TPU0_TGRD_ADDR, 0);
740 sil_wrh_mem(TPU3_TGRA_ADDR, 0);
741 sil_wrh_mem(TPU3_TGRB_ADDR, 0);
742 sil_wrh_mem(TPU3_TGRC_ADDR, 0);
743 sil_wrh_mem(TPU3_TGRD_ADDR, 0);
744 sil_wrh_mem(TPU4_TGRA_ADDR, 0);
745 sil_wrh_mem(TPU4_TGRB_ADDR, 0);
746 /* PWMモード2の設定 */
747 sil_wrb_mem(TPU0_TMDR_ADDR, 3);
748 sil_wrb_mem(TPU3_TMDR_ADDR, 3);
749 sil_wrb_mem(TPU4_TMDR_ADDR, 3);
750 /* 同期動作設定 */
751 sil_wrb_mem(TPUA_TSYR_ADDR, TPU_TSYR_SYNC0_BIT | TPU_TSYR_SYNC3_BIT | TPU_TSYR_SYNC4_BIT);
752 /* カウント動作開始 */
753 sil_wrb_mem(TPUA_TSTR_ADDR, TPU_TSTR_CST0_BIT | TPU_TSTR_CST3_BIT | TPU_TSTR_CST4_BIT);
754}
755
756void pwmout_free(pwmout_t* obj)
757{
758 /* カウント動作終了 */
759 sil_wrb_mem(TPUA_TSTR_ADDR, 0);
760}
761
762void pwmout_period_us(pwmout_t* obj, int us)
763{
764}
765
766void pwmout_pulsewidth_us(pwmout_t* obj, int us)
767{
768}
769
770typedef enum {
771 sciSerial,
772 sciI2C,
773 sciSPIM,
774 sciSPIS,
775} sci_mode_t;
776
777void sci_enable(void *base_address, sci_mode_t mode)
778{
779 /*
780 * モジュールストップ機能の設定
781 */
782 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */
783 sil_wrw_mem(SYSTEM_MSTPCRB_ADDR,
784 sil_rew_mem(SYSTEM_MSTPCRB_ADDR) & ~SCI_MSTPCRB_BIT(base_address));
785 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */
786
787 /* 送受信禁止, SCKn端子はå…
788¥å‡ºåŠ›ãƒãƒ¼ãƒˆã¨ã—て使用 */
789 sil_wrb_mem(SCI_SCR(base_address), 0x00U);
790
791 switch ((uint32_t)base_address) {
792 /* TXD/SDA/MOSI:P20, RXD/SCL/MISO:P21, SCK:P22 */
793 case SCI0_BASE:
794 switch (mode) {
795 case sciSerial:
796 /* HIGH状æ…
797‹ã«è¨­å®š */
798 sil_wrb_mem(PORT2_PODR_ADDR,
799 sil_reb_mem(PORT2_PODR_ADDR) | PORT_PODR_B0_BIT | PORT_PODR_B1_BIT);
800 /* TX出力/RXå…
801¥åŠ›ãƒãƒ¼ãƒˆè¨­å®š */
802 sil_wrb_mem(PORT2_PDR_ADDR, (sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B0_BIT) & ~PORT_PDR_B1_BIT);
803 /* プルアップ無効 */
804 sil_wrb_mem(PORT2_PCR_ADDR, sil_reb_mem(PORT2_PCR_ADDR) & ~(PORT_PCR_B0_BIT | PORT_PCR_B1_BIT));
805 /* RX CMOS */
806 sil_wrb_mem(PORT2_ODR0_ADDR,
807 (sil_reb_mem(PORT2_ODR0_ADDR) & ~(PORT_ODR_Pm0_MASK | PORT_ODR_Pm1_MASK))
808 | (PORT_ODR_CMOS << PORT_ODR_Pm0_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm1_OFFSET));
809 /* 周辺機能として使用 */
810 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B0_BIT | PORT_PMR_B1_BIT);
811 break;
812 case sciI2C:
813 /* HIGH状æ…
814‹ã«è¨­å®š */
815 sil_wrb_mem(PORT2_PODR_ADDR,
816 sil_reb_mem(PORT2_PODR_ADDR) | PORT_PODR_B0_BIT | PORT_PODR_B1_BIT);
817 /* SCL,SDA 出力ポート設定 */
818 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B0_BIT | PORT_PDR_B1_BIT);
819 /* プルアップ有効 */
820 sil_wrb_mem(PORT2_PCR_ADDR, sil_reb_mem(PORT2_PCR_ADDR) | PORT_PCR_B0_BIT | PORT_PCR_B1_BIT);
821 /* Nチャネルオープンドレイン */
822 sil_wrb_mem(PORT2_ODR0_ADDR,
823 (sil_reb_mem(PORT2_ODR0_ADDR) & ~(PORT_ODR_Pm0_MASK | PORT_ODR_Pm1_MASK))
824 | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm0_OFFSET) | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm1_OFFSET));
825 /* 周辺機能として使用 */
826 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B0_BIT | PORT_PMR_B1_BIT);
827 break;
828 case sciSPIM:
829 /* HIGH状æ…
830‹ã«è¨­å®š */
831 sil_wrb_mem(PORT2_PODR_ADDR,
832 sil_reb_mem(PORT2_PODR_ADDR) | PORT_PODR_B0_BIT | PORT_PODR_B1_BIT | PORT_PODR_B2_BIT);
833 /* MOSI出力/MISOå…
834¥åŠ›/SCKå…
835¥å‡ºåŠ›ãƒãƒ¼ãƒˆè¨­å®š */
836 sil_wrb_mem(PORT2_PDR_ADDR, (sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B0_BIT | PORT_PDR_B2_BIT) & ~PORT_PDR_B1_BIT);
837 /* プルアップ無効 */
838 sil_wrb_mem(PORT2_PCR_ADDR, sil_reb_mem(PORT2_PCR_ADDR) & ~(PORT_PCR_B0_BIT | PORT_PCR_B1_BIT | PORT_PCR_B2_BIT));
839 /* MISO CMOS */
840 sil_wrb_mem(PORT2_ODR0_ADDR,
841 (sil_reb_mem(PORT2_ODR0_ADDR) & ~(PORT_ODR_Pm0_MASK | PORT_ODR_Pm1_MASK | PORT_ODR_Pm2_MASK))
842 | (PORT_ODR_CMOS << PORT_ODR_Pm0_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm1_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm2_OFFSET));
843 /* 周辺機能として使用 */
844 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B0_BIT | PORT_PMR_B1_BIT | PORT_PMR_B2_BIT);
845 break;
846 }
847 /* 書き込みプロテクトレジスタの設定 PFSWEビットへの書き込みを許可 */
848 sil_wrb_mem(MPC_PWPR_ADDR, 0x00);
849 /* 書き込みプロテクトレジスタの設定 PxxFSレジスタへの書き込みを許可 */
850 sil_wrb_mem(MPC_PWPR_ADDR, 0x40);
851
852 /* P20端子機能制御レジスタ TXD0/SMOSI0/SSDA0とする */
853 sil_wrb_mem(MPC_P20PFS_ADDR, 0x0A);
854 /* P21端子機能制御レジスタ RXD0/SMISO0/SSCL0とする */
855 sil_wrb_mem(MPC_P21PFS_ADDR, 0x0A);
856 if (mode == sciSPIM) {
857 /* P22端子機能制御レジスタ SCK0とする */
858 sil_wrb_mem(MPC_P22PFS_ADDR, 0x0A);
859 }
860
861 /* 書き込みプロテクトレジスタの設定 書き込みを禁止 */
862 sil_wrb_mem(MPC_PWPR_ADDR, 0x80);
863 break;
864 /* TXD/SDA/MOSI:P50, RXD/SCL/MISO:P52, SCK:P51 */
865 case SCI2_BASE:
866 switch (mode) {
867 case sciSerial:
868 /* HIGH状æ…
869‹ã«è¨­å®š */
870 sil_wrb_mem(PORT5_PODR_ADDR,
871 sil_reb_mem(PORT5_PODR_ADDR) | PORT_PODR_B0_BIT | PORT_PODR_B2_BIT);
872 /* TX出力/RXå…
873¥åŠ›ãƒãƒ¼ãƒˆè¨­å®š */
874 sil_wrb_mem(PORT5_PDR_ADDR, (sil_reb_mem(PORT5_PDR_ADDR) | PORT_PDR_B0_BIT) & ~PORT_PDR_B2_BIT);
875 /* プルアップ無効 */
876 sil_wrb_mem(PORT5_PCR_ADDR, sil_reb_mem(PORT5_PCR_ADDR) & ~(PORT_PCR_B0_BIT | PORT_PCR_B2_BIT));
877 /* RX CMOS */
878 sil_wrb_mem(PORT5_ODR0_ADDR,
879 (sil_reb_mem(PORT5_ODR0_ADDR) & ~(PORT_ODR_Pm0_MASK | PORT_ODR_Pm2_MASK))
880 | (PORT_ODR_CMOS << PORT_ODR_Pm0_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm2_OFFSET));
881 /* 周辺機能として使用 */
882 sil_wrb_mem(PORT5_PMR_ADDR, sil_reb_mem(PORT5_PMR_ADDR) | PORT_PMR_B0_BIT | PORT_PMR_B2_BIT);
883 break;
884 case sciI2C:
885 /* HIGH状æ…
886‹ã«è¨­å®š */
887 sil_wrb_mem(PORT5_PODR_ADDR,
888 sil_reb_mem(PORT5_PODR_ADDR) | PORT_PODR_B0_BIT | PORT_PODR_B2_BIT);
889 /* SCL,SDA 出力ポート設定 */
890 sil_wrb_mem(PORT5_PDR_ADDR, sil_reb_mem(PORT5_PDR_ADDR) | PORT_PDR_B0_BIT | PORT_PDR_B2_BIT);
891 /* プルアップ有効 */
892 sil_wrb_mem(PORT5_PCR_ADDR, sil_reb_mem(PORT5_PCR_ADDR) | PORT_PCR_B0_BIT | PORT_PCR_B2_BIT);
893 /* Nチャネルオープンドレイン */
894 sil_wrb_mem(PORT5_ODR0_ADDR,
895 (sil_reb_mem(PORT5_ODR0_ADDR) & ~(PORT_ODR_Pm0_MASK | PORT_ODR_Pm2_MASK))
896 | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm0_OFFSET) | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm2_OFFSET));
897 /* 周辺機能として使用 */
898 sil_wrb_mem(PORT5_PMR_ADDR, sil_reb_mem(PORT5_PMR_ADDR) | PORT_PMR_B0_BIT | PORT_PMR_B2_BIT);
899 break;
900 case sciSPIM:
901 /* HIGH状æ…
902‹ã«è¨­å®š */
903 sil_wrb_mem(PORT5_PODR_ADDR,
904 sil_reb_mem(PORT5_PODR_ADDR) | PORT_PODR_B0_BIT | PORT_PODR_B1_BIT | PORT_PODR_B2_BIT);
905 /* MOSI出力/MISOå…
906¥åŠ›/SCKå…
907¥å‡ºåŠ›ãƒãƒ¼ãƒˆè¨­å®š */
908 sil_wrb_mem(PORT5_PDR_ADDR, (sil_reb_mem(PORT5_PDR_ADDR) | PORT_PDR_B0_BIT | PORT_PDR_B1_BIT) & ~PORT_PDR_B2_BIT);
909 /* プルアップ無効 */
910 sil_wrb_mem(PORT5_PCR_ADDR, sil_reb_mem(PORT5_PCR_ADDR) & ~(PORT_PCR_B0_BIT | PORT_PCR_B1_BIT | PORT_PCR_B2_BIT));
911 /* MISO CMOS */
912 sil_wrb_mem(PORT5_ODR0_ADDR,
913 (sil_reb_mem(PORT5_ODR0_ADDR) & ~(PORT_ODR_Pm0_MASK | PORT_ODR_Pm1_MASK | PORT_ODR_Pm2_MASK))
914 | (PORT_ODR_CMOS << PORT_ODR_Pm0_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm1_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm2_OFFSET));
915 /* 周辺機能として使用 */
916 sil_wrb_mem(PORT5_PMR_ADDR, sil_reb_mem(PORT5_PMR_ADDR) | PORT_PMR_B0_BIT | PORT_PMR_B1_BIT | PORT_PMR_B1_BIT | PORT_PMR_B2_BIT);
917 break;
918 }
919 /* 書き込みプロテクトレジスタの設定 PFSWEビットへの書き込みを許可 */
920 sil_wrb_mem(MPC_PWPR_ADDR, 0x00);
921 /* 書き込みプロテクトレジスタの設定 PxxFSレジスタへの書き込みを許可 */
922 sil_wrb_mem(MPC_PWPR_ADDR, 0x40);
923
924 /* P50端子機能制御レジスタ SSDA2とする */
925 sil_wrb_mem(MPC_P50PFS_ADDR, 0x0A);
926 /* P52端子機能制御レジスタ SSCL2とする */
927 sil_wrb_mem(MPC_P52PFS_ADDR, 0x0A);
928 if (mode == sciSPIM) {
929 /* P51端子機能制御レジスタ SCK2とする */
930 sil_wrb_mem(MPC_P51PFS_ADDR, 0x0A);
931 }
932
933 /* 書き込みプロテクトレジスタの設定 書き込みを禁止 */
934 sil_wrb_mem(MPC_PWPR_ADDR, 0x80);
935 break;
936 /* TXD/SDA/MOSI:P23, RXD/SCL/MISO:P25, SCK:P24 */
937 case SCI3_BASE:
938 switch (mode) {
939 case sciSerial:
940 /* HIGH状æ…
941‹ã«è¨­å®š */
942 sil_wrb_mem(PORT2_PODR_ADDR,
943 sil_reb_mem(PORT2_PODR_ADDR) | PORT_PODR_B3_BIT | PORT_PODR_B5_BIT);
944 /* TX出力/RXå…
945¥åŠ›ãƒãƒ¼ãƒˆè¨­å®š */
946 sil_wrb_mem(PORT2_PDR_ADDR, (sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B3_BIT) & ~PORT_PDR_B5_BIT);
947 /* プルアップ無効 */
948 sil_wrb_mem(PORT2_PCR_ADDR, sil_reb_mem(PORT2_PCR_ADDR) & ~(PORT_PCR_B3_BIT | PORT_PCR_B5_BIT));
949 /* RX CMOS */
950 sil_wrb_mem(PORT2_ODR0_ADDR,
951 (sil_reb_mem(PORT2_ODR0_ADDR) & ~(PORT_ODR_Pm3_MASK | PORT_ODR_Pm5_MASK))
952 | (PORT_ODR_CMOS << PORT_ODR_Pm3_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm5_OFFSET));
953 /* 周辺機能として使用 */
954 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B3_BIT | PORT_PMR_B5_BIT);
955 break;
956 case sciI2C:
957 /* HIGH状æ…
958‹ã«è¨­å®š */
959 sil_wrb_mem(PORT2_PODR_ADDR,
960 sil_reb_mem(PORT2_PODR_ADDR) | PORT_PODR_B3_BIT | PORT_PODR_B5_BIT);
961 /* SCL,SDA 出力ポート設定 */
962 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B3_BIT | PORT_PDR_B5_BIT);
963 /* プルアップ有効 */
964 sil_wrb_mem(PORT2_PCR_ADDR, sil_reb_mem(PORT2_PCR_ADDR) | PORT_PCR_B3_BIT | PORT_PCR_B5_BIT);
965 /* Nチャネルオープンドレイン */
966 sil_wrb_mem(PORT2_ODR0_ADDR,
967 (sil_reb_mem(PORT2_ODR0_ADDR) & ~(PORT_ODR_Pm3_MASK | PORT_ODR_Pm5_MASK))
968 | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm3_OFFSET) | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm5_OFFSET));
969 /* 周辺機能として使用 */
970 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B3_BIT | PORT_PMR_B5_BIT);
971 break;
972 case sciSPIM:
973 /* HIGH状æ…
974‹ã«è¨­å®š */
975 sil_wrb_mem(PORT2_PODR_ADDR,
976 sil_reb_mem(PORT2_PODR_ADDR) | PORT_PODR_B3_BIT | PORT_PODR_B4_BIT | PORT_PODR_B5_BIT);
977 /* MOSI出力/MISOå…
978¥åŠ›/SCKå…
979¥å‡ºåŠ›ãƒãƒ¼ãƒˆè¨­å®š */
980 sil_wrb_mem(PORT2_PDR_ADDR, (sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B3_BIT | PORT_PDR_B4_BIT) & ~PORT_PDR_B5_BIT);
981 /* プルアップ無効 */
982 sil_wrb_mem(PORT2_PCR_ADDR, sil_reb_mem(PORT2_PCR_ADDR) & ~(PORT_PCR_B3_BIT | PORT_PCR_B4_BIT | PORT_PCR_B5_BIT));
983 /* MISO CMOS */
984 sil_wrb_mem(PORT2_ODR0_ADDR,
985 (sil_reb_mem(PORT2_ODR0_ADDR) & ~(PORT_ODR_Pm3_MASK | PORT_ODR_Pm4_MASK | PORT_ODR_Pm5_MASK))
986 | (PORT_ODR_CMOS << PORT_ODR_Pm3_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm4_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm5_OFFSET));
987 /* 周辺機能として使用 */
988 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B3_BIT | PORT_PMR_B4_BIT | PORT_PMR_B4_BIT | PORT_PMR_B5_BIT);
989 break;
990 }
991 /* 書き込みプロテクトレジスタの設定 PFSWEビットへの書き込みを許可 */
992 sil_wrb_mem(MPC_PWPR_ADDR, 0x00);
993 /* 書き込みプロテクトレジスタの設定 PxxFSレジスタへの書き込みを許可 */
994 sil_wrb_mem(MPC_PWPR_ADDR, 0x40);
995
996 /* P23端子機能制御レジスタ SSDA2とする */
997 sil_wrb_mem(MPC_P23PFS_ADDR, 0x0A);
998 /* P25端子機能制御レジスタ SSCL2とする */
999 sil_wrb_mem(MPC_P25PFS_ADDR, 0x0A);
1000 if (mode == sciSPIM) {
1001 /* P24端子機能制御レジスタ SCK2とする */
1002 sil_wrb_mem(MPC_P24PFS_ADDR, 0x0A);
1003 }
1004
1005 /* 書き込みプロテクトレジスタの設定 書き込みを禁止 */
1006 sil_wrb_mem(MPC_PWPR_ADDR, 0x80);
1007 break;
1008 /* TXD/SDA/MOSI:P32, RXD/SCL/MISO:P33, SCK:P34 */
1009 case SCI6_BASE:
1010 switch (mode) {
1011 case sciSerial:
1012 /* HIGH状æ…
1013‹ã«è¨­å®š */
1014 sil_wrb_mem(PORT3_PODR_ADDR,
1015 sil_reb_mem(PORT3_PODR_ADDR) | PORT_PODR_B2_BIT | PORT_PODR_B3_BIT);
1016 /* TX出力/RXå…
1017¥åŠ›ãƒãƒ¼ãƒˆè¨­å®š */
1018 sil_wrb_mem(PORT3_PDR_ADDR, (sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B2_BIT) & ~PORT_PDR_B3_BIT);
1019 /* プルアップ無効 */
1020 sil_wrb_mem(PORT3_PCR_ADDR, sil_reb_mem(PORT3_PCR_ADDR) & ~(PORT_PCR_B2_BIT | PORT_PCR_B3_BIT));
1021 /* RX CMOS */
1022 sil_wrb_mem(PORT3_ODR0_ADDR,
1023 (sil_reb_mem(PORT3_ODR0_ADDR) & ~(PORT_ODR_Pm2_MASK | PORT_ODR_Pm3_MASK))
1024 | (PORT_ODR_CMOS << PORT_ODR_Pm2_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm3_OFFSET));
1025 /* 周辺機能として使用 */
1026 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B2_BIT | PORT_PMR_B3_BIT);
1027 break;
1028 case sciI2C:
1029 /* HIGH状æ…
1030‹ã«è¨­å®š */
1031 sil_wrb_mem(PORT3_PODR_ADDR,
1032 sil_reb_mem(PORT3_PODR_ADDR) | PORT_PODR_B2_BIT | PORT_PODR_B3_BIT);
1033 /* SCL,SDA 出力ポート設定 */
1034 sil_wrb_mem(PORT3_PDR_ADDR, sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B2_BIT | PORT_PDR_B3_BIT);
1035 /* プルアップ有効 */
1036 sil_wrb_mem(PORT3_PCR_ADDR, sil_reb_mem(PORT3_PCR_ADDR) | PORT_PCR_B2_BIT | PORT_PCR_B3_BIT);
1037 /* Nチャネルオープンドレイン */
1038 sil_wrb_mem(PORT3_ODR0_ADDR,
1039 (sil_reb_mem(PORT3_ODR0_ADDR) & ~(PORT_ODR_Pm2_MASK | PORT_ODR_Pm3_MASK))
1040 | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm2_OFFSET) | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm3_OFFSET));
1041 /* 周辺機能として使用 */
1042 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B2_BIT | PORT_PMR_B3_BIT);
1043 break;
1044 case sciSPIM:
1045 /* HIGH状æ…
1046‹ã«è¨­å®š */
1047 sil_wrb_mem(PORT3_PODR_ADDR,
1048 sil_reb_mem(PORT3_PODR_ADDR) | PORT_PODR_B2_BIT | PORT_PODR_B3_BIT | PORT_PODR_B4_BIT);
1049 /* MOSI出力/MISOå…
1050¥åŠ›/SCKå…
1051¥å‡ºåŠ›ãƒãƒ¼ãƒˆè¨­å®š */
1052 sil_wrb_mem(PORT3_PDR_ADDR, (sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B2_BIT | PORT_PDR_B4_BIT) & ~PORT_PDR_B3_BIT);
1053 /* プルアップ無効 */
1054 sil_wrb_mem(PORT3_PCR_ADDR, sil_reb_mem(PORT3_PCR_ADDR) & ~(PORT_PCR_B2_BIT | PORT_PCR_B3_BIT | PORT_PCR_B4_BIT));
1055 /* MISO CMOS */
1056 sil_wrb_mem(PORT3_ODR0_ADDR,
1057 (sil_reb_mem(PORT3_ODR0_ADDR) & ~(PORT_ODR_Pm2_MASK | PORT_ODR_Pm3_MASK | PORT_ODR_Pm4_MASK))
1058 | (PORT_ODR_CMOS << PORT_ODR_Pm2_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm3_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm4_OFFSET));
1059 /* 周辺機能として使用 */
1060 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B2_BIT | PORT_PMR_B3_BIT | PORT_PMR_B4_BIT);
1061 break;
1062 }
1063
1064 /* 書き込みプロテクトレジスタの設定 PFSWEビットへの書き込みを許可 */
1065 sil_wrb_mem(MPC_PWPR_ADDR, 0x00);
1066 /* 書き込みプロテクトレジスタの設定 PxxFSレジスタへの書き込みを許可 */
1067 sil_wrb_mem(MPC_PWPR_ADDR, 0x40);
1068
1069 /* P32端子機能制御レジスタ TXD6/SMOSI6/SSDA6とする */
1070 sil_wrb_mem(MPC_P32PFS_ADDR, 0x0A);
1071 /* P33端子機能制御レジスタ RXD6/SMISO6/SSCL6とする */
1072 sil_wrb_mem(MPC_P33PFS_ADDR, 0x0A);
1073 if (mode == sciSPIM) {
1074 /* P34端子機能制御レジスタ SCK6とする */
1075 sil_wrb_mem(MPC_P34PFS_ADDR, 0x0A);
1076 }
1077
1078 /* 書き込みプロテクトレジスタの設定 書き込みを禁止 */
1079 sil_wrb_mem(MPC_PWPR_ADDR, 0x80);
1080 break;
1081 /* TXD/SDA/MOSI:PC7, RXD/SCL/MISO:PC6, SCK:PC5 */
1082 case SCI8_BASE:
1083 switch (mode) {
1084 case sciSerial:
1085 /* HIGH状æ…
1086‹ã«è¨­å®š */
1087 sil_wrb_mem(PORTC_PODR_ADDR,
1088 sil_reb_mem(PORTC_PODR_ADDR) | PORT_PODR_B6_BIT | PORT_PODR_B7_BIT);
1089 /* TX出力/RXå…
1090¥åŠ›ãƒãƒ¼ãƒˆè¨­å®š */
1091 sil_wrb_mem(PORTC_PDR_ADDR, (sil_reb_mem(PORTC_PDR_ADDR) | PORT_PDR_B6_BIT) & ~PORT_PDR_B7_BIT);
1092 /* プルアップ無効 */
1093 sil_wrb_mem(PORTC_PCR_ADDR, sil_reb_mem(PORTC_PCR_ADDR) & ~(PORT_PCR_B6_BIT | PORT_PCR_B7_BIT));
1094 /* RX CMOS */
1095 sil_wrb_mem(PORTC_ODR0_ADDR,
1096 (sil_reb_mem(PORTC_ODR0_ADDR) & ~(PORT_ODR_Pm6_MASK | PORT_ODR_Pm7_MASK))
1097 | (PORT_ODR_CMOS << PORT_ODR_Pm6_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm7_OFFSET));
1098 /* 周辺機能として使用 */
1099 sil_wrb_mem(PORTC_PMR_ADDR, sil_reb_mem(PORTC_PMR_ADDR) | PORT_PMR_B6_BIT | PORT_PMR_B7_BIT);
1100 break;
1101 case sciI2C:
1102 /* HIGH状æ…
1103‹ã«è¨­å®š */
1104 sil_wrb_mem(PORTC_PODR_ADDR,
1105 sil_reb_mem(PORTC_PODR_ADDR) | PORT_PODR_B6_BIT | PORT_PODR_B7_BIT);
1106 /* SCL,SDA 出力ポート設定 */
1107 sil_wrb_mem(PORTC_PDR_ADDR, sil_reb_mem(PORTC_PDR_ADDR) | PORT_PDR_B6_BIT | PORT_PDR_B7_BIT);
1108 /* プルアップ有効 */
1109 sil_wrb_mem(PORTC_PCR_ADDR, sil_reb_mem(PORTC_PCR_ADDR) | PORT_PCR_B6_BIT | PORT_PCR_B7_BIT);
1110 /* Nチャネルオープンドレイン */
1111 sil_wrb_mem(PORTC_ODR0_ADDR,
1112 (sil_reb_mem(PORTC_ODR0_ADDR) & ~(PORT_ODR_Pm6_MASK | PORT_ODR_Pm7_MASK))
1113 | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm6_OFFSET) | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm7_OFFSET));
1114 /* 周辺機能として使用 */
1115 sil_wrb_mem(PORTC_PMR_ADDR, sil_reb_mem(PORTC_PMR_ADDR) | PORT_PMR_B6_BIT | PORT_PMR_B7_BIT);
1116 break;
1117 case sciSPIM:
1118 /* HIGH状æ…
1119‹ã«è¨­å®š */
1120 sil_wrb_mem(PORTC_PODR_ADDR,
1121 sil_reb_mem(PORTC_PODR_ADDR) | PORT_PODR_B7_BIT | PORT_PODR_B6_BIT | PORT_PODR_B5_BIT);
1122 /* MOSI出力/MISOå…
1123¥åŠ›/SCKå…
1124¥å‡ºåŠ›ãƒãƒ¼ãƒˆè¨­å®š */
1125 sil_wrb_mem(PORTC_PDR_ADDR, (sil_reb_mem(PORTC_PDR_ADDR) | PORT_PDR_B5_BIT | PORT_PDR_B7_BIT) & ~PORT_PDR_B6_BIT);
1126 /* プルアップ無効 */
1127 sil_wrb_mem(PORTC_PCR_ADDR, sil_reb_mem(PORTC_PCR_ADDR) & ~(PORT_PCR_B5_BIT | PORT_PCR_B7_BIT | PORT_PCR_B6_BIT));
1128 /* MISO CMOS */
1129 sil_wrb_mem(PORTC_ODR0_ADDR,
1130 (sil_reb_mem(PORTC_ODR0_ADDR) & ~(PORT_ODR_Pm5_MASK | PORT_ODR_Pm6_MASK | PORT_ODR_Pm7_MASK))
1131 | (PORT_ODR_CMOS << PORT_ODR_Pm5_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm6_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm7_OFFSET));
1132 /* 周辺機能として使用 */
1133 sil_wrb_mem(PORTC_PMR_ADDR, sil_reb_mem(PORTC_PMR_ADDR) | PORT_PMR_B5_BIT | PORT_PMR_B6_BIT | PORT_PMR_B7_BIT);
1134 break;
1135 }
1136
1137 /* 書き込みプロテクトレジスタの設定 PFSWEビットへの書き込みを許可 */
1138 sil_wrb_mem(MPC_PWPR_ADDR, 0x00);
1139 /* 書き込みプロテクトレジスタの設定 PxxFSレジスタへの書き込みを許可 */
1140 sil_wrb_mem(MPC_PWPR_ADDR, 0x40);
1141
1142 /* PC7端子機能制御レジスタ TXD8/SMOSI8/SSDA8とする */
1143 sil_wrb_mem(MPC_PC7PFS_ADDR, 0x0A);
1144 /* PC6端子機能制御レジスタ RXD8/SMISO8/SSCL8とする */
1145 sil_wrb_mem(MPC_PC6PFS_ADDR, 0x0A);
1146 if (mode == sciSPIM) {
1147 /* PC5端子機能制御レジスタ SCK8とする */
1148 sil_wrb_mem(MPC_PC5PFS_ADDR, 0x0A);
1149 }
1150
1151 /* 書き込みプロテクトレジスタの設定 書き込みを禁止 */
1152 sil_wrb_mem(MPC_PWPR_ADDR, 0x80);
1153 break;
1154 }
1155}
1156
1157void sci_disable(void *base_address)
1158{
1159 /* 送受信禁止, SCKn端子はå…
1160¥å‡ºåŠ›ãƒãƒ¼ãƒˆã¨ã—て使用 */
1161 sil_wrb_mem(SCI_SCR(base_address), 0x00U);
1162
1163 /*
1164 * モジュールストップ機能の設定
1165 */
1166 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */
1167 sil_wrw_mem(SYSTEM_MSTPCRB_ADDR,
1168 sil_rew_mem(SYSTEM_MSTPCRB_ADDR) | SCI_MSTPCRB_BIT(base_address));
1169 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */
1170}
1171
1172void sci_set_frequency(void *base_address, int hz)
1173{
1174 uint_t cnt, brr, clk;
1175
1176 cnt = (FREQ_PCLK * 1000) / (16 * hz);
1177 if (cnt < 512)
1178 clk = 0;
1179 else if (cnt < 4 * 512)
1180 clk = 1;
1181 else if (cnt < 16 * 512)
1182 clk = 2;
1183 else if (cnt < 64 * 512)
1184 clk = 3;
1185 else
1186 return;
1187
1188 brr = cnt / (1 << (2 * clk));
1189 brr = (brr / 2) + (brr % 2) - 1;
1190
1191 /* SMRに送信/ 受信フォーマットを設定 */
1192 /* クロック選択ビット(SMR.CKS[1:0]ビットを設定)、それ以外のビットを“0”に設定 */
1193 sil_wrb_mem(SCI_SMR(base_address), clk);
1194
1195 /* ビットレートを設定 */
1196 sil_wrb_mem(SCI_BRR(base_address), brr);
1197}
1198
1199void serial_init(serial_t *obj, PinName tx, PinName rx)
1200{
1201#ifdef TOPPERS_GRCITRUS
1202 if ((rx == D1) && (tx == D0)) {
1203 obj->base_address = (void *)SCI0_BASE;
1204 obj->rxi_intno = INT_SCI0_RXI;
1205 obj->tei_intno = INT_SCI0_TEI;
1206 }
1207 else if ((rx == D6) && (tx == D5)) {
1208 obj->base_address = (void *)SCI2_BASE;
1209 obj->rxi_intno = INT_SCI2_RXI;
1210 obj->tei_intno = INT_SCI2_TEI;
1211 }
1212 else if ((rx == D8) && (tx == D7)) {
1213 obj->base_address = (void *)SCI6_BASE;
1214 obj->rxi_intno = INT_SCI6_RXI;
1215 obj->tei_intno = INT_SCI6_TEI;
1216 }
1217 else if ((rx == D11) && (tx == D12)) {
1218 obj->base_address = (void *)SCI8_BASE;
1219 obj->rxi_intno = INT_SCI8_RXI;
1220 obj->tei_intno = INT_SCI8_TEI;
1221 }
1222 else {
1223 obj->base_address = NULL;
1224 return;
1225 }
1226#else
1227 if ((rx == D0) && (tx == D1)) {
1228 obj->base_address = (void *)SCI0_BASE;
1229 obj->rxi_intno = INT_SCI0_RXI;
1230 obj->tei_intno = INT_SCI0_TEI;
1231 }
1232 else if ((rx == D6) && (tx == D7)) {
1233 obj->base_address = (void *)SCI6_BASE;
1234 obj->rxi_intno = INT_SCI6_RXI;
1235 obj->tei_intno = INT_SCI6_TEI;
1236 }
1237 else if ((rx == D11) && (tx == D12)) {
1238 obj->base_address = (void *)SCI8_BASE;
1239 obj->rxi_intno = INT_SCI8_RXI;
1240 obj->tei_intno = INT_SCI8_TEI;
1241}
1242 else {
1243 obj->base_address = NULL;
1244 return;
1245 }
1246#endif // TOPPERS_GRCITRUS
1247 dis_int(obj->rxi_intno);
1248 dis_int(obj->tei_intno);
1249
1250 /* SCI有効 */
1251 sci_enable(obj->base_address, sciSerial);
1252
1253 /* SIMR1.IICMビットを“0”に設定 */
1254 sil_wrb_mem(SCI_SIMR1(obj->base_address),
1255 sil_reb_mem(SCI_SIMR1(obj->base_address)) & ~IICM);
1256
1257 /* SPMR.CKPH, CKPOLビットを“0”に設定 */
1258 sil_wrb_mem(SCI_SPMR(obj->base_address),
1259 sil_reb_mem(SCI_SPMR(obj->base_address)) & ~(CKPH | CKPOL));
1260
1261 sci_set_frequency(obj->base_address, /*9600*/115200);
1262
1263 /* SCMRレジスタはSDIRビットを“0”、SINVビットを“0”、SMIFビットを“0”に設定 */
1264 sil_wrb_mem(SCI_SCMR(obj->base_address),
1265 (sil_reb_mem(SCI_SCMR(obj->base_address)) & ~(SINV | SMIF | SDIR)));
1266
1267 /* SMRに送信/ 受信フォーマットを設定 */
1268 serial_format(obj, 8, ParityNone, 1);
1269
1270 /* 送受信許可 */
1271 sil_wrb_mem(SCI_SCR(obj->base_address),
1272 (sil_reb_mem(SCI_SCR(obj->base_address)) | RE | TE));
1273
1274 ena_int(obj->rxi_intno);
1275 ena_int(obj->tei_intno);
1276}
1277
1278void serial_free(serial_t *obj)
1279{
1280 dis_int(obj->rxi_intno);
1281 dis_int(obj->tei_intno);
1282
1283 /* SCI無効 */
1284 sci_disable(obj->base_address);
1285
1286 obj->base_address = NULL;
1287}
1288
1289void serial_baud(serial_t *obj, int baudrate)
1290{
1291 uint8_t scr = sil_reb_mem(SCI_SCR(obj->base_address));
1292
1293 /* 送受信禁止, SCKn端子はå…
1294¥å‡ºåŠ›ãƒãƒ¼ãƒˆã¨ã—て使用 */
1295 sil_wrb_mem(SCI_SCR(obj->base_address), 0x00U);
1296
1297 sci_set_frequency(obj->base_address, baudrate);
1298
1299 /* 送受信許可 */
1300 sil_wrb_mem(SCI_SCR(obj->base_address), scr);
1301}
1302
1303void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
1304{
1305 uint8_t smr = sil_reb_mem(SCI_SMR(obj->base_address));
1306
1307 smr &= ~(PE | PM | CHR | STOP);
1308
1309 switch (parity) {
1310 case ParityNone:
1311 break;
1312 case ParityOdd:
1313 smr |= PE | PM;
1314 break;
1315 case ParityEven:
1316 smr |= PE;
1317 break;
1318 default:
1319 break;
1320 }
1321
1322 switch (data_bits) {
1323 case 7:
1324 smr |= CHR;
1325 break;
1326 case 8:
1327 break;
1328 default:
1329 break;
1330 }
1331
1332 switch (stop_bits) {
1333 case 1:
1334 break;
1335 case 2:
1336 smr |= STOP;
1337 break;
1338 default:
1339 break;
1340 }
1341
1342 sil_wrb_mem(SCI_SMR(obj->base_address), smr);
1343}
1344
1345int serial_getc(serial_t *obj)
1346{
1347 uint8_t ssr;
1348 int c;
1349
1350 for (;;) {
1351 /* SSR.ORER, PER, FERフラグをリード */
1352 ssr = sil_reb_mem(SCI_SSR(obj->base_address));
1353
1354 /* 受信エラーが発生したとき */
1355 if ((ssr & (ORER | PER | FER)) != 0) {
1356 /* オーバランエラー */
1357 if ((ssr & ORER) != 0) {
1358 /* RDRレジスタをリード */
1359 c = (int)sil_reb_mem(SCI_RDR(obj->base_address));
1360 }
1361 /* フレーミングエラー */
1362 if ((ssr & FER) != 0) {
1363 }
1364 /* パリティエラー */
1365 if ((ssr & PER) != 0) {
1366 }
1367 }
1368
1369 /* SSR.ORER, PER, FERフラグを“0”に設定 */
1370 sil_wrb_mem(SCI_SSR(obj->base_address), ssr & ~(ORER | PER | FER));
1371
1372 /* SSR.ORER, PER, FERフラグをリード */
1373 ssr = sil_reb_mem(SCI_SSR(obj->base_address));
1374
1375 /* RXI割り込み */
1376 if (serial_readable(obj)) {
1377 clear_int(obj->rxi_intno);
1378 break;
1379 }
1380
1381 dly_tsk(10);
1382 }
1383
1384 /* RDRレジスタをリード */
1385 c = (int)sil_reb_mem(SCI_RDR(obj->base_address));
1386
1387 return c;
1388}
1389
1390void serial_putc(serial_t *obj, int c)
1391{
1392 while (!serial_writable(obj))
1393 dly_tsk(10);
1394
1395 sil_wrb_mem(SCI_TDR(obj->base_address), (char)c);
1396
1397 clear_int(obj->tei_intno);
1398}
1399
1400int serial_readable(serial_t *obj)
1401{
1402 //return probe_int(obj->rxi_intno);
1403 return true;
1404}
1405
1406int serial_writable(serial_t *obj)
1407{
1408 //return probe_int(obj->tei_intno);
1409 return (sil_reb_mem(SCI_SSR(obj->base_address)) & TEND) != 0U;
1410}
1411
1412void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
1413{
1414 switch (irq) {
1415 case RxIrq:
1416 if (enable) {
1417 sil_wrb_mem(SCI_SCR(obj->base_address),
1418 (sil_reb_mem(SCI_SCR(obj->base_address)) | RIE));
1419 }
1420 else {
1421 sil_wrb_mem(SCI_SCR(obj->base_address),
1422 (sil_reb_mem(SCI_SCR(obj->base_address)) & (~RIE)));
1423 }
1424 break;
1425 case TxIrq:
1426 if (enable) {
1427 sil_wrb_mem(SCI_SCR(obj->base_address),
1428 (sil_reb_mem(SCI_SCR(obj->base_address)) | TEIE));
1429 }
1430 else {
1431 sil_wrb_mem(SCI_SCR(obj->base_address),
1432 (sil_reb_mem(SCI_SCR(obj->base_address)) & (~TEIE)));
1433 }
1434 break;
1435 }
1436}
1437
1438struct uart_irq_info_t {
1439 uart_irq_handler handler;
1440 uint32_t id;
1441};
1442
1443struct uart_irq_info_t sci_irq_info[7];
1444
1445void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
1446{
1447 int no = SCI_NUM(obj->base_address);
1448 bool_t lock = sense_lock();
1449
1450 if (!lock)
1451 loc_cpu();
1452
1453 sci_irq_info[no].handler = handler;
1454 sci_irq_info[no].id = id;
1455
1456 if (!lock)
1457 unl_cpu();
1458}
1459
1460void i2c_init(i2c_t *obj, PinName sda, PinName scl)
1461{
1462 if ((sda == I2C_SDA) && (scl == I2C_SCL)) {
1463#ifdef TOPPERS_GRCITRUS
1464 obj->base_address = (void *)SCI6_BASE;
1465 obj->rxi_intno = INT_SCI6_RXI;
1466 obj->txi_intno = INT_SCI6_TXI;
1467 obj->tei_intno = INT_SCI6_TEI;
1468#else
1469 obj->base_address = (void *)SCI2_BASE;
1470 obj->rxi_intno = INT_SCI2_RXI;
1471 obj->txi_intno = INT_SCI2_TXI;
1472 obj->tei_intno = INT_SCI2_TEI;
1473#endif
1474 }
1475 else {
1476 obj->base_address = NULL;
1477 return;
1478 }
1479
1480 /* SCI有効 */
1481 sci_enable(obj->base_address, sciI2C);
1482
1483 /* SIMR3.IICSDAS[1:0](b5-b4), IICSCLS[1:0](b7-b6)ビットを“11b”に設定 */
1484 sil_wrb_mem(SCI_SIMR3(obj->base_address), 0xF0U);
1485
1486 sci_set_frequency(obj->base_address, 100000);
1487
1488 /* SCMRレジスタはSDIRビットを“1”、SINVビットを“0”、SMIFビットを“0”に設定 */
1489 sil_wrb_mem(SCI_SCMR(obj->base_address),
1490 (sil_reb_mem(SCI_SCMR(obj->base_address)) & ~(SINV | SMIF)) | SDIR);
1491
1492 /* SEMR、SNFR、SIMR1、SIMR2、SPMRレジスタに値を設定 */
1493 /* SEMRレジスタは、NFENビットを設定 */
1494 sil_wrb_mem(SCI_SEMR(obj->base_address), NFEN);
1495
1496 /* SNFRレジスタは、NFCS[2:0]ビットを設定*/
1497 sil_wrb_mem(SCI_SNFR(obj->base_address), 1);
1498
1499 /* SIMR1レジスタは、IICMビットを“1”に設定し、IICDL[4:0]ビ ットを設定 */
1500 sil_wrb_mem(SCI_SIMR1(obj->base_address), IICM | (3 << 3));
1501
1502 /* SIMR2レジスタは、IICACKT、IICCSCビットを“1”に設定し、IICINTMビットを設定 */
1503 sil_wrb_mem(SCI_SIMR2(obj->base_address), IICACKT | IICCSC | IICINTM);
1504
1505 /* SPMRレジスタは、å…
1506¨ãƒ“ット“0”に設定 */
1507 sil_wrb_mem(SCI_SPMR(obj->base_address), 0);
1508
1509 /* 送受信許可 */
1510 sil_wrb_mem(SCI_SCR(obj->base_address),
1511 (sil_reb_mem(SCI_SCR(obj->base_address)) | RE | TE));
1512}
1513
1514void i2c_frequency(i2c_t *obj, int hz)
1515{
1516 uint8_t scr = sil_reb_mem(SCI_SCR(obj->base_address));
1517
1518 /* 送受信禁止, SCKn端子はå…
1519¥å‡ºåŠ›ãƒãƒ¼ãƒˆã¨ã—て使用 */
1520 sil_wrb_mem(SCI_SCR(obj->base_address), 0x00U);
1521
1522 sci_set_frequency(obj->base_address, hz);
1523
1524 /* 送受信許可 */
1525 sil_wrb_mem(SCI_SCR(obj->base_address), scr);
1526}
1527
1528int i2c_start(i2c_t *obj)
1529{
1530 if (obj->base_address == NULL)
1531 return 0;
1532
1533 /* SIMR3.IICSTAREQビットを“1”に設定すると同時に、
1534 * SIMR3.IICSCLS[1:0],IICSDAS[1:0]ビットを“01b”に設定 */
1535 sil_wrb_mem(SCI_SIMR3(obj->base_address), IICSTAREQ | (1 << 4) | (1 << 6));
1536
1537 return 0;
1538}
1539
1540int i2c_restart(i2c_t *obj)
1541{
1542 if (obj->base_address == NULL)
1543 return 0;
1544
1545 sil_wrb_mem(SCI_SIMR3(obj->base_address), IICRSTAREQ | (1 << 4) | (1 << 6));
1546
1547 return 0;
1548}
1549
1550int i2c_stop(i2c_t *obj)
1551{
1552 if (obj->base_address == NULL)
1553 return 0;
1554
1555 /* SIMR3.IICSTPREQビットを“1”に設定すると同時に、
1556 * SIMR3.IICSCLS[1:0],IICSDAS[1:0]ビットを“01b”に設定 */
1557 sil_wrb_mem(SCI_SIMR3(obj->base_address), IICSTPREQ | (1 << 4) | (1 << 6));
1558
1559 return 0;
1560}
1561
1562int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
1563{
1564 if (obj->base_address == NULL)
1565 return 0;
1566
1567 /* 送信割り込み要求を禁止 */
1568 sil_wrb_mem(SCI_SCR(obj->base_address),
1569 (sil_reb_mem(SCI_SCR(obj->base_address)) & ~(RIE)) | TEIE | TIE);
1570
1571 /* 開始条件の生成 */
1572 i2c_start(obj);
1573
1574 /* STI(TEI)割り込み発生確認 */
1575 while (!probe_int(obj->tei_intno))
1576 dly_tsk(2);
1577 clear_int(obj->tei_intno);
1578
1579 /* SIMR3.IICSTIFフラグを“0”に設定し、 */
1580 sil_wrb_mem(SCI_SIMR3(obj->base_address),
1581 sil_reb_mem(SCI_SIMR3(obj->base_address)) & ~IICSTIF);
1582 /* SIMR3.IICSCLS[1:0], IICSDAS[1:0]ビットを“00b”に設定 */
1583 sil_wrb_mem(SCI_SIMR3(obj->base_address),
1584 sil_reb_mem(SCI_SIMR3(obj->base_address)) & ~((3 << 4) | (3 << 6)));
1585
1586 /* TDRレジスタにスレーブアドレス、R/Wビットをライト */
1587 sil_wrb_mem(SCI_TDR(obj->base_address), address | 1);
1588
1589 /* TXI割り込み発生確認 */
1590 while (!probe_int(obj->txi_intno))
1591 dly_tsk(10);
1592 clear_int(obj->txi_intno);
1593
1594 /* スレーブデバイスからのACKを確認 */
1595 if ((sil_reb_mem(SCI_SISR(obj->base_address)) & IICACKR) == 0) {
1596 /* SIMR2.IICACKTビットを“0”に設定 */
1597 sil_wrb_mem(SCI_SIMR2(obj->base_address), sil_reb_mem(SCI_SIMR2(obj->base_address)) & ~IICACKT);
1598 /* SCR.RIEビットを“1”に設定 */
1599 sil_wrb_mem(SCI_SCR(obj->base_address), sil_reb_mem(SCI_SCR(obj->base_address)) | RIE);
1600
1601 for (int i = 0; i < length; i++) {
1602 /* 次データが最終 */
1603 if (i == length - 1) {
1604 /* SIMR2.IICACKTビットを“1”に設定 */
1605 sil_wrb_mem(SCI_SIMR2(obj->base_address), sil_reb_mem(SCI_SIMR2(obj->base_address)) | IICACKT);
1606 }
1607
1608 /* TDRレジスタにダミーデータ“FFh”をライト */
1609 sil_wrb_mem(SCI_TDR(obj->base_address), 0xFF);
1610
1611 /* RXI割り込み発生確認 */
1612 while (!probe_int(obj->rxi_intno))
1613 dly_tsk(10);
1614 clear_int(obj->rxi_intno);
1615
1616 /* RDRレジスタの受信データをリード */
1617 *data = sil_reb_mem(SCI_RDR(obj->base_address));
1618 data++;
1619
1620 /* TXI割り込み発生確認 */
1621 while (!probe_int(obj->txi_intno))
1622 dly_tsk(10);
1623 clear_int(obj->txi_intno);
1624 }
1625 }
1626
1627 if (stop) {
1628 /* 停止条件の生成 */
1629 i2c_stop(obj);
1630
1631 /* STI(TEI)割り込み発生確認 */
1632 while (!probe_int(obj->tei_intno))
1633 dly_tsk(2);
1634 clear_int(obj->tei_intno);
1635
1636 /* SIMR3.IICSTIFフラグを“0”に設定し、*/
1637 sil_wrb_mem(SCI_SIMR3(obj->base_address),
1638 sil_reb_mem(SCI_SIMR3(obj->base_address)) & ~IICSTIF);
1639 /* SIMR3.IICSCLS[1:0], IICSDAS[1:0]ビットを“11b”に設定 */
1640 sil_wrb_mem(SCI_SIMR3(obj->base_address),
1641 sil_reb_mem(SCI_SIMR3(obj->base_address)) | ((3 << 4) | (3 << 6)));
1642 }
1643
1644 return length;
1645}
1646
1647int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
1648{
1649 if (obj->base_address == NULL)
1650 return 0;
1651
1652 /* 受信割り込み要求を禁止 */
1653 sil_wrb_mem(SCI_SCR(obj->base_address),
1654 (sil_reb_mem(SCI_SCR(obj->base_address)) & ~(RIE)) | TEIE | TIE);
1655
1656 /* 開始条件の生成 */
1657 i2c_start(obj);
1658
1659 /* STI(TEI)割り込み発生確認 */
1660 while (!probe_int(obj->tei_intno))
1661 dly_tsk(2);
1662 clear_int(obj->tei_intno);
1663
1664 /* SIMR3.IICSTIFフラグを“0”に設定し、 */
1665 sil_wrb_mem(SCI_SIMR3(obj->base_address),
1666 sil_reb_mem(SCI_SIMR3(obj->base_address)) & ~IICSTIF);
1667 /* SIMR3.IICSCLS[1:0], IICSDAS[1:0]ビットを“00b”に設定 */
1668 sil_wrb_mem(SCI_SIMR3(obj->base_address),
1669 sil_reb_mem(SCI_SIMR3(obj->base_address)) & ~((3 << 4) | (3 << 6)));
1670
1671 /* TDRレジスタにスレーブアドレス、R/Wビットをライト */
1672 sil_wrb_mem(SCI_TDR(obj->base_address), address);
1673
1674 /* TXI割り込み発生確認 */
1675 while (!probe_int(obj->txi_intno))
1676 dly_tsk(10);
1677 clear_int(obj->txi_intno);
1678
1679 /* スレーブデバイスからのACKを確認 */
1680 if ((sil_reb_mem(SCI_SISR(obj->base_address)) & IICACKR) == 0) {
1681
1682 for (int i = 0; i < length; i++) {
1683 /* TDRレジスタにスレーブアドレス、R/Wビットをライト */
1684 sil_wrb_mem(SCI_TDR(obj->base_address), *data);
1685 data++;
1686
1687 /* TXI割り込み発生確認 */
1688 while (!probe_int(obj->txi_intno))
1689 dly_tsk(10);
1690 clear_int(obj->txi_intno);
1691 }
1692 }
1693
1694 if (stop) {
1695 /* 停止条件の生成 */
1696 i2c_stop(obj);
1697
1698 /* STI(TEI)割り込み発生確認 */
1699 while (!probe_int(obj->tei_intno))
1700 dly_tsk(2);
1701 clear_int(obj->tei_intno);
1702
1703 /* SIMR3.IICSTIFフラグを“0”に設定し、*/
1704 sil_wrb_mem(SCI_SIMR3(obj->base_address),
1705 sil_reb_mem(SCI_SIMR3(obj->base_address)) & ~IICSTIF);
1706 /* SIMR3.IICSCLS[1:0], IICSDAS[1:0]ビットを“11b”に設定 */
1707 sil_wrb_mem(SCI_SIMR3(obj->base_address),
1708 sil_reb_mem(SCI_SIMR3(obj->base_address)) | ((3 << 4) | (3 << 6)));
1709 }
1710
1711 return length;
1712}
1713
1714int i2c_byte_read(i2c_t *obj, int last)
1715{
1716 if (obj->base_address == NULL)
1717 return 0;
1718
1719 return 0;
1720}
1721
1722int i2c_byte_write(i2c_t *obj, int data)
1723{
1724 if (obj->base_address == NULL)
1725 return 0;
1726
1727 return 0;
1728}
1729
1730void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel)
1731{
1732 if ((mosi == D11) && (miso == D12) && (sclk == D13) && ((ssel == D10) || (ssel == NC))) {
1733 obj->base_address = (void *)SCI8_BASE;
1734 obj->txi_intno = INT_SCI8_TXI;
1735 obj->rxi_intno = INT_SCI8_RXI;
1736 obj->tei_intno = INT_SCI8_TEI;
1737 }
1738 else if ((mosi == D3) && (miso == D6) && (sclk == D4) && (ssel == NC)) {
1739 obj->base_address = (void *)SCI3_BASE;
1740 obj->txi_intno = INT_SCI3_TXI;
1741 obj->rxi_intno = INT_SCI3_RXI;
1742 obj->tei_intno = INT_SCI3_TEI;
1743 }
1744 else {
1745 obj->base_address = NULL;
1746 return;
1747 }
1748
1749 /* SCI有効 */
1750 sci_enable(obj->base_address, (ssel != NC) ? sciSPIS : sciSPIM);
1751
1752 /* SIMR1.IICMビットを“0”に設定 */
1753 sil_wrb_mem(SCI_SIMR1(obj->base_address),
1754 sil_reb_mem(SCI_SIMR1(obj->base_address)) & ~IICM);
1755
1756 if (ssel == NC) {
1757 /* SPMR.SSE, CTSE, MSS, MFF, CKPH, CKPOLビットを“0”に設定 */
1758 sil_wrb_mem(SCI_SPMR(obj->base_address), 0);
1759 }
1760 else {
1761 /* SPMR, CTSE, MSS, MFF, CKPH, CKPOLビットを“0”に設定 */
1762 /* SPMR.SSEビットを“1”に設定 */
1763 sil_wrb_mem(SCI_SPMR(obj->base_address), SSE);
1764 }
1765
1766 /* SCMRレジスタはSDIRビットを“0”、SINVビットを“0”、SMIFビットを“0”に設定 */
1767 sil_wrb_mem(SCI_SCMR(obj->base_address),
1768 (sil_reb_mem(SCI_SCMR(obj->base_address)) & ~(SMIF | SDIR)) | SINV);
1769
1770 /* SMRに送信/ 受信フォーマットをクロック同期式モードで動作で設定 */
1771 sil_wrb_mem(SCI_SMR(obj->base_address), CM);
1772
1773 sci_set_frequency(obj->base_address, 1000000);
1774
1775 /* 送受信許可 */
1776 sil_wrb_mem(SCI_SCR(obj->base_address),
1777 (sil_reb_mem(SCI_SCR(obj->base_address)) | RE | TE));
1778}
1779
1780void spi_free(spi_t *obj)
1781{
1782 /* SCI無効 */
1783 sci_disable(obj->base_address);
1784
1785 obj->base_address = NULL;
1786}
1787
1788void spi_format(spi_t *obj, int bits, int mode, int slave)
1789{
1790 int polarity = (mode & 0x2) ? 1 : 0;
1791 int phase = (mode & 0x1) ? 1 : 0;
1792 uint8_t spmr;
1793
1794 if ((bits != 8) || (mode < 0) || (mode > 3)) {
1795 return;
1796 }
1797
1798 /* 送受信禁止, SCKn端子はå…
1799¥å‡ºåŠ›ãƒãƒ¼ãƒˆã¨ã—て使用 */
1800 sil_wrb_mem(SCI_SCR(obj->base_address), 0x00U);
1801
1802 spmr = sil_reb_mem(SCI_SPMR(obj->base_address));
1803
1804 /* クロック極性反転あり/なし */
1805 if (polarity)
1806 spmr |= CKPOL;
1807 else
1808 spmr &= ~CKPOL;
1809
1810 /* クロック位相反転あり/なし */
1811 if (phase)
1812 spmr |= CKPH;
1813 else
1814 spmr &= ~CKPH;
1815
1816 if (slave) {
1817 /* SCKn端子はクロックå…
1818¥åŠ›ã¨ã—て使用 */
1819 sil_wrb_mem(SCI_SCR(obj->base_address),
1820 (sil_reb_mem(SCI_SCR(obj->base_address)) & ~CKE) | 2);
1821
1822 /* SPMR.MSSビットを“1”に設定 */
1823 sil_wrb_mem(SCI_SPMR(obj->base_address), spmr | MSS);
1824 }
1825 else {
1826 /* SCKn端子はクロック出力として使用 */
1827 sil_wrb_mem(SCI_SCR(obj->base_address),
1828 sil_reb_mem(SCI_SCR(obj->base_address)) & ~CKE);
1829
1830 /* SPMR.MSSビットを“0”に設定 */
1831 sil_wrb_mem(SCI_SPMR(obj->base_address), spmr & ~MSS);
1832 }
1833
1834 /* 送受信許可 */
1835 sil_wrb_mem(SCI_SCR(obj->base_address),
1836 (sil_reb_mem(SCI_SCR(obj->base_address)) | RE | TE));
1837}
1838
1839void spi_frequency(spi_t *obj, int hz)
1840{
1841 uint8_t scr = sil_reb_mem(SCI_SCR(obj->base_address));
1842
1843 /* 送受信禁止, SCKn端子はå…
1844¥å‡ºåŠ›ãƒãƒ¼ãƒˆã¨ã—て使用 */
1845 sil_wrb_mem(SCI_SCR(obj->base_address), 0x00U);
1846
1847 sci_set_frequency(obj->base_address, hz);
1848
1849 /* 送受信許可 */
1850 sil_wrb_mem(SCI_SCR(obj->base_address), scr);
1851}
1852
1853int spi_master_write(spi_t *obj, int value)
1854{
1855 /* TXI割り込み発生確認 */
1856 while (!probe_int(obj->txi_intno))
1857 ;
1858
1859 /* 送信データをライト */
1860 sil_wrb_mem(SCI_TDR(obj->base_address), (char)value);
1861
1862 do {
1863 uint8_t ssr = sil_reb_mem(SCI_SSR(obj->base_address));
1864 if ((ssr & ORER) != 0) {
1865 ssr &= ~ORER;
1866 sil_wrb_mem(SCI_SSR(obj->base_address), ssr);
1867 return -1;
1868 }
1869 }
1870 /* RXI割り込み発生確認 */
1871 while (!probe_int(obj->rxi_intno));
1872
1873 /* 受信データをリード */
1874 return sil_reb_mem(SCI_RDR(obj->base_address));
1875}
1876
1877int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length,
1878 char *rx_buffer, int rx_length, char write_fill)
1879{
1880 int total = (tx_length > rx_length) ? tx_length : rx_length;
1881
1882 for (int i = 0; i < total; i++) {
1883 char out = (i < tx_length) ? tx_buffer[i] : write_fill;
1884 char in = spi_master_write(obj, out);
1885 if (i < rx_length) {
1886 rx_buffer[i] = in;
1887 }
1888 }
1889
1890 return total;
1891}
1892
1893uint8_t DecToBcd(uint8_t value)
1894{
1895 return ((value / 10) << 4) | (value % 10);
1896}
1897
1898uint8_t BcdToDec(uint8_t value)
1899{
1900 return (10 * (value >> 4)) | (value & 0x0F);
1901}
1902
1903void rtc_init(void)
1904{
1905}
1906
1907void rtc_free(void)
1908{
1909}
1910
1911int rtc_isenabled(void)
1912{
1913 return 1;
1914}
1915
1916long long __tm_to_secs(const struct tm *tm);
1917int __secs_to_tm(long long t, struct tm *tm);
1918
1919time_t rtc_read(void)
1920{
1921 struct tm tm = { 0 };
1922 tm.tm_year = 2000 - 1900 + BcdToDec(sil_reb_mem((uint8_t *)RTC_RYRCNT_ADDR));
1923 tm.tm_mon = BcdToDec(sil_reb_mem((uint8_t *)RTC_RMONCNT_ADDR)) - 1;
1924 tm.tm_mday = BcdToDec(sil_reb_mem((uint8_t *)RTC_RDAYCNT_ADDR));
1925 tm.tm_hour = BcdToDec(sil_reb_mem((uint8_t *)RTC_RHRCNT_ADDR));
1926 tm.tm_min = BcdToDec(sil_reb_mem((uint8_t *)RTC_RMINCNT_ADDR));
1927 tm.tm_sec = BcdToDec(sil_reb_mem((uint8_t *)RTC_RSECCNT_ADDR));
1928 return __tm_to_secs(&tm);
1929}
1930
1931void rtc_write(time_t t)
1932{
1933 struct tm tm;
1934
1935 __secs_to_tm(t, &tm);
1936 sil_wrb_mem((uint8_t *)RTC_RYRCNT_ADDR, DecToBcd(tm.tm_year + 1900 - 2000));
1937 sil_wrb_mem((uint8_t *)RTC_RMONCNT_ADDR, DecToBcd(tm.tm_mon + 1));
1938 sil_wrb_mem((uint8_t *)RTC_RDAYCNT_ADDR, DecToBcd(tm.tm_mday));
1939 sil_wrb_mem((uint8_t *)RTC_RHRCNT_ADDR, DecToBcd(tm.tm_hour));
1940 sil_wrb_mem((uint8_t *)RTC_RMINCNT_ADDR, DecToBcd(tm.tm_min));
1941 sil_wrb_mem((uint8_t *)RTC_RSECCNT_ADDR, DecToBcd(tm.tm_sec));
1942}
1943
1944void sci_rxi_handler(uint32_t no)
1945{
1946 struct uart_irq_info_t *info = &sci_irq_info[no];
1947 if (info->handler == NULL)
1948 return;
1949
1950 info->handler(info->id, RxIrq);
1951}
1952
1953void sci_txi_handler(uint32_t no)
1954{
1955/* struct uart_irq_info_t *info = &sci_irq_info[no];
1956 if (info->handler == NULL)
1957 return;
1958
1959 info->handler(info->id, TxIrq);*/
1960}
1961
1962void sci_tei_handler(int no)
1963{
1964 struct uart_irq_info_t *info = &sci_irq_info[no];
1965 if (info->handler == NULL)
1966 return;
1967
1968 info->handler(info->id, TxIrq);
1969}
1970
1971void sci0_rxi_handler(void)
1972{
1973 sci_rxi_handler(0);
1974}
1975
1976void sci0_txi_handler(void)
1977{
1978 sci_txi_handler(0);
1979}
1980
1981void sci0_tei_handler(void)
1982{
1983 sci_tei_handler(0);
1984}
1985
1986void sci1_rxi_handler(void)
1987{
1988 sci_rxi_handler(1);
1989}
1990
1991void sci1_txi_handler(void)
1992{
1993 sci_txi_handler(1);
1994}
1995
1996void sci1_tei_handler(void)
1997{
1998 sci_tei_handler(1);
1999}
2000
2001void sci2_rxi_handler(void)
2002{
2003 sci_rxi_handler(2);
2004}
2005
2006void sci2_txi_handler(void)
2007{
2008 sci_txi_handler(2);
2009}
2010
2011void sci2_tei_handler(void)
2012{
2013 sci_tei_handler(2);
2014}
2015
2016void sci3_rxi_handler(void)
2017{
2018 sci_rxi_handler(3);
2019}
2020
2021void sci3_txi_handler(void)
2022{
2023 sci_txi_handler(3);
2024}
2025
2026void sci3_tei_handler(void)
2027{
2028 sci_tei_handler(3);
2029}
2030
2031void sci4_rxi_handler(void)
2032{
2033 sci_rxi_handler(4);
2034}
2035
2036void sci4_txi_handler(void)
2037{
2038 sci_txi_handler(4);
2039}
2040
2041void sci4_tei_handler(void)
2042{
2043 sci_tei_handler(4);
2044}
2045
2046void sci5_rxi_handler(void)
2047{
2048 sci_rxi_handler(5);
2049}
2050
2051void sci5_txi_handler(void)
2052{
2053 sci_txi_handler(5);
2054}
2055
2056void sci5_tei_handler(void)
2057{
2058 sci_tei_handler(5);
2059}
2060
2061void sci6_rxi_handler(void)
2062{
2063 sci_rxi_handler(6);
2064}
2065
2066void sci6_txi_handler(void)
2067{
2068 sci_txi_handler(6);
2069}
2070
2071void sci6_tei_handler(void)
2072{
2073 sci_tei_handler(6);
2074}
Note: See TracBrowser for help on using the repository browser.