source: asp3_tinet_ecnl_rx/trunk/ntshell/src/mbed_api.c@ 364

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

TINETとSocket APIなどを更新

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