Ignore:
Timestamp:
Feb 1, 2019, 9:57:09 PM (5 years ago)
Author:
coas-nagasima
Message:

TINETとSocket APIなどを更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asp3_tinet_ecnl_rx/trunk/ntshell/src/mbed_api.c

    r337 r364  
    11/*
    22 *  TOPPERS ECHONET Lite Communication Middleware
    3  * 
    4  *  Copyright (C) 2014-2017 Cores Co., Ltd. Japan
    5  * 
     3 *
     4 *  Copyright (C) 2014-2018 Cores Co., Ltd. Japan
     5 *
    66 *  上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    77 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     
    2626 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
    2727 *      免責すること.
    28  * 
     28 *
    2929 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
    3030 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     
    3232 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
    3333 *  の責任を負わない.
    34  * 
     34 *
    3535 *  @(#) $Id$
    3636 */
     
    4242#include "rx630.h"
    4343#include "ff.h"
     44#include "target_stddef.h"
     45#include "target_kernel_impl.h"
     46#include "scif.h"
    4447
    4548 /* PWM出力(490Hz) */
     
    6467void gpio_init(gpio_t *obj, PinName pin)
    6568{
     69        obj->pin = pin;
     70        obj->dir = PIN_INPUT;
     71        obj->mode = PullDefault;
    6672}
    6773
     
    8389        /* 汎用入出力ポートに設定 */
    8490        switch (pin) {
    85         case 0:
     91        case D0:
    8692                /* P21 */
    8793                sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B1_BIT);
    8894                break;
    89         case 1:
     95        case D1:
    9096                /* P20 */
    9197                sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B0_BIT);
    9298                break;
    93         case 2:
     99        case D2:
    94100                /* P22 */
    95101                sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B2_BIT);
    96102                break;
    97         case 3:
     103        case D3:
    98104                /* P23 */
    99105                sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B3_BIT);
    100106                break;
    101         case 4:
     107        case D4:
    102108                /* P24 */
    103109                sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B4_BIT);
    104110                break;
    105         case 5:
     111        case D5:
    106112                /* P25 */
    107113                sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B5_BIT);
    108114                break;
    109         case 6:
     115        case D6:
    110116                /* P32 */
    111117                sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) & ~PORT_PMR_B2_BIT);
    112118                break;
    113         case 7:
     119        case D7:
    114120                /* P33 */
    115121                sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) & ~PORT_PMR_B3_BIT);
     122                break;
     123        default:
    116124                break;
    117125        }
     
    124132        switch (pin) {
    125133                /* P21/TIOCA3 */
    126         case 0:
     134        case D0:
    127135                if (gpio) {
    128136                        /* P21端子機能制御レジスタ P21とする */
     
    136144                break;
    137145                /* P20/TIOCB3 */
    138         case 1:
     146        case D1:
    139147                if (gpio) {
    140148                        /* P20端子機能制御レジスタ P20とする */
     
    148156                break;
    149157                /* P22/TIOCC3 */
    150         case 2:
     158        case D2:
    151159                if (gpio) {
    152160                        /* P22端子機能制御レジスタ P22とする */
     
    160168                break;
    161169                /* P23/TIOCD3 */
    162         case 3:
     170        case D3:
    163171                if (gpio) {
    164172                        /* P23端子機能制御レジスタ P23とする */
     
    172180                break;
    173181                /* P24/TIOCB4 */
    174         case 4:
     182        case D4:
    175183                if (gpio) {
    176184                        /* P24端子機能制御レジスタ P24とする */
     
    184192                break;
    185193                /* P25/TIOCA4 */
    186         case 5:
     194        case D5:
    187195                if (gpio) {
    188196                        /* P25端子機能制御レジスタ P25とする */
     
    196204                break;
    197205                /* P32/TIOCC0 */
    198         case 6:
     206        case D6:
    199207                if (gpio) {
    200208                        /* P32端子機能制御レジスタ P32とする */
     
    208216                break;
    209217                /* P33/TIOCD0 */
    210         case 7:
     218        case D7:
    211219                if (gpio) {
    212220                        /* P33端子機能制御レジスタ P33とする */
     
    218226                }
    219227                result = E_OK;
     228                break;
     229        default:
    220230                break;
    221231        }
     
    228238                switch (pin) {
    229239                        /* P21/TIOCA3 */
    230                 case 0:
     240                case D0:
    231241                        sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B1_BIT);
    232242                        sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B1_BIT);
    233243                        break;
    234244                        /* P20/TIOCB3 */
    235                 case 1:
     245                case D1:
    236246                        sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B0_BIT);
    237247                        sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B0_BIT);
    238248                        break;
    239249                        /* P22/TIOCC3 */
    240                 case 2:
     250                case D2:
    241251                        sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B2_BIT);
    242252                        sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B2_BIT);
    243253                        break;
    244254                        /* P23/TIOCD3 */
    245                 case 3:
     255                case D3:
    246256                        sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B3_BIT);
    247257                        sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B3_BIT);
    248258                        break;
    249259                        /* P24/TIOCB4 */
    250                 case 4:
     260                case D4:
    251261                        sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B4_BIT);
    252262                        sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B4_BIT);
    253263                        break;
    254264                        /* P25/TIOCA4 */
    255                 case 5:
     265                case D5:
    256266                        sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B5_BIT);
    257267                        sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B5_BIT);
    258268                        break;
    259269                        /* P32/TIOCC0 */
    260                 case 6:
     270                case D6:
    261271                        sil_wrb_mem(PORT3_PDR_ADDR, sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B2_BIT);
    262272                        sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B2_BIT);
    263273                        break;
    264274                        /* P33/TIOCD0 */
    265                 case 7:
     275                case D7:
    266276                        sil_wrb_mem(PORT3_PDR_ADDR, sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B3_BIT);
    267277                        sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B3_BIT);
    268278                        break;
     279                default:
     280                        break;
    269281                }
    270282        }
     
    280292
    281293        switch (obj->pin) {
    282         case 0:
     294        case D0:
    283295                /* P21 */
    284296                pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B1_BIT;
    285297                break;
    286         case 1:
     298        case D1:
    287299                /* P20 */
    288300                pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B0_BIT;
    289301                break;
    290         case 2:
     302        case D2:
    291303                /* P22 */
    292304                pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B2_BIT;
    293305                break;
    294         case 3:
     306        case D3:
    295307                /* P23 */
    296308                pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B3_BIT;
    297309                break;
    298         case 4:
     310        case D4:
    299311                /* P24 */
    300312                pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B4_BIT;
    301313                break;
    302         case 5:
     314        case D5:
    303315                /* P25 */
    304316                pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B5_BIT;
    305317                break;
    306         case 6:
     318        case D6:
    307319                /* P32 */
    308320                pdr = PORT3_PDR_ADDR; bit = PORT_PDR_B2_BIT;
    309321                break;
    310         case 7:
     322        case D7:
    311323                /* P33 */
    312324                pdr = PORT3_PDR_ADDR; bit = PORT_PDR_B3_BIT;
    313325                break;
    314         case 8:
     326        case D8:
    315327                /* PC2 */
    316328                pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B2_BIT;
    317329                break;
    318         case 9:
     330        case D9:
    319331                /* PC3 */
    320332                pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B3_BIT;
    321333                break;
    322         case 10:
     334        case D10:
    323335                /* PC4 */
    324336                pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B4_BIT;
    325337                break;
    326         case 11:
     338        case D11:
    327339                /* PC6 */
    328340                pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B6_BIT;
    329341                break;
    330         case 12:
     342        case D12:
    331343                /* PC7 */
    332344                pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B7_BIT;
    333345                break;
    334         case 13:
     346        case D13:
    335347                /* PC5 */
    336348                pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B5_BIT;
     
    349361                sil_wrb_mem(pdr, sil_reb_mem(pdr) | bit);
    350362                break;
     363        default:
     364                break;
    351365        }
    352366
     
    387401
    388402        switch (obj->pin) {
    389         case 0:
     403        case D0:
    390404                /* P21 */
    391405                podr = PORT2_PODR_ADDR; bit = PORT_PODR_B1_BIT;
    392406                break;
    393         case 1:
     407        case D1:
    394408                /* P20 */
    395409                podr = PORT2_PODR_ADDR; bit = PORT_PODR_B0_BIT;
    396410                break;
    397         case 2:
     411        case D2:
    398412                /* P22 */
    399413                podr = PORT2_PODR_ADDR; bit = PORT_PODR_B2_BIT;
    400414                break;
    401         case 3:
     415        case D3:
    402416                /* P23 */
    403417                podr = PORT2_PODR_ADDR; bit = PORT_PODR_B3_BIT;
    404418                break;
    405         case 4:
     419        case D4:
    406420                /* P24 */
    407421                podr = PORT2_PODR_ADDR; bit = PORT_PODR_B4_BIT;
    408422                break;
    409         case 5:
     423        case D5:
    410424                /* P25 */
    411425                podr = PORT2_PODR_ADDR; bit = PORT_PODR_B5_BIT;
    412426                break;
    413         case 6:
     427        case D6:
    414428                /* P32 */
    415429                podr = PORT3_PODR_ADDR; bit = PORT_PODR_B2_BIT;
    416430                break;
    417         case 7:
     431        case D7:
    418432                /* P33 */
    419433                podr = PORT3_PODR_ADDR; bit = PORT_PODR_B3_BIT;
    420434                break;
    421         case 8:
     435        case D8:
    422436                /* PC2 */
    423437                podr = PORTC_PODR_ADDR; bit = PORT_PODR_B2_BIT;
    424438                break;
    425         case 9:
     439        case D9:
    426440                /* PC3 */
    427441                podr = PORTC_PODR_ADDR; bit = PORT_PODR_B3_BIT;
    428442                break;
    429         case 10:
     443        case D10:
    430444                /* PC4 */
    431445                podr = PORTC_PODR_ADDR; bit = PORT_PODR_B4_BIT;
    432446                break;
    433         case 11:
     447        case D11:
    434448                /* PC6 */
    435449                podr = PORTC_PODR_ADDR; bit = PORT_PODR_B6_BIT;
    436450                break;
    437         case 12:
     451        case D12:
    438452                /* PC7 */
    439453                podr = PORTC_PODR_ADDR; bit = PORT_PODR_B7_BIT;
    440454                break;
    441         case 13:
     455        case D13:
    442456                /* PC5 */
    443457                podr = PORTC_PODR_ADDR; bit = PORT_PODR_B5_BIT;
     
    463477
    464478        switch (obj->pin) {
    465         case 0:
     479        case D0:
    466480                /* P21 */
    467481                pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B1_BIT;
    468482                break;
    469         case 1:
     483        case D1:
    470484                /* P20 */
    471485                pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B0_BIT;
    472486                break;
    473         case 2:
     487        case D2:
    474488                /* P22 */
    475489                pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B2_BIT;
    476490                break;
    477         case 3:
     491        case D3:
    478492                /* P23 */
    479493                pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B3_BIT;
    480494                break;
    481         case 4:
     495        case D4:
    482496                /* P24 */
    483497                pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B4_BIT;
    484498                break;
    485         case 5:
     499        case D5:
    486500                /* P25 */
    487501                pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B5_BIT;
    488502                break;
    489         case 6:
     503        case D6:
    490504                /* P32 */
    491505                pidr = PORT3_PIDR_ADDR; bit = PORT_PIDR_B2_BIT;
    492506                break;
    493         case 7:
     507        case D7:
    494508                /* P33 */
    495509                pidr = PORT3_PIDR_ADDR; bit = PORT_PIDR_B3_BIT;
    496510                break;
    497         case 8:
     511        case D8:
    498512                /* PC2 */
    499513                pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B2_BIT;
    500514                break;
    501         case 9:
     515        case D9:
    502516                /* PC3 */
    503517                pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B3_BIT;
    504518                break;
    505         case 10:
     519        case D10:
    506520                /* PC4 */
    507521                pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B4_BIT;
    508522                break;
    509         case 11:
     523        case D11:
    510524                /* PC6 */
    511525                pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B6_BIT;
    512526                break;
    513         case 12:
     527        case D12:
    514528                /* PC7 */
    515529                pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B7_BIT;
    516530                break;
    517         case 13:
     531        case D13:
    518532                /* PC5 */
    519533                pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B5_BIT;
     
    581595
    582596        switch (obj->pin) {
    583         case 14:
     597        case A0:
    584598                /* *value = sil_reh_mem(S12AD_ADDR0_ADDR); */
    585599                result = (arduino_ad_avelage[0] / (arduino_ad_table_count));
    586600                break;
    587         case 15:
     601        case A1:
    588602                /* *value = sil_reh_mem(S12AD_ADDR1_ADDR); */
    589603                result = (arduino_ad_avelage[1] / (arduino_ad_table_count));
    590604                break;
    591         case 16:
     605        case A2:
    592606                /* *value = sil_reh_mem(S12AD_ADDR2_ADDR); */
    593607                result = (arduino_ad_avelage[2] / (arduino_ad_table_count));
    594608                break;
    595         case 17:
     609        case A3:
    596610                /* *value = sil_reh_mem(S12AD_ADDR3_ADDR); */
    597611                result = (arduino_ad_avelage[3] / (arduino_ad_table_count));
    598612                break;
    599         case 18:
     613        case A4:
    600614                /* *value = sil_reh_mem(S12AD_ADDR4_ADDR); */
    601615                result = (arduino_ad_avelage[4] / (arduino_ad_table_count));
    602616                break;
    603         case 19:
     617        case A5:
    604618                /* *value = sil_reh_mem(S12AD_ADDR5_ADDR); */
    605619                result = (arduino_ad_avelage[5] / (arduino_ad_table_count));
    606620                break;
    607         case 20:
     621        case A6:
    608622                /* *value = sil_reh_mem(S12AD_ADDR6_ADDR); */
    609623                result = (arduino_ad_avelage[6] / (arduino_ad_table_count));
    610624                break;
    611         case 21:
     625        case A7:
    612626                /* *value = sil_reh_mem(S12AD_ADDR7_ADDR); */
    613627                result = (arduino_ad_avelage[7] / (arduino_ad_table_count));
    614628                break;
     629        default:
     630                return 0;
    615631        }
    616632
     
    677693        /* 波形出力レベルの選択 */
    678694        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));
     695        sil_wrb_mem(TPU3_TIORH_ADDR, (5 << TPU_TIORH_IOA_OFFSET) | (5 << TPU_TIORH_IOB_OFFSET));
    680696        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));
     697        sil_wrb_mem(TPU4_TIOR_ADDR, (5 << TPU_TIOR_IOA_OFFSET) | (5 << TPU_TIOR_IOB_OFFSET));
    682698        /* TGRyの設定 */
    683699        sil_wrh_mem(TPU0_TGRA_ADDR, TPU_BASE_COUNTER);
     
    714730}
    715731
     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
    7161067void serial_init(serial_t *obj, PinName tx, PinName rx)
    7171068{
     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));
    7181134}
    7191135
    7201136void serial_free(serial_t *obj)
    7211137{
     1138        /* SCI無効 */
     1139        sci_disable(obj->base_address);
     1140
     1141        obj->base_address = NULL;
    7221142}
    7231143
    7241144void serial_baud(serial_t *obj, int baudrate)
    7251145{
     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);
    7261155}
    7271156
    7281157void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
    7291158{
     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);
    7301197}
    7311198
    7321199int serial_getc(serial_t *obj)
    7331200{
     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
    7341344        return 0;
    7351345}
    7361346
    737 void serial_putc(serial_t *obj, int c)
    738 {
    739 }
    740 
    741 int serial_readable(serial_t *obj)
    742 {
     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
    7431354        return 0;
    7441355}
    7451356
    746 int serial_writable(serial_t *obj)
    747 {
     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
    7481366        return 0;
    7491367}
    7501368
    751 void i2c_init(i2c_t *obj, PinName sda, PinName scl)
    752 {
    753 }
    754 
    755 void i2c_frequency(i2c_t *obj, int hz)
    756 {
    757 }
    758 
    759 int i2c_start(i2c_t *obj)
    760 {
     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
    7611526        return 0;
    7621527}
    7631528
    764 int i2c_stop(i2c_t *obj)
    765 {
     1529int i2c_byte_write(i2c_t *obj, int data)
     1530{
     1531        if (obj->base_address == NULL)
     1532                return 0;
     1533
    7661534        return 0;
    7671535}
    7681536
    769 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
    770 {
    771         return 0;
    772 }
    773 
    774 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
    775 {
    776         return 0;
    777 }
    778 
    779 int i2c_byte_read(i2c_t *obj, int last)
    780 {
    781         return 0;
    782 }
    783 
    784 int i2c_byte_write(i2c_t *obj, int data)
    785 {
    786         return 0;
    787 }
    788 
    7891537void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel)
    7901538{
     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));
    7911579}
    7921580
    7931581void spi_free(spi_t *obj)
    7941582{
     1583        /* SCI無効 */
     1584        sci_disable(obj->base_address);
     1585
     1586        obj->base_address = NULL;
    7951587}
    7961588
    7971589void spi_format(spi_t *obj, int bits, int mode, int slave)
    7981590{
     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));
    7991636}
    8001637
    8011638void spi_frequency(spi_t *obj, int hz)
    8021639{
     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);
    8031649}
    8041650
    8051651int spi_master_write(spi_t *obj, int value)
    8061652{
    807         return 0;
     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;
    8081689}
    8091690
     
    8581739        sil_wrb_mem((uint8_t *)RTC_RSECCNT_ADDR, DecToBcd(tm.tm_sec));
    8591740}
     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 TracChangeset for help on using the changeset viewer.