/* * TOPPERS ECHONET Lite Communication Middleware * * Copyright (C) 2014-2017 Cores Co., Ltd. Japan * * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー * スコード中に含まれていること. * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 * の無保証規定を掲載すること. * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ * と. * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 * 作権表示,この利用条件および下記の無保証規定を掲載すること. * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに * 報告すること. * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを * 免責すること. * * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ * の責任を負わない. * * @(#) $Id$ */ #include "shellif.h" #include #include #include #include #include "rx630.h" #include "ff.h" /* PWM出力(490Hz) */ #define TPU_BASE_COUNTER (48000000 / 4 / 490) void mbed_api_init() { } void wait_ms(int ms) { dly_tsk(ms * 1000); } uint32_t us_ticker_read(void) { SYSTIM result; get_tim(&result); return result; } void gpio_init(gpio_t *obj, PinName pin) { } static bool_t pin_function_table[8] = { true, true, true, true, true, true, true, true }; static ER change_pin_function(int pin, bool_t gpio) { ER result = E_PAR; if ((pin < 0) || (pin >= 8)) return E_PAR; if (pin_function_table[pin] == gpio) return E_OK; /* 汎用入出力ポートに設定 */ switch (pin) { case 0: /* P21 */ sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B1_BIT); break; case 1: /* P20 */ sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B0_BIT); break; case 2: /* P22 */ sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B2_BIT); break; case 3: /* P23 */ sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B3_BIT); break; case 4: /* P24 */ sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B4_BIT); break; case 5: /* P25 */ sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B5_BIT); break; case 6: /* P32 */ sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) & ~PORT_PMR_B2_BIT); break; case 7: /* P33 */ sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) & ~PORT_PMR_B3_BIT); break; } /* 書き込みプロテクトレジスタの設定 PFSWEビットへの書き込みを許可 */ sil_wrb_mem(MPC_PWPR_ADDR, 0x00); /* 書き込みプロテクトレジスタの設定 PxxFSレジスタへの書き込みを許可 */ sil_wrb_mem(MPC_PWPR_ADDR, 0x40); switch (pin) { /* P21/TIOCA3 */ case 0: if (gpio) { /* P21端子機能制御レジスタ P21とする */ sil_wrb_mem(MPC_P21PFS_ADDR, 0x00); } else { /* P21端子機能制御レジスタ TIOCA3とする */ sil_wrb_mem(MPC_P21PFS_ADDR, 0x03); } result = E_OK; break; /* P20/TIOCB3 */ case 1: if (gpio) { /* P20端子機能制御レジスタ P20とする */ sil_wrb_mem(MPC_P20PFS_ADDR, 0x00); } else { /* P20端子機能制御レジスタ TIOCB3とする */ sil_wrb_mem(MPC_P20PFS_ADDR, 0x03); } result = E_OK; break; /* P22/TIOCC3 */ case 2: if (gpio) { /* P22端子機能制御レジスタ P22とする */ sil_wrb_mem(MPC_P22PFS_ADDR, 0x00); } else { /* P22端子機能制御レジスタ TIOCC3とする */ sil_wrb_mem(MPC_P22PFS_ADDR, 0x03); } result = E_OK; break; /* P23/TIOCD3 */ case 3: if (gpio) { /* P23端子機能制御レジスタ P23とする */ sil_wrb_mem(MPC_P23PFS_ADDR, 0x00); } else { /* P23端子機能制御レジスタ TIOCD3とする */ sil_wrb_mem(MPC_P23PFS_ADDR, 0x03); } result = E_OK; break; /* P24/TIOCB4 */ case 4: if (gpio) { /* P24端子機能制御レジスタ P24とする */ sil_wrb_mem(MPC_P24PFS_ADDR, 0x00); } else { /* P24端子機能制御レジスタ TIOCB4とする */ sil_wrb_mem(MPC_P24PFS_ADDR, 0x03); } result = E_OK; break; /* P25/TIOCA4 */ case 5: if (gpio) { /* P25端子機能制御レジスタ P25とする */ sil_wrb_mem(MPC_P25PFS_ADDR, 0x00); } else { /* P25端子機能制御レジスタ TIOCA4とする */ sil_wrb_mem(MPC_P25PFS_ADDR, 0x03); } result = E_OK; break; /* P32/TIOCC0 */ case 6: if (gpio) { /* P32端子機能制御レジスタ P32とする */ sil_wrb_mem(MPC_P32PFS_ADDR, 0x00); } else { /* P32端子機能制御レジスタ TIOCC0とする */ sil_wrb_mem(MPC_P32PFS_ADDR, 0x03); } result = E_OK; break; /* P33/TIOCD0 */ case 7: if (gpio) { /* P33端子機能制御レジスタ P33とする */ sil_wrb_mem(MPC_P33PFS_ADDR, 0x00); } else { /* P33端子機能制御レジスタ TIOCD0とする */ sil_wrb_mem(MPC_P33PFS_ADDR, 0x03); } result = E_OK; break; } /* 書き込みプロテクトレジスタの設定 書き込みを禁止 */ sil_wrb_mem(MPC_PWPR_ADDR, 0x80); /* 機能ポートに設定 */ if (!gpio) { switch (pin) { /* P21/TIOCA3 */ case 0: sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B1_BIT); sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B1_BIT); break; /* P20/TIOCB3 */ case 1: sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B0_BIT); sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B0_BIT); break; /* P22/TIOCC3 */ case 2: sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B2_BIT); sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B2_BIT); break; /* P23/TIOCD3 */ case 3: sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B3_BIT); sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B3_BIT); break; /* P24/TIOCB4 */ case 4: sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B4_BIT); sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B4_BIT); break; /* P25/TIOCA4 */ case 5: sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B5_BIT); sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B5_BIT); break; /* P32/TIOCC0 */ case 6: sil_wrb_mem(PORT3_PDR_ADDR, sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B2_BIT); sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B2_BIT); break; /* P33/TIOCD0 */ case 7: sil_wrb_mem(PORT3_PDR_ADDR, sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B3_BIT); sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B3_BIT); break; } } pin_function_table[pin] = gpio; return result; } static void change_pin_mode(gpio_t *obj) { volatile __evenaccess uint8_t *pdr; int bit; switch (obj->pin) { case 0: /* P21 */ pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B1_BIT; break; case 1: /* P20 */ pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B0_BIT; break; case 2: /* P22 */ pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B2_BIT; break; case 3: /* P23 */ pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B3_BIT; break; case 4: /* P24 */ pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B4_BIT; break; case 5: /* P25 */ pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B5_BIT; break; case 6: /* P32 */ pdr = PORT3_PDR_ADDR; bit = PORT_PDR_B2_BIT; break; case 7: /* P33 */ pdr = PORT3_PDR_ADDR; bit = PORT_PDR_B3_BIT; break; case 8: /* PC2 */ pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B2_BIT; break; case 9: /* PC3 */ pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B3_BIT; break; case 10: /* PC4 */ pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B4_BIT; break; case 11: /* PC6 */ pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B6_BIT; break; case 12: /* PC7 */ pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B7_BIT; break; case 13: /* PC5 */ pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B5_BIT; break; default: return; } volatile __evenaccess uint8_t *pcr = pdr + (PORT0_PCR_ADDR - PORT0_PDR_ADDR); switch (obj->dir) { case PIN_INPUT: sil_wrb_mem(pdr, sil_reb_mem(pdr) & ~bit); break; case PIN_OUTPUT: sil_wrb_mem(pdr, sil_reb_mem(pdr) | bit); break; } switch (obj->mode) { case PullUp: sil_wrb_mem(pcr, sil_reb_mem(pcr) | bit); break; default: sil_wrb_mem(pcr, sil_reb_mem(pcr) & ~bit); break; } } void gpio_mode(gpio_t *obj, PinMode mode) { /* 汎用入出力ポートに設定 */ change_pin_function(obj->pin, true); obj->mode = mode; change_pin_mode(obj); } void gpio_dir(gpio_t *obj, PinDirection direction) { /* 汎用入出力ポートに設定 */ change_pin_function(obj->pin, true); obj->dir = direction; change_pin_mode(obj); } void gpio_write(gpio_t *obj, int value) { volatile __evenaccess uint8_t *podr; int bit; switch (obj->pin) { case 0: /* P21 */ podr = PORT2_PODR_ADDR; bit = PORT_PODR_B1_BIT; break; case 1: /* P20 */ podr = PORT2_PODR_ADDR; bit = PORT_PODR_B0_BIT; break; case 2: /* P22 */ podr = PORT2_PODR_ADDR; bit = PORT_PODR_B2_BIT; break; case 3: /* P23 */ podr = PORT2_PODR_ADDR; bit = PORT_PODR_B3_BIT; break; case 4: /* P24 */ podr = PORT2_PODR_ADDR; bit = PORT_PODR_B4_BIT; break; case 5: /* P25 */ podr = PORT2_PODR_ADDR; bit = PORT_PODR_B5_BIT; break; case 6: /* P32 */ podr = PORT3_PODR_ADDR; bit = PORT_PODR_B2_BIT; break; case 7: /* P33 */ podr = PORT3_PODR_ADDR; bit = PORT_PODR_B3_BIT; break; case 8: /* PC2 */ podr = PORTC_PODR_ADDR; bit = PORT_PODR_B2_BIT; break; case 9: /* PC3 */ podr = PORTC_PODR_ADDR; bit = PORT_PODR_B3_BIT; break; case 10: /* PC4 */ podr = PORTC_PODR_ADDR; bit = PORT_PODR_B4_BIT; break; case 11: /* PC6 */ podr = PORTC_PODR_ADDR; bit = PORT_PODR_B6_BIT; break; case 12: /* PC7 */ podr = PORTC_PODR_ADDR; bit = PORT_PODR_B7_BIT; break; case 13: /* PC5 */ podr = PORTC_PODR_ADDR; bit = PORT_PODR_B5_BIT; break; default: return; } switch (value) { case 0: sil_wrb_mem(podr, sil_reb_mem(podr) & ~bit); break; case 1: sil_wrb_mem(podr, sil_reb_mem(podr) | bit); break; } } int gpio_read(gpio_t *obj) { volatile __evenaccess uint8_t *pidr; int bit; switch (obj->pin) { case 0: /* P21 */ pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B1_BIT; break; case 1: /* P20 */ pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B0_BIT; break; case 2: /* P22 */ pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B2_BIT; break; case 3: /* P23 */ pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B3_BIT; break; case 4: /* P24 */ pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B4_BIT; break; case 5: /* P25 */ pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B5_BIT; break; case 6: /* P32 */ pidr = PORT3_PIDR_ADDR; bit = PORT_PIDR_B2_BIT; break; case 7: /* P33 */ pidr = PORT3_PIDR_ADDR; bit = PORT_PIDR_B3_BIT; break; case 8: /* PC2 */ pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B2_BIT; break; case 9: /* PC3 */ pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B3_BIT; break; case 10: /* PC4 */ pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B4_BIT; break; case 11: /* PC6 */ pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B6_BIT; break; case 12: /* PC7 */ pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B7_BIT; break; case 13: /* PC5 */ pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B5_BIT; break; default: return 0; } if ((sil_reb_mem(pidr) & bit) != 0) { return 1; } else { return 0; } } void gpio_init_in(gpio_t* gpio, PinName pin) { gpio->pin = pin; gpio->dir = PIN_INPUT; gpio->mode = PullDefault; /* 汎用入出力ポートに設定 */ change_pin_function(gpio->pin, true); change_pin_mode(gpio); } void gpio_init_out(gpio_t* gpio, PinName pin) { gpio->pin = pin; gpio->dir = PIN_OUTPUT; gpio->mode = PullDefault; /* 汎用入出力ポートに設定 */ change_pin_function(gpio->pin, true); change_pin_mode(gpio); } #define arduino_ad_table_count 64 static uint16_t arduino_ad_table[8][arduino_ad_table_count]; static int arduino_ad_pos = 0; static uint32_t arduino_ad_avelage[8]; void analogin_init(analogin_t *obj, PinName pin) { /* * モジュールストップ機能の設定(S12AD) */ sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */ sil_wrw_mem(SYSTEM_MSTPCRA_ADDR, sil_rew_mem(SYSTEM_MSTPCRA_ADDR) & ~SYSTEM_MSTPCRA_MSTPA17_BIT); sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */ /* 12bitADC初期化 */ sil_wrh_mem(S12AD_ADEXICR_ADDR, 0x0000); /* 温度センサ出力、内部基準電圧非選択 */ sil_wrh_mem(S12AD_ADANS0_ADDR, 0x00FF); /* 変換ポートAN000~AN007選択、AN008~AN015非選択 */ sil_wrh_mem(S12AD_ADANS1_ADDR, 0x0000); /* 変換ポートAN016~AN020非選択 */ } uint16_t analogin_read_u16(analogin_t *obj) { uint16_t result = 0; switch (obj->pin) { case 14: /* *value = sil_reh_mem(S12AD_ADDR0_ADDR); */ result = (arduino_ad_avelage[0] / (arduino_ad_table_count)); break; case 15: /* *value = sil_reh_mem(S12AD_ADDR1_ADDR); */ result = (arduino_ad_avelage[1] / (arduino_ad_table_count)); break; case 16: /* *value = sil_reh_mem(S12AD_ADDR2_ADDR); */ result = (arduino_ad_avelage[2] / (arduino_ad_table_count)); break; case 17: /* *value = sil_reh_mem(S12AD_ADDR3_ADDR); */ result = (arduino_ad_avelage[3] / (arduino_ad_table_count)); break; case 18: /* *value = sil_reh_mem(S12AD_ADDR4_ADDR); */ result = (arduino_ad_avelage[4] / (arduino_ad_table_count)); break; case 19: /* *value = sil_reh_mem(S12AD_ADDR5_ADDR); */ result = (arduino_ad_avelage[5] / (arduino_ad_table_count)); break; case 20: /* *value = sil_reh_mem(S12AD_ADDR6_ADDR); */ result = (arduino_ad_avelage[6] / (arduino_ad_table_count)); break; case 21: /* *value = sil_reh_mem(S12AD_ADDR7_ADDR); */ result = (arduino_ad_avelage[7] / (arduino_ad_table_count)); break; } return 65535 - ((result << 4) | (result >> 8)); } void arduino_tick() { static volatile __evenaccess uint16_t *const regs[8] = { S12AD_ADDR0_ADDR, S12AD_ADDR1_ADDR, S12AD_ADDR2_ADDR, S12AD_ADDR3_ADDR, S12AD_ADDR4_ADDR, S12AD_ADDR5_ADDR, S12AD_ADDR6_ADDR, S12AD_ADDR7_ADDR }; uint16_t ad_value; int i; /* ADCの変換結果取得 */ if ((sil_reb_mem(S12AD_ADCSR_ADDR) & S12AD_ADCSR_ADST_BIT) == 0) { for (i = 0; i < 8; i++) { arduino_ad_avelage[i] -= arduino_ad_table[i][arduino_ad_pos]; ad_value = sil_reh_mem(regs[i]); arduino_ad_table[i][arduino_ad_pos] = ad_value; arduino_ad_avelage[i] += ad_value; } arduino_ad_pos++; if (arduino_ad_pos >= arduino_ad_table_count) { arduino_ad_pos = 0; } /* 変換開始(シングルスキャンモード) */ sil_wrb_mem(S12AD_ADCSR_ADDR, S12AD_ADCSR_ADST_BIT); } } void analogout_init(dac_t *obj, PinName pin) { } void analogout_write_u16(dac_t *obj, uint16_t value) { } void pwmout_init(pwmout_t* obj, PinName pin) { /* PWM出力(490Hz) */ sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */ sil_wrw_mem(SYSTEM_MSTPCRA_ADDR, sil_rew_mem(SYSTEM_MSTPCRA_ADDR) & ~SYSTEM_MSTPCRA_MSTPA13_BIT); /* TPU0~TPU5 */ sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */ /* カウンタクロックの選択、カウンタクリア要因の選択 */ sil_wrb_mem(TPU0_TCR_ADDR, (1 << TPU_TCR_TPSC_OFFSET) | (1 << TPU_TCR_CKEG_OFFSET) | (1 << TPU_TCR_CCLR_OFFSET)); sil_wrb_mem(TPU3_TCR_ADDR, (1 << TPU_TCR_TPSC_OFFSET) | (1 << TPU_TCR_CKEG_OFFSET) | (3 << TPU_TCR_CCLR_OFFSET)); sil_wrb_mem(TPU4_TCR_ADDR, (1 << TPU_TCR_TPSC_OFFSET) | (1 << TPU_TCR_CKEG_OFFSET) | (3 << TPU_TCR_CCLR_OFFSET)); /* 波形出力レベルの選択 */ sil_wrb_mem(TPU0_TIORL_ADDR, (5 << TPU_TIORL_IOC_OFFSET) | (5 << TPU_TIORL_IOD_OFFSET)); sil_wrb_mem(TPU3_TIORH_ADDR, (5 << TPU_TIORL_IOA_OFFSET) | (5 << TPU_TIORL_IOB_OFFSET)); sil_wrb_mem(TPU3_TIORL_ADDR, (5 << TPU_TIORL_IOC_OFFSET) | (5 << TPU_TIORL_IOD_OFFSET)); sil_wrb_mem(TPU4_TIOR_ADDR, (5 << TPU_TIORL_IOA_OFFSET) | (5 << TPU_TIORL_IOB_OFFSET)); /* TGRyの設定 */ sil_wrh_mem(TPU0_TGRA_ADDR, TPU_BASE_COUNTER); sil_wrh_mem(TPU0_TGRC_ADDR, 0); sil_wrh_mem(TPU0_TGRD_ADDR, 0); sil_wrh_mem(TPU3_TGRA_ADDR, 0); sil_wrh_mem(TPU3_TGRB_ADDR, 0); sil_wrh_mem(TPU3_TGRC_ADDR, 0); sil_wrh_mem(TPU3_TGRD_ADDR, 0); sil_wrh_mem(TPU4_TGRA_ADDR, 0); sil_wrh_mem(TPU4_TGRB_ADDR, 0); /* PWMモード2の設定 */ sil_wrb_mem(TPU0_TMDR_ADDR, 3); sil_wrb_mem(TPU3_TMDR_ADDR, 3); sil_wrb_mem(TPU4_TMDR_ADDR, 3); /* 同期動作設定 */ sil_wrb_mem(TPUA_TSYR_ADDR, TPU_TSYR_SYNC0_BIT | TPU_TSYR_SYNC3_BIT | TPU_TSYR_SYNC4_BIT); /* カウント動作開始 */ sil_wrb_mem(TPUA_TSTR_ADDR, TPU_TSTR_CST0_BIT | TPU_TSTR_CST3_BIT | TPU_TSTR_CST4_BIT); } void pwmout_free(pwmout_t* obj) { /* カウント動作終了 */ sil_wrb_mem(TPUA_TSTR_ADDR, 0); } void pwmout_period_us(pwmout_t* obj, int us) { } void pwmout_pulsewidth_us(pwmout_t* obj, int us) { } void serial_init(serial_t *obj, PinName tx, PinName rx) { } void serial_free(serial_t *obj) { } void serial_baud(serial_t *obj, int baudrate) { } void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) { } int serial_getc(serial_t *obj) { return 0; } void serial_putc(serial_t *obj, int c) { } int serial_readable(serial_t *obj) { return 0; } int serial_writable(serial_t *obj) { return 0; } void i2c_init(i2c_t *obj, PinName sda, PinName scl) { } void i2c_frequency(i2c_t *obj, int hz) { } int i2c_start(i2c_t *obj) { return 0; } int i2c_stop(i2c_t *obj) { return 0; } int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { return 0; } int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { return 0; } int i2c_byte_read(i2c_t *obj, int last) { return 0; } int i2c_byte_write(i2c_t *obj, int data) { return 0; } void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) { } void spi_free(spi_t *obj) { } void spi_format(spi_t *obj, int bits, int mode, int slave) { } void spi_frequency(spi_t *obj, int hz) { } int spi_master_write(spi_t *obj, int value) { return 0; } uint8_t DecToBcd(uint8_t value) { return ((value / 10) << 4) | (value % 10); } uint8_t BcdToDec(uint8_t value) { return (10 * (value >> 4)) | (value & 0x0F); } void rtc_init(void) { } void rtc_free(void) { } int rtc_isenabled(void) { return 1; } long long __tm_to_secs(const struct tm *tm); int __secs_to_tm(long long t, struct tm *tm); time_t rtc_read(void) { struct tm tm = { 0 }; tm.tm_year = 2000 - 1900 + BcdToDec(sil_reb_mem((uint8_t *)RTC_RYRCNT_ADDR)); tm.tm_mon = BcdToDec(sil_reb_mem((uint8_t *)RTC_RMONCNT_ADDR)) - 1; tm.tm_mday = BcdToDec(sil_reb_mem((uint8_t *)RTC_RDAYCNT_ADDR)); tm.tm_hour = BcdToDec(sil_reb_mem((uint8_t *)RTC_RHRCNT_ADDR)); tm.tm_min = BcdToDec(sil_reb_mem((uint8_t *)RTC_RMINCNT_ADDR)); tm.tm_sec = BcdToDec(sil_reb_mem((uint8_t *)RTC_RSECCNT_ADDR)); return __tm_to_secs(&tm); } void rtc_write(time_t t) { struct tm tm; __secs_to_tm(t, &tm); sil_wrb_mem((uint8_t *)RTC_RYRCNT_ADDR, DecToBcd(tm.tm_year + 1900 - 2000)); sil_wrb_mem((uint8_t *)RTC_RMONCNT_ADDR, DecToBcd(tm.tm_mon + 1)); sil_wrb_mem((uint8_t *)RTC_RDAYCNT_ADDR, DecToBcd(tm.tm_mday)); sil_wrb_mem((uint8_t *)RTC_RHRCNT_ADDR, DecToBcd(tm.tm_hour)); sil_wrb_mem((uint8_t *)RTC_RMINCNT_ADDR, DecToBcd(tm.tm_min)); sil_wrb_mem((uint8_t *)RTC_RSECCNT_ADDR, DecToBcd(tm.tm_sec)); }