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

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

ASP3版ECNLを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 20.6 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2014-2017 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
45 /* PWM出力(490Hz) */
46#define TPU_BASE_COUNTER (48000000 / 4 / 490)
47
48void mbed_api_init()
49{
50}
51
52void wait_ms(int ms)
53{
54 dly_tsk(ms * 1000);
55}
56
57uint32_t us_ticker_read(void)
58{
59 SYSTIM result;
60 get_tim(&result);
61 return result;
62}
63
64void gpio_init(gpio_t *obj, PinName pin)
65{
66}
67
68
69static bool_t pin_function_table[8] = {
70 true, true, true, true, true, true, true, true
71};
72
73static ER change_pin_function(int pin, bool_t gpio)
74{
75 ER result = E_PAR;
76
77 if ((pin < 0) || (pin >= 8))
78 return E_PAR;
79
80 if (pin_function_table[pin] == gpio)
81 return E_OK;
82
83 /* 汎用入出力ポートに設定 */
84 switch (pin) {
85 case 0:
86 /* P21 */
87 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B1_BIT);
88 break;
89 case 1:
90 /* P20 */
91 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B0_BIT);
92 break;
93 case 2:
94 /* P22 */
95 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B2_BIT);
96 break;
97 case 3:
98 /* P23 */
99 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B3_BIT);
100 break;
101 case 4:
102 /* P24 */
103 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B4_BIT);
104 break;
105 case 5:
106 /* P25 */
107 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B5_BIT);
108 break;
109 case 6:
110 /* P32 */
111 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) & ~PORT_PMR_B2_BIT);
112 break;
113 case 7:
114 /* P33 */
115 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) & ~PORT_PMR_B3_BIT);
116 break;
117 }
118
119 /* 書き込みプロテクトレジスタの設定 PFSWEビットへの書き込みを許可 */
120 sil_wrb_mem(MPC_PWPR_ADDR, 0x00);
121 /* 書き込みプロテクトレジスタの設定 PxxFSレジスタへの書き込みを許可 */
122 sil_wrb_mem(MPC_PWPR_ADDR, 0x40);
123
124 switch (pin) {
125 /* P21/TIOCA3 */
126 case 0:
127 if (gpio) {
128 /* P21端子機能制御レジスタ P21とする */
129 sil_wrb_mem(MPC_P21PFS_ADDR, 0x00);
130 }
131 else {
132 /* P21端子機能制御レジスタ TIOCA3とする */
133 sil_wrb_mem(MPC_P21PFS_ADDR, 0x03);
134 }
135 result = E_OK;
136 break;
137 /* P20/TIOCB3 */
138 case 1:
139 if (gpio) {
140 /* P20端子機能制御レジスタ P20とする */
141 sil_wrb_mem(MPC_P20PFS_ADDR, 0x00);
142 }
143 else {
144 /* P20端子機能制御レジスタ TIOCB3とする */
145 sil_wrb_mem(MPC_P20PFS_ADDR, 0x03);
146 }
147 result = E_OK;
148 break;
149 /* P22/TIOCC3 */
150 case 2:
151 if (gpio) {
152 /* P22端子機能制御レジスタ P22とする */
153 sil_wrb_mem(MPC_P22PFS_ADDR, 0x00);
154 }
155 else {
156 /* P22端子機能制御レジスタ TIOCC3とする */
157 sil_wrb_mem(MPC_P22PFS_ADDR, 0x03);
158 }
159 result = E_OK;
160 break;
161 /* P23/TIOCD3 */
162 case 3:
163 if (gpio) {
164 /* P23端子機能制御レジスタ P23とする */
165 sil_wrb_mem(MPC_P23PFS_ADDR, 0x00);
166 }
167 else {
168 /* P23端子機能制御レジスタ TIOCD3とする */
169 sil_wrb_mem(MPC_P23PFS_ADDR, 0x03);
170 }
171 result = E_OK;
172 break;
173 /* P24/TIOCB4 */
174 case 4:
175 if (gpio) {
176 /* P24端子機能制御レジスタ P24とする */
177 sil_wrb_mem(MPC_P24PFS_ADDR, 0x00);
178 }
179 else {
180 /* P24端子機能制御レジスタ TIOCB4とする */
181 sil_wrb_mem(MPC_P24PFS_ADDR, 0x03);
182 }
183 result = E_OK;
184 break;
185 /* P25/TIOCA4 */
186 case 5:
187 if (gpio) {
188 /* P25端子機能制御レジスタ P25とする */
189 sil_wrb_mem(MPC_P25PFS_ADDR, 0x00);
190 }
191 else {
192 /* P25端子機能制御レジスタ TIOCA4とする */
193 sil_wrb_mem(MPC_P25PFS_ADDR, 0x03);
194 }
195 result = E_OK;
196 break;
197 /* P32/TIOCC0 */
198 case 6:
199 if (gpio) {
200 /* P32端子機能制御レジスタ P32とする */
201 sil_wrb_mem(MPC_P32PFS_ADDR, 0x00);
202 }
203 else {
204 /* P32端子機能制御レジスタ TIOCC0とする */
205 sil_wrb_mem(MPC_P32PFS_ADDR, 0x03);
206 }
207 result = E_OK;
208 break;
209 /* P33/TIOCD0 */
210 case 7:
211 if (gpio) {
212 /* P33端子機能制御レジスタ P33とする */
213 sil_wrb_mem(MPC_P33PFS_ADDR, 0x00);
214 }
215 else {
216 /* P33端子機能制御レジスタ TIOCD0とする */
217 sil_wrb_mem(MPC_P33PFS_ADDR, 0x03);
218 }
219 result = E_OK;
220 break;
221 }
222
223 /* 書き込みプロテクトレジスタの設定 書き込みを禁止 */
224 sil_wrb_mem(MPC_PWPR_ADDR, 0x80);
225
226 /* 機能ポートに設定 */
227 if (!gpio) {
228 switch (pin) {
229 /* P21/TIOCA3 */
230 case 0:
231 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B1_BIT);
232 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B1_BIT);
233 break;
234 /* P20/TIOCB3 */
235 case 1:
236 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B0_BIT);
237 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B0_BIT);
238 break;
239 /* P22/TIOCC3 */
240 case 2:
241 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B2_BIT);
242 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B2_BIT);
243 break;
244 /* P23/TIOCD3 */
245 case 3:
246 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B3_BIT);
247 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B3_BIT);
248 break;
249 /* P24/TIOCB4 */
250 case 4:
251 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B4_BIT);
252 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B4_BIT);
253 break;
254 /* P25/TIOCA4 */
255 case 5:
256 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B5_BIT);
257 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B5_BIT);
258 break;
259 /* P32/TIOCC0 */
260 case 6:
261 sil_wrb_mem(PORT3_PDR_ADDR, sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B2_BIT);
262 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B2_BIT);
263 break;
264 /* P33/TIOCD0 */
265 case 7:
266 sil_wrb_mem(PORT3_PDR_ADDR, sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B3_BIT);
267 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B3_BIT);
268 break;
269 }
270 }
271
272 pin_function_table[pin] = gpio;
273
274 return result;
275}
276
277static void change_pin_mode(gpio_t *obj)
278{
279 volatile __evenaccess uint8_t *pdr; int bit;
280
281 switch (obj->pin) {
282 case 0:
283 /* P21 */
284 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B1_BIT;
285 break;
286 case 1:
287 /* P20 */
288 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B0_BIT;
289 break;
290 case 2:
291 /* P22 */
292 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B2_BIT;
293 break;
294 case 3:
295 /* P23 */
296 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B3_BIT;
297 break;
298 case 4:
299 /* P24 */
300 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B4_BIT;
301 break;
302 case 5:
303 /* P25 */
304 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B5_BIT;
305 break;
306 case 6:
307 /* P32 */
308 pdr = PORT3_PDR_ADDR; bit = PORT_PDR_B2_BIT;
309 break;
310 case 7:
311 /* P33 */
312 pdr = PORT3_PDR_ADDR; bit = PORT_PDR_B3_BIT;
313 break;
314 case 8:
315 /* PC2 */
316 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B2_BIT;
317 break;
318 case 9:
319 /* PC3 */
320 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B3_BIT;
321 break;
322 case 10:
323 /* PC4 */
324 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B4_BIT;
325 break;
326 case 11:
327 /* PC6 */
328 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B6_BIT;
329 break;
330 case 12:
331 /* PC7 */
332 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B7_BIT;
333 break;
334 case 13:
335 /* PC5 */
336 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B5_BIT;
337 break;
338 default:
339 return;
340 }
341
342 volatile __evenaccess uint8_t *pcr = pdr + (PORT0_PCR_ADDR - PORT0_PDR_ADDR);
343
344 switch (obj->dir) {
345 case PIN_INPUT:
346 sil_wrb_mem(pdr, sil_reb_mem(pdr) & ~bit);
347 break;
348 case PIN_OUTPUT:
349 sil_wrb_mem(pdr, sil_reb_mem(pdr) | bit);
350 break;
351 }
352
353 switch (obj->mode) {
354 case PullUp:
355 sil_wrb_mem(pcr, sil_reb_mem(pcr) | bit);
356 break;
357 default:
358 sil_wrb_mem(pcr, sil_reb_mem(pcr) & ~bit);
359 break;
360 }
361}
362
363void gpio_mode(gpio_t *obj, PinMode mode)
364{
365 /* 汎用入出力ポートに設定 */
366 change_pin_function(obj->pin, true);
367
368 obj->mode = mode;
369
370 change_pin_mode(obj);
371}
372
373void gpio_dir(gpio_t *obj, PinDirection direction)
374{
375 /* 汎用入出力ポートに設定 */
376 change_pin_function(obj->pin, true);
377
378 obj->dir = direction;
379
380 change_pin_mode(obj);
381}
382
383void gpio_write(gpio_t *obj, int value)
384{
385 volatile __evenaccess uint8_t *podr;
386 int bit;
387
388 switch (obj->pin) {
389 case 0:
390 /* P21 */
391 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B1_BIT;
392 break;
393 case 1:
394 /* P20 */
395 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B0_BIT;
396 break;
397 case 2:
398 /* P22 */
399 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B2_BIT;
400 break;
401 case 3:
402 /* P23 */
403 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B3_BIT;
404 break;
405 case 4:
406 /* P24 */
407 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B4_BIT;
408 break;
409 case 5:
410 /* P25 */
411 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B5_BIT;
412 break;
413 case 6:
414 /* P32 */
415 podr = PORT3_PODR_ADDR; bit = PORT_PODR_B2_BIT;
416 break;
417 case 7:
418 /* P33 */
419 podr = PORT3_PODR_ADDR; bit = PORT_PODR_B3_BIT;
420 break;
421 case 8:
422 /* PC2 */
423 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B2_BIT;
424 break;
425 case 9:
426 /* PC3 */
427 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B3_BIT;
428 break;
429 case 10:
430 /* PC4 */
431 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B4_BIT;
432 break;
433 case 11:
434 /* PC6 */
435 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B6_BIT;
436 break;
437 case 12:
438 /* PC7 */
439 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B7_BIT;
440 break;
441 case 13:
442 /* PC5 */
443 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B5_BIT;
444 break;
445 default:
446 return;
447 }
448
449 switch (value) {
450 case 0:
451 sil_wrb_mem(podr, sil_reb_mem(podr) & ~bit);
452 break;
453 case 1:
454 sil_wrb_mem(podr, sil_reb_mem(podr) | bit);
455 break;
456 }
457}
458
459int gpio_read(gpio_t *obj)
460{
461 volatile __evenaccess uint8_t *pidr;
462 int bit;
463
464 switch (obj->pin) {
465 case 0:
466 /* P21 */
467 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B1_BIT;
468 break;
469 case 1:
470 /* P20 */
471 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B0_BIT;
472 break;
473 case 2:
474 /* P22 */
475 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B2_BIT;
476 break;
477 case 3:
478 /* P23 */
479 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B3_BIT;
480 break;
481 case 4:
482 /* P24 */
483 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B4_BIT;
484 break;
485 case 5:
486 /* P25 */
487 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B5_BIT;
488 break;
489 case 6:
490 /* P32 */
491 pidr = PORT3_PIDR_ADDR; bit = PORT_PIDR_B2_BIT;
492 break;
493 case 7:
494 /* P33 */
495 pidr = PORT3_PIDR_ADDR; bit = PORT_PIDR_B3_BIT;
496 break;
497 case 8:
498 /* PC2 */
499 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B2_BIT;
500 break;
501 case 9:
502 /* PC3 */
503 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B3_BIT;
504 break;
505 case 10:
506 /* PC4 */
507 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B4_BIT;
508 break;
509 case 11:
510 /* PC6 */
511 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B6_BIT;
512 break;
513 case 12:
514 /* PC7 */
515 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B7_BIT;
516 break;
517 case 13:
518 /* PC5 */
519 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B5_BIT;
520 break;
521 default:
522 return 0;
523 }
524
525 if ((sil_reb_mem(pidr) & bit) != 0) {
526 return 1;
527 }
528 else {
529 return 0;
530 }
531}
532
533void gpio_init_in(gpio_t* gpio, PinName pin)
534{
535 gpio->pin = pin;
536 gpio->dir = PIN_INPUT;
537 gpio->mode = PullDefault;
538
539 /* 汎用入出力ポートに設定 */
540 change_pin_function(gpio->pin, true);
541
542 change_pin_mode(gpio);
543}
544
545void gpio_init_out(gpio_t* gpio, PinName pin)
546{
547 gpio->pin = pin;
548 gpio->dir = PIN_OUTPUT;
549 gpio->mode = PullDefault;
550
551 /* 汎用入出力ポートに設定 */
552 change_pin_function(gpio->pin, true);
553
554 change_pin_mode(gpio);
555}
556
557#define arduino_ad_table_count 64
558static uint16_t arduino_ad_table[8][arduino_ad_table_count];
559static int arduino_ad_pos = 0;
560static uint32_t arduino_ad_avelage[8];
561
562void analogin_init(analogin_t *obj, PinName pin)
563{
564 /*
565 * モジュールストップ機能の設定(S12AD)
566 */
567 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */
568 sil_wrw_mem(SYSTEM_MSTPCRA_ADDR,
569 sil_rew_mem(SYSTEM_MSTPCRA_ADDR) & ~SYSTEM_MSTPCRA_MSTPA17_BIT);
570 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */
571
572 /* 12bitADC初期化 */
573 sil_wrh_mem(S12AD_ADEXICR_ADDR, 0x0000); /* 温度センサ出力、内部基準電圧非選択 */
574 sil_wrh_mem(S12AD_ADANS0_ADDR, 0x00FF); /* 変換ポートAN000~AN007選択、AN008~AN015非選択 */
575 sil_wrh_mem(S12AD_ADANS1_ADDR, 0x0000); /* 変換ポートAN016~AN020非選択 */
576}
577
578uint16_t analogin_read_u16(analogin_t *obj)
579{
580 uint16_t result = 0;
581
582 switch (obj->pin) {
583 case 14:
584 /* *value = sil_reh_mem(S12AD_ADDR0_ADDR); */
585 result = (arduino_ad_avelage[0] / (arduino_ad_table_count));
586 break;
587 case 15:
588 /* *value = sil_reh_mem(S12AD_ADDR1_ADDR); */
589 result = (arduino_ad_avelage[1] / (arduino_ad_table_count));
590 break;
591 case 16:
592 /* *value = sil_reh_mem(S12AD_ADDR2_ADDR); */
593 result = (arduino_ad_avelage[2] / (arduino_ad_table_count));
594 break;
595 case 17:
596 /* *value = sil_reh_mem(S12AD_ADDR3_ADDR); */
597 result = (arduino_ad_avelage[3] / (arduino_ad_table_count));
598 break;
599 case 18:
600 /* *value = sil_reh_mem(S12AD_ADDR4_ADDR); */
601 result = (arduino_ad_avelage[4] / (arduino_ad_table_count));
602 break;
603 case 19:
604 /* *value = sil_reh_mem(S12AD_ADDR5_ADDR); */
605 result = (arduino_ad_avelage[5] / (arduino_ad_table_count));
606 break;
607 case 20:
608 /* *value = sil_reh_mem(S12AD_ADDR6_ADDR); */
609 result = (arduino_ad_avelage[6] / (arduino_ad_table_count));
610 break;
611 case 21:
612 /* *value = sil_reh_mem(S12AD_ADDR7_ADDR); */
613 result = (arduino_ad_avelage[7] / (arduino_ad_table_count));
614 break;
615 }
616
617 return 65535 - ((result << 4) | (result >> 8));
618}
619
620void arduino_tick()
621{
622 static volatile __evenaccess uint16_t *const regs[8] = {
623 S12AD_ADDR0_ADDR,
624 S12AD_ADDR1_ADDR,
625 S12AD_ADDR2_ADDR,
626 S12AD_ADDR3_ADDR,
627 S12AD_ADDR4_ADDR,
628 S12AD_ADDR5_ADDR,
629 S12AD_ADDR6_ADDR,
630 S12AD_ADDR7_ADDR
631 };
632 uint16_t ad_value;
633 int i;
634
635 /* ADCの変換結果取得 */
636 if ((sil_reb_mem(S12AD_ADCSR_ADDR) & S12AD_ADCSR_ADST_BIT) == 0) {
637 for (i = 0; i < 8; i++) {
638 arduino_ad_avelage[i] -= arduino_ad_table[i][arduino_ad_pos];
639 ad_value = sil_reh_mem(regs[i]);
640 arduino_ad_table[i][arduino_ad_pos] = ad_value;
641 arduino_ad_avelage[i] += ad_value;
642 }
643
644 arduino_ad_pos++;
645 if (arduino_ad_pos >= arduino_ad_table_count) {
646 arduino_ad_pos = 0;
647 }
648
649 /* 変換開始(シングルスキャンモード) */
650 sil_wrb_mem(S12AD_ADCSR_ADDR, S12AD_ADCSR_ADST_BIT);
651 }
652}
653
654void analogout_init(dac_t *obj, PinName pin)
655{
656}
657
658void analogout_write_u16(dac_t *obj, uint16_t value)
659{
660}
661
662void pwmout_init(pwmout_t* obj, PinName pin)
663{
664 /* PWM出力(490Hz) */
665 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */
666 sil_wrw_mem(SYSTEM_MSTPCRA_ADDR,
667 sil_rew_mem(SYSTEM_MSTPCRA_ADDR) & ~SYSTEM_MSTPCRA_MSTPA13_BIT); /* TPU0~TPU5 */
668 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */
669
670 /* カウンタクロックの選択、カウンタクリア要因の選択 */
671 sil_wrb_mem(TPU0_TCR_ADDR, (1 << TPU_TCR_TPSC_OFFSET) | (1 << TPU_TCR_CKEG_OFFSET)
672 | (1 << TPU_TCR_CCLR_OFFSET));
673 sil_wrb_mem(TPU3_TCR_ADDR, (1 << TPU_TCR_TPSC_OFFSET) | (1 << TPU_TCR_CKEG_OFFSET)
674 | (3 << TPU_TCR_CCLR_OFFSET));
675 sil_wrb_mem(TPU4_TCR_ADDR, (1 << TPU_TCR_TPSC_OFFSET) | (1 << TPU_TCR_CKEG_OFFSET)
676 | (3 << TPU_TCR_CCLR_OFFSET));
677 /* 波形出力レベルの選択 */
678 sil_wrb_mem(TPU0_TIORL_ADDR, (5 << TPU_TIORL_IOC_OFFSET) | (5 << TPU_TIORL_IOD_OFFSET));
679 sil_wrb_mem(TPU3_TIORH_ADDR, (5 << TPU_TIORL_IOA_OFFSET) | (5 << TPU_TIORL_IOB_OFFSET));
680 sil_wrb_mem(TPU3_TIORL_ADDR, (5 << TPU_TIORL_IOC_OFFSET) | (5 << TPU_TIORL_IOD_OFFSET));
681 sil_wrb_mem(TPU4_TIOR_ADDR, (5 << TPU_TIORL_IOA_OFFSET) | (5 << TPU_TIORL_IOB_OFFSET));
682 /* TGRyの設定 */
683 sil_wrh_mem(TPU0_TGRA_ADDR, TPU_BASE_COUNTER);
684 sil_wrh_mem(TPU0_TGRC_ADDR, 0);
685 sil_wrh_mem(TPU0_TGRD_ADDR, 0);
686 sil_wrh_mem(TPU3_TGRA_ADDR, 0);
687 sil_wrh_mem(TPU3_TGRB_ADDR, 0);
688 sil_wrh_mem(TPU3_TGRC_ADDR, 0);
689 sil_wrh_mem(TPU3_TGRD_ADDR, 0);
690 sil_wrh_mem(TPU4_TGRA_ADDR, 0);
691 sil_wrh_mem(TPU4_TGRB_ADDR, 0);
692 /* PWMモード2の設定 */
693 sil_wrb_mem(TPU0_TMDR_ADDR, 3);
694 sil_wrb_mem(TPU3_TMDR_ADDR, 3);
695 sil_wrb_mem(TPU4_TMDR_ADDR, 3);
696 /* 同期動作設定 */
697 sil_wrb_mem(TPUA_TSYR_ADDR, TPU_TSYR_SYNC0_BIT | TPU_TSYR_SYNC3_BIT | TPU_TSYR_SYNC4_BIT);
698 /* カウント動作開始 */
699 sil_wrb_mem(TPUA_TSTR_ADDR, TPU_TSTR_CST0_BIT | TPU_TSTR_CST3_BIT | TPU_TSTR_CST4_BIT);
700}
701
702void pwmout_free(pwmout_t* obj)
703{
704 /* カウント動作終了 */
705 sil_wrb_mem(TPUA_TSTR_ADDR, 0);
706}
707
708void pwmout_period_us(pwmout_t* obj, int us)
709{
710}
711
712void pwmout_pulsewidth_us(pwmout_t* obj, int us)
713{
714}
715
716void serial_init(serial_t *obj, PinName tx, PinName rx)
717{
718}
719
720void serial_free(serial_t *obj)
721{
722}
723
724void serial_baud(serial_t *obj, int baudrate)
725{
726}
727
728void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
729{
730}
731
732int serial_getc(serial_t *obj)
733{
734 return 0;
735}
736
737void serial_putc(serial_t *obj, int c)
738{
739}
740
741int serial_readable(serial_t *obj)
742{
743 return 0;
744}
745
746int serial_writable(serial_t *obj)
747{
748 return 0;
749}
750
751void i2c_init(i2c_t *obj, PinName sda, PinName scl)
752{
753}
754
755void i2c_frequency(i2c_t *obj, int hz)
756{
757}
758
759int i2c_start(i2c_t *obj)
760{
761 return 0;
762}
763
764int i2c_stop(i2c_t *obj)
765{
766 return 0;
767}
768
769int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
770{
771 return 0;
772}
773
774int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
775{
776 return 0;
777}
778
779int i2c_byte_read(i2c_t *obj, int last)
780{
781 return 0;
782}
783
784int i2c_byte_write(i2c_t *obj, int data)
785{
786 return 0;
787}
788
789void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel)
790{
791}
792
793void spi_free(spi_t *obj)
794{
795}
796
797void spi_format(spi_t *obj, int bits, int mode, int slave)
798{
799}
800
801void spi_frequency(spi_t *obj, int hz)
802{
803}
804
805int spi_master_write(spi_t *obj, int value)
806{
807 return 0;
808}
809
810uint8_t DecToBcd(uint8_t value)
811{
812 return ((value / 10) << 4) | (value % 10);
813}
814
815uint8_t BcdToDec(uint8_t value)
816{
817 return (10 * (value >> 4)) | (value & 0x0F);
818}
819
820void rtc_init(void)
821{
822}
823
824void rtc_free(void)
825{
826}
827
828int rtc_isenabled(void)
829{
830 return 1;
831}
832
833long long __tm_to_secs(const struct tm *tm);
834int __secs_to_tm(long long t, struct tm *tm);
835
836time_t rtc_read(void)
837{
838 struct tm tm = { 0 };
839 tm.tm_year = 2000 - 1900 + BcdToDec(sil_reb_mem((uint8_t *)RTC_RYRCNT_ADDR));
840 tm.tm_mon = BcdToDec(sil_reb_mem((uint8_t *)RTC_RMONCNT_ADDR)) - 1;
841 tm.tm_mday = BcdToDec(sil_reb_mem((uint8_t *)RTC_RDAYCNT_ADDR));
842 tm.tm_hour = BcdToDec(sil_reb_mem((uint8_t *)RTC_RHRCNT_ADDR));
843 tm.tm_min = BcdToDec(sil_reb_mem((uint8_t *)RTC_RMINCNT_ADDR));
844 tm.tm_sec = BcdToDec(sil_reb_mem((uint8_t *)RTC_RSECCNT_ADDR));
845 return __tm_to_secs(&tm);
846}
847
848void rtc_write(time_t t)
849{
850 struct tm tm;
851
852 __secs_to_tm(t, &tm);
853 sil_wrb_mem((uint8_t *)RTC_RYRCNT_ADDR, DecToBcd(tm.tm_year + 1900 - 2000));
854 sil_wrb_mem((uint8_t *)RTC_RMONCNT_ADDR, DecToBcd(tm.tm_mon + 1));
855 sil_wrb_mem((uint8_t *)RTC_RDAYCNT_ADDR, DecToBcd(tm.tm_mday));
856 sil_wrb_mem((uint8_t *)RTC_RHRCNT_ADDR, DecToBcd(tm.tm_hour));
857 sil_wrb_mem((uint8_t *)RTC_RMINCNT_ADDR, DecToBcd(tm.tm_min));
858 sil_wrb_mem((uint8_t *)RTC_RSECCNT_ADDR, DecToBcd(tm.tm_sec));
859}
Note: See TracBrowser for help on using the repository browser.