source: uKadecot/trunk/src/ukadecot/arduino.c@ 108

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

MIMEプロパティの変更

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr; charset=SHIFT_JIS
File size: 17.7 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2014 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: arduino.c 108 2015-06-11 09:15:46Z coas-nagasima $
36 */
37
38/*
39 * サンプルプログラム(1)の本体
40 */
41
42#include <kernel.h>
43#include <t_syslog.h>
44#include <sil.h>
45#include "arduino.h"
46#ifdef __RX
47#include "rx630_ccrx/rx630.h"
48#else
49#include "rx630_msvc/rx630.h"
50#endif
51
52/* PWM出力(490Hz) */
53#define TPU_BASE_COUNTER (48000000 / 4 / 490)
54
55void arduino_init()
56{
57 /*
58 * モジュールストップ機能の設定(S12AD)
59 */
60 sil_wrh_mem((uint16_t *)SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */
61 sil_wrw_mem((uint32_t *)SYSTEM_MSTPCRA_ADDR,
62 sil_rew_mem((uint32_t *)SYSTEM_MSTPCRA_ADDR) & ~SYSTEM_MSTPCRA_MSTPA17_BIT);
63 sil_wrh_mem((uint16_t *)SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */
64
65 /* 12bitADC初期化 */
66 sil_wrh_mem((uint16_t *)S12AD_ADEXICR_ADDR, 0x0000); /* 温度センサ出力、内部基準電圧非選択 */
67 sil_wrh_mem((uint16_t *)S12AD_ADANS0_ADDR, 0x00FF); /* 変換ポートAN000〜AN007選択、AN008〜AN015非選択 */
68 sil_wrh_mem((uint16_t *)S12AD_ADANS1_ADDR, 0x0000); /* 変換ポートAN016〜AN020非選択 */
69
70 /* PWM出力(490Hz) */
71 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */
72 sil_wrw_mem(SYSTEM_MSTPCRA_ADDR,
73 sil_rew_mem(SYSTEM_MSTPCRA_ADDR) & ~SYSTEM_MSTPCRA_MSTPA13_BIT); /* TPU0〜TPU5 */
74 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */
75
76 /* カウンタクロックの選択、カウンタクリア要因の選択 */
77 sil_wrb_mem(TPU0_TCR_ADDR, (1 << TPU_TCR_TPSC_OFFSET) | (1 << TPU_TCR_CKEG_OFFSET)
78 | (1 << TPU_TCR_CCLR_OFFSET));
79 sil_wrb_mem(TPU3_TCR_ADDR, (1 << TPU_TCR_TPSC_OFFSET) | (1 << TPU_TCR_CKEG_OFFSET)
80 | (3 << TPU_TCR_CCLR_OFFSET));
81 sil_wrb_mem(TPU4_TCR_ADDR, (1 << TPU_TCR_TPSC_OFFSET) | (1 << TPU_TCR_CKEG_OFFSET)
82 | (3 << TPU_TCR_CCLR_OFFSET));
83 /* 波形出力レベルの選択 */
84 sil_wrb_mem(TPU0_TIORL_ADDR, (5 << TPU_TIORL_IOC_OFFSET) | (5 << TPU_TIORL_IOD_OFFSET));
85 sil_wrb_mem(TPU3_TIORH_ADDR, (5 << TPU_TIORL_IOA_OFFSET) | (5 << TPU_TIORL_IOB_OFFSET));
86 sil_wrb_mem(TPU3_TIORL_ADDR, (5 << TPU_TIORL_IOC_OFFSET) | (5 << TPU_TIORL_IOD_OFFSET));
87 sil_wrb_mem(TPU4_TIOR_ADDR, (5 << TPU_TIORL_IOA_OFFSET) | (5 << TPU_TIORL_IOB_OFFSET));
88 /* TGRyの設定 */
89 sil_wrh_mem(TPU0_TGRA_ADDR, TPU_BASE_COUNTER);
90 sil_wrh_mem(TPU0_TGRC_ADDR, 0);
91 sil_wrh_mem(TPU0_TGRD_ADDR, 0);
92 sil_wrh_mem(TPU3_TGRA_ADDR, 0);
93 sil_wrh_mem(TPU3_TGRB_ADDR, 0);
94 sil_wrh_mem(TPU3_TGRC_ADDR, 0);
95 sil_wrh_mem(TPU3_TGRD_ADDR, 0);
96 sil_wrh_mem(TPU4_TGRA_ADDR, 0);
97 sil_wrh_mem(TPU4_TGRB_ADDR, 0);
98 /* PWMモード2の設定 */
99 sil_wrb_mem(TPU0_TMDR_ADDR, 3);
100 sil_wrb_mem(TPU3_TMDR_ADDR, 3);
101 sil_wrb_mem(TPU4_TMDR_ADDR, 3);
102 /* 同期動作設定 */
103 sil_wrb_mem(TPUA_TSYR_ADDR, TPU_TSYR_SYNC0_BIT | TPU_TSYR_SYNC3_BIT | TPU_TSYR_SYNC4_BIT);
104 /* カウント動作開始 */
105 sil_wrb_mem(TPUA_TSTR_ADDR, TPU_TSTR_CST0_BIT | TPU_TSTR_CST3_BIT | TPU_TSTR_CST4_BIT);
106}
107
108static bool_t pin_function_table[8] = {
109 true, true, true, true, true, true, true, true
110};
111
112static ER change_pin_function(int pin, bool_t gpio)
113{
114 ER result = E_PAR;
115
116 if((pin < 0) || (pin >= 8))
117 return E_PAR;
118
119 if(pin_function_table[pin] == gpio)
120 return E_OK;
121
122 /* 汎用入出力ポートに設定 */
123 switch(pin){
124 case 0:
125 /* P21 */
126 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B1_BIT);
127 break;
128 case 1:
129 /* P20 */
130 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B0_BIT);
131 break;
132 case 2:
133 /* P22 */
134 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B2_BIT);
135 break;
136 case 3:
137 /* P23 */
138 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B3_BIT);
139 break;
140 case 4:
141 /* P24 */
142 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B4_BIT);
143 break;
144 case 5:
145 /* P25 */
146 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B5_BIT);
147 break;
148 case 6:
149 /* P32 */
150 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) & ~PORT_PMR_B2_BIT);
151 break;
152 case 7:
153 /* P33 */
154 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) & ~PORT_PMR_B3_BIT);
155 break;
156 }
157
158 /* 書き込みプロテクトレジスタの設定 PFSWEビットへの書き込みを許可 */
159 sil_wrb_mem((uint8_t *)MPC_PWPR_ADDR, 0x00);
160 /* 書き込みプロテクトレジスタの設定 PxxFSレジスタへの書き込みを許可 */
161 sil_wrb_mem((uint8_t *)MPC_PWPR_ADDR, 0x40);
162
163 switch(pin){
164 /* P21/TIOCA3 */
165 case 0:
166 if(gpio){
167 /* P21端子機能制御レジスタ P21とする */
168 sil_wrb_mem((uint8_t *)MPC_P21PFS_ADDR, 0x00);
169 }
170 else{
171 /* P21端子機能制御レジスタ TIOCA3とする */
172 sil_wrb_mem((uint8_t *)MPC_P21PFS_ADDR, 0x03);
173 }
174 result = E_OK;
175 break;
176 /* P20/TIOCB3 */
177 case 1:
178 if(gpio){
179 /* P20端子機能制御レジスタ P20とする */
180 sil_wrb_mem((uint8_t *)MPC_P20PFS_ADDR, 0x00);
181 }
182 else{
183 /* P20端子機能制御レジスタ TIOCB3とする */
184 sil_wrb_mem((uint8_t *)MPC_P20PFS_ADDR, 0x03);
185 }
186 result = E_OK;
187 break;
188 /* P22/TIOCC3 */
189 case 2:
190 if(gpio){
191 /* P22端子機能制御レジスタ P22とする */
192 sil_wrb_mem((uint8_t *)MPC_P22PFS_ADDR, 0x00);
193 }
194 else{
195 /* P22端子機能制御レジスタ TIOCC3とする */
196 sil_wrb_mem((uint8_t *)MPC_P22PFS_ADDR, 0x03);
197 }
198 result = E_OK;
199 break;
200 /* P23/TIOCD3 */
201 case 3:
202 if(gpio){
203 /* P23端子機能制御レジスタ P23とする */
204 sil_wrb_mem((uint8_t *)MPC_P23PFS_ADDR, 0x00);
205 }
206 else{
207 /* P23端子機能制御レジスタ TIOCD3とする */
208 sil_wrb_mem((uint8_t *)MPC_P23PFS_ADDR, 0x03);
209 }
210 result = E_OK;
211 break;
212 /* P24/TIOCB4 */
213 case 4:
214 if(gpio){
215 /* P24端子機能制御レジスタ P24とする */
216 sil_wrb_mem((uint8_t *)MPC_P24PFS_ADDR, 0x00);
217 }
218 else{
219 /* P24端子機能制御レジスタ TIOCB4とする */
220 sil_wrb_mem((uint8_t *)MPC_P24PFS_ADDR, 0x03);
221 }
222 result = E_OK;
223 break;
224 /* P25/TIOCA4 */
225 case 5:
226 if(gpio){
227 /* P25端子機能制御レジスタ P25とする */
228 sil_wrb_mem((uint8_t *)MPC_P25PFS_ADDR, 0x00);
229 }
230 else{
231 /* P25端子機能制御レジスタ TIOCA4とする */
232 sil_wrb_mem((uint8_t *)MPC_P25PFS_ADDR, 0x03);
233 }
234 result = E_OK;
235 break;
236 /* P32/TIOCC0 */
237 case 6:
238 if(gpio){
239 /* P32端子機能制御レジスタ P32とする */
240 sil_wrb_mem((uint8_t *)MPC_P32PFS_ADDR, 0x00);
241 }
242 else{
243 /* P32端子機能制御レジスタ TIOCC0とする */
244 sil_wrb_mem((uint8_t *)MPC_P32PFS_ADDR, 0x03);
245 }
246 result = E_OK;
247 break;
248 /* P33/TIOCD0 */
249 case 7:
250 if(gpio){
251 /* P33端子機能制御レジスタ P33とする */
252 sil_wrb_mem((uint8_t *)MPC_P33PFS_ADDR, 0x00);
253 }
254 else{
255 /* P33端子機能制御レジスタ TIOCD0とする */
256 sil_wrb_mem((uint8_t *)MPC_P33PFS_ADDR, 0x03);
257 }
258 result = E_OK;
259 break;
260 }
261
262 /* 書き込みプロテクトレジスタの設定 書き込みを禁止 */
263 sil_wrb_mem((uint8_t *)MPC_PWPR_ADDR, 0x80);
264
265 /* 機能ポートに設定 */
266 if(!gpio){
267 switch(pin){
268 /* P21/TIOCA3 */
269 case 0:
270 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B1_BIT);
271 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B1_BIT);
272 break;
273 /* P20/TIOCB3 */
274 case 1:
275 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B0_BIT);
276 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B0_BIT);
277 break;
278 /* P22/TIOCC3 */
279 case 2:
280 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B2_BIT);
281 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B2_BIT);
282 break;
283 /* P23/TIOCD3 */
284 case 3:
285 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B3_BIT);
286 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B3_BIT);
287 break;
288 /* P24/TIOCB4 */
289 case 4:
290 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B4_BIT);
291 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B4_BIT);
292 break;
293 /* P25/TIOCA4 */
294 case 5:
295 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B5_BIT);
296 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B5_BIT);
297 break;
298 /* P32/TIOCC0 */
299 case 6:
300 sil_wrb_mem(PORT3_PDR_ADDR, sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B2_BIT);
301 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B2_BIT);
302 break;
303 /* P33/TIOCD0 */
304 case 7:
305 sil_wrb_mem(PORT3_PDR_ADDR, sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B3_BIT);
306 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B3_BIT);
307 break;
308 }
309 }
310
311 pin_function_table[pin] = gpio;
312
313 return result;
314}
315
316static ER change_pin_mode(arduino_pin_mode_t mode, volatile uint8_t *pdr, int bit)
317{
318 volatile uint8_t *pcr = pdr + (PORT0_PCR_ADDR - PORT0_PDR_ADDR);
319
320 switch(mode){
321 case ARDUINO_PIN_MODE_INPUT:
322 sil_wrb_mem(pdr, sil_reb_mem(pdr) & ~bit);
323 sil_wrb_mem(pcr, sil_reb_mem(pcr) & ~bit);
324 return E_OK;
325 case ARDUINO_PIN_MODE_OUTPUT:
326 sil_wrb_mem(pdr, sil_reb_mem(pdr) | bit);
327 return E_OK;
328 case ARDUINO_PIN_MODE_INPUT_PULLUP:
329 sil_wrb_mem(pdr, sil_reb_mem(pdr) & ~bit);
330 sil_wrb_mem(pcr, sil_reb_mem(pcr) | bit);
331 return E_OK;
332 }
333
334 return E_PAR;
335}
336
337ER arduino_pinMode(int pin, arduino_pin_mode_t mode)
338{
339 /* 汎用入出力ポートに設定 */
340 change_pin_function(pin, true);
341
342 switch(pin){
343 case 0:
344 /* P21 */
345 return change_pin_mode(mode, PORT2_PDR_ADDR, PORT_PDR_B1_BIT);
346 case 1:
347 /* P20 */
348 return change_pin_mode(mode, PORT2_PDR_ADDR, PORT_PDR_B0_BIT);
349 case 2:
350 /* P22 */
351 return change_pin_mode(mode, PORT2_PDR_ADDR, PORT_PDR_B2_BIT);
352 case 3:
353 /* P23 */
354 return change_pin_mode(mode, PORT2_PDR_ADDR, PORT_PDR_B3_BIT);
355 case 4:
356 /* P24 */
357 return change_pin_mode(mode, PORT2_PDR_ADDR, PORT_PDR_B4_BIT);
358 case 5:
359 /* P25 */
360 return change_pin_mode(mode, PORT2_PDR_ADDR, PORT_PDR_B5_BIT);
361 case 6:
362 /* P32 */
363 return change_pin_mode(mode, PORT3_PDR_ADDR, PORT_PDR_B2_BIT);
364 case 7:
365 /* P33 */
366 return change_pin_mode(mode, PORT3_PDR_ADDR, PORT_PDR_B3_BIT);
367 case 8:
368 /* PC2 */
369 return change_pin_mode(mode, PORTC_PDR_ADDR, PORT_PDR_B2_BIT);
370 case 9:
371 /* PC3 */
372 return change_pin_mode(mode, PORTC_PDR_ADDR, PORT_PDR_B3_BIT);
373 case 10:
374 /* PC4 */
375 return change_pin_mode(mode, PORTC_PDR_ADDR, PORT_PDR_B4_BIT);
376 case 11:
377 /* PC6 */
378 return change_pin_mode(mode, PORTC_PDR_ADDR, PORT_PDR_B6_BIT);
379 case 12:
380 /* PC7 */
381 return change_pin_mode(mode, PORTC_PDR_ADDR, PORT_PDR_B7_BIT);
382 case 13:
383 /* PC5 */
384 return change_pin_mode(mode, PORTC_PDR_ADDR, PORT_PDR_B5_BIT);
385 }
386
387 return E_PAR;
388}
389
390static ER write_gpio(arduino_digital_value_t value, volatile uint8_t *podr, int bit)
391{
392 switch(value){
393 case ARDUINO_DIGITAL_VALUE_HIGH:
394 sil_wrb_mem(podr, sil_reb_mem(podr) | bit);
395 return E_OK;
396 case ARDUINO_DIGITAL_VALUE_LOW:
397 sil_wrb_mem(podr, sil_reb_mem(podr) & ~bit);
398 return E_OK;
399 }
400
401 return E_PAR;
402}
403
404ER arduino_digitalWrite(int pin, arduino_digital_value_t value)
405{
406 switch(pin){
407 case 0:
408 /* P21 */
409 return write_gpio(value, PORT2_PODR_ADDR, PORT_PODR_B1_BIT);
410 case 1:
411 /* P20 */
412 return write_gpio(value, PORT2_PODR_ADDR, PORT_PODR_B0_BIT);
413 case 2:
414 /* P22 */
415 return write_gpio(value, PORT2_PODR_ADDR, PORT_PODR_B2_BIT);
416 case 3:
417 /* P23 */
418 return write_gpio(value, PORT2_PODR_ADDR, PORT_PODR_B3_BIT);
419 case 4:
420 /* P24 */
421 return write_gpio(value, PORT2_PODR_ADDR, PORT_PODR_B4_BIT);
422 case 5:
423 /* P25 */
424 return write_gpio(value, PORT2_PODR_ADDR, PORT_PODR_B5_BIT);
425 case 6:
426 /* P32 */
427 return write_gpio(value, PORT3_PODR_ADDR, PORT_PODR_B2_BIT);
428 case 7:
429 /* P33 */
430 return write_gpio(value, PORT3_PODR_ADDR, PORT_PODR_B3_BIT);
431 case 8:
432 /* PC2 */
433 return write_gpio(value, PORTC_PODR_ADDR, PORT_PODR_B2_BIT);
434 case 9:
435 /* PC3 */
436 return write_gpio(value, PORTC_PODR_ADDR, PORT_PODR_B3_BIT);
437 case 10:
438 /* PC4 */
439 return write_gpio(value, PORTC_PODR_ADDR, PORT_PODR_B4_BIT);
440 case 11:
441 /* PC6 */
442 return write_gpio(value, PORTC_PODR_ADDR, PORT_PODR_B6_BIT);
443 case 12:
444 /* PC7 */
445 return write_gpio(value, PORTC_PODR_ADDR, PORT_PODR_B7_BIT);
446 case 13:
447 /* PC5 */
448 return write_gpio(value, PORTC_PODR_ADDR, PORT_PODR_B5_BIT);
449 }
450
451 return E_PAR;
452}
453
454static ER read_gpio(volatile uint8_t *pidr, int bit, arduino_digital_value_t *result)
455{
456 if ((sil_reb_mem(pidr) & bit) != 0) {
457 *result = ARDUINO_DIGITAL_VALUE_HIGH;
458 return E_OK;
459 }
460 else {
461 *result = ARDUINO_DIGITAL_VALUE_LOW;
462 return E_OK;
463 }
464}
465
466ER arduino_digitalRead(int pin, arduino_digital_value_t *result)
467{
468 switch(pin){
469 case 0:
470 /* P21 */
471 return read_gpio(PORT2_PIDR_ADDR, PORT_PIDR_B1_BIT, result);
472 case 1:
473 /* P20 */
474 return read_gpio(PORT2_PIDR_ADDR, PORT_PIDR_B0_BIT, result);
475 case 2:
476 /* P22 */
477 return read_gpio(PORT2_PIDR_ADDR, PORT_PIDR_B2_BIT, result);
478 case 3:
479 /* P23 */
480 return read_gpio(PORT2_PIDR_ADDR, PORT_PIDR_B3_BIT, result);
481 case 4:
482 /* P24 */
483 return read_gpio(PORT2_PIDR_ADDR, PORT_PIDR_B4_BIT, result);
484 case 5:
485 /* P25 */
486 return read_gpio(PORT2_PIDR_ADDR, PORT_PIDR_B5_BIT, result);
487 case 6:
488 /* P32 */
489 return read_gpio(PORT3_PIDR_ADDR, PORT_PIDR_B2_BIT, result);
490 case 7:
491 /* P33 */
492 return read_gpio(PORT3_PIDR_ADDR, PORT_PIDR_B3_BIT, result);
493 case 8:
494 /* PC2 */
495 return read_gpio(PORTC_PIDR_ADDR, PORT_PIDR_B2_BIT, result);
496 case 9:
497 /* PC3 */
498 return read_gpio(PORTC_PIDR_ADDR, PORT_PIDR_B3_BIT, result);
499 case 10:
500 /* PC4 */
501 return read_gpio(PORTC_PIDR_ADDR, PORT_PIDR_B4_BIT, result);
502 case 11:
503 /* PC6 */
504 return read_gpio(PORTC_PIDR_ADDR, PORT_PIDR_B6_BIT, result);
505 case 12:
506 /* PC7 */
507 return read_gpio(PORTC_PIDR_ADDR, PORT_PIDR_B7_BIT, result);
508 case 13:
509 /* PC5 */
510 return read_gpio(PORTC_PIDR_ADDR, PORT_PIDR_B5_BIT, result);
511 }
512
513 return E_PAR;
514}
515
516#define arduino_ad_table_count 64
517static uint16_t arduino_ad_table[8][arduino_ad_table_count];
518static int arduino_ad_pos = 0;
519static uint32_t arduino_ad_avelage[8];
520
521ER arduino_analogRead(int pin, int *value)
522{
523 switch(pin){
524 case 14:
525 /* *value = sil_reh_mem((uint16_t *)S12AD_ADDR0_ADDR); */
526 *value = 1023 - (arduino_ad_avelage[0] / (arduino_ad_table_count * 4/*12bit→10bit*/));
527 return E_OK;
528 case 15:
529 /* *value = sil_reh_mem((uint16_t *)S12AD_ADDR1_ADDR); */
530 *value = 1023 - (arduino_ad_avelage[1] / (arduino_ad_table_count * 4/*12bit→10bit*/));
531 return E_OK;
532 case 16:
533 /* *value = sil_reh_mem((uint16_t *)S12AD_ADDR2_ADDR); */
534 *value = 1023 - (arduino_ad_avelage[2] / (arduino_ad_table_count * 4/*12bit→10bit*/));
535 return E_OK;
536 case 17:
537 /* *value = sil_reh_mem((uint16_t *)S12AD_ADDR3_ADDR); */
538 *value = 1023 - (arduino_ad_avelage[3] / (arduino_ad_table_count * 4/*12bit→10bit*/));
539 return E_OK;
540 case 18:
541 /* *value = sil_reh_mem((uint16_t *)S12AD_ADDR4_ADDR); */
542 *value = 1023 - (arduino_ad_avelage[4] / (arduino_ad_table_count * 4/*12bit→10bit*/));
543 return E_OK;
544 case 19:
545 /* *value = sil_reh_mem((uint16_t *)S12AD_ADDR5_ADDR); */
546 *value = 1023 - (arduino_ad_avelage[5] / (arduino_ad_table_count * 4/*12bit→10bit*/));
547 return E_OK;
548 case 20:
549 /* *value = sil_reh_mem((uint16_t *)S12AD_ADDR6_ADDR); */
550 *value = 1023 - (arduino_ad_avelage[6] / (arduino_ad_table_count * 4/*12bit→10bit*/));
551 return E_OK;
552 case 21:
553 /* *value = sil_reh_mem((uint16_t *)S12AD_ADDR7_ADDR); */
554 *value = 1023 - (arduino_ad_avelage[7] / (arduino_ad_table_count * 4/*12bit→10bit*/));
555 return E_OK;
556 }
557
558 return E_PAR;
559}
560
561ER arduino_analogWrite(int pin, int value)
562{
563 change_pin_function(pin, false);
564
565 value = (value * TPU_BASE_COUNTER) / 255;
566
567 switch(pin){
568 case 0:
569 /* P21/TIOCA3 */
570 sil_wrh_mem(TPU3_TGRA_ADDR, value);
571 return E_OK;
572 case 1:
573 /* P20/TIOCB3 */
574 sil_wrh_mem(TPU3_TGRB_ADDR, value);
575 return E_OK;
576 case 2:
577 /* P22/TIOCC3 */
578 sil_wrh_mem(TPU3_TGRC_ADDR, value);
579 return E_OK;
580 case 3:
581 /* P23/TIOCD3 */
582 sil_wrh_mem(TPU3_TGRD_ADDR, value);
583 return E_OK;
584 case 4:
585 /* P24/TIOCB4 */
586 sil_wrh_mem(TPU4_TGRB_ADDR, value);
587 return E_OK;
588 case 5:
589 /* P25/TIOCA4 */
590 sil_wrh_mem(TPU4_TGRA_ADDR, value);
591 return E_OK;
592 case 6:
593 /* P32/TIOCC0 */
594 sil_wrh_mem(TPU0_TGRC_ADDR, value);
595 return E_OK;
596 case 7:
597 /* P33/TIOCD0 */
598 sil_wrh_mem(TPU0_TGRD_ADDR, value);
599 return E_OK;
600 }
601
602 return E_PAR;
603}
604
605void arduino_tick()
606{
607 static volatile uint16_t *const regs[8] = {
608 S12AD_ADDR0_ADDR,
609 S12AD_ADDR1_ADDR,
610 S12AD_ADDR2_ADDR,
611 S12AD_ADDR3_ADDR,
612 S12AD_ADDR4_ADDR,
613 S12AD_ADDR5_ADDR,
614 S12AD_ADDR6_ADDR,
615 S12AD_ADDR7_ADDR
616 };
617 uint16_t ad_value;
618 int i;
619
620 /* ADCの変換結果取得 */
621 if((sil_reb_mem((uint8_t *)S12AD_ADCSR_ADDR) & S12AD_ADCSR_ADST_BIT) == 0){
622 for (i = 0; i < 8; i++){
623 arduino_ad_avelage[i] -= arduino_ad_table[i][arduino_ad_pos];
624 ad_value = sil_reh_mem(regs[i]);
625 arduino_ad_table[i][arduino_ad_pos] = ad_value;
626 arduino_ad_avelage[i] += ad_value;
627 }
628
629 arduino_ad_pos++;
630 if(arduino_ad_pos >= arduino_ad_table_count){
631 arduino_ad_pos = 0;
632 }
633
634 /* 変換開始(シングルスキャンモード) */
635 sil_wrb_mem((uint8_t *)S12AD_ADCSR_ADDR, S12AD_ADCSR_ADST_BIT);
636 }
637}
Note: See TracBrowser for help on using the repository browser.