source: asp3_tinet_ecnl_rx/trunk/asp3_dcre/mbed/target/mbed_api.c@ 387

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

ファイルディスクリプタ処理を更新

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