Ignore:
Timestamp:
Sep 14, 2020, 6:36:03 PM (4 years ago)
Author:
coas-nagasima
Message:

SPIとSerial、KPUの動作を改善

Location:
azure_iot_hub_riscv/trunk/asp_baseplatform
Files:
2 added
16 edited

Legend:

Unmodified
Added
Removed
  • azure_iot_hub_riscv/trunk/asp_baseplatform/OBJ/K210_GCC/DEMO/Makefile

    r453 r458  
    215215SYSSVC_LIBS := $(SYSSVC_LIBS)
    216216INCLUDES := $(INCLUDES) -I$(SRCDIR)/pdic/k210
    217 #LDFLAGS := $(LDFLAGS) \
    218 #       -Wl,--wrap=_malloc_r \
    219 #       -Wl,--wrap=_calloc_r \
    220 #       -Wl,--wrap=_free_r \
    221 #       -Wl,--wrap=_realloc_r
    222217
    223218#
     
    489484  #
    490485  ifdef GCC_TARGET
    491     GCC_TARGET_PREFIX = $(GCC_TARGET)-
     486        GCC_TARGET_PREFIX = $(GCC_TARGET)-
    492487  else
    493     GCC_TARGET_PREFIX =
     488        GCC_TARGET_PREFIX =
    494489  endif
    495490  CC = $(GCC_TARGET_PREFIX)gcc
  • azure_iot_hub_riscv/trunk/asp_baseplatform/OBJ/K210_GCC/DEMO/demo.c

    r453 r458  
    275275        OV2640_t        *hcmr;
    276276        DVP_Handle_t    *hdvp;
    277         uint16_t        *lcd_buffer;
    278277        ER_UINT ercd;
    279         uint32_t i, count;
     278        uint32_t i;
    280279        struct tm2 time;
    281280        unsigned long atmp;
     
    465464        lcd_init(hlcd);
    466465        syslog_2(LOG_NOTICE, "width(%d) height(%d)", hlcd->_width, hlcd->_height);
    467         count = hcmr->_width * hcmr->_height;
    468         lcd_buffer = (uint16_t *)malloc(count * 2);
    469         if(lcd_buffer == NULL){
    470                 syslog_0(LOG_ERROR, "no lcd buffer !");
    471                 slp_tsk();
    472         }
     466
    473467        DrawProp.BackColor = ST7789_WHITE;
    474468        DrawProp.TextColor = ST7789_BLACK;
     
    588582                        ercd = ov2640_snapshot(hcmr);
    589583                        if(ercd == E_OK){
    590                                 uint32_t *p = (uint32_t *)hcmr->_dataBuffer;
    591                                 uint32_t *q = (uint32_t *)lcd_buffer;
    592                                 uint32_t *e = (uint32_t *)&lcd_buffer[count];
    593                                 for (; q < e ; p++, q++){
    594                                         *q = SWAP_32(*p);
    595                                 }
    596                                 lcd_drawPicture(hlcd, 0, 0, hcmr->_width, hcmr->_height, lcd_buffer);
     584                                lcd_drawPicture(hlcd, 0, 0, hcmr->_width, hcmr->_height, (uint16_t *)hcmr->_dataBuffer);
    597585                        }
    598586                }
  • azure_iot_hub_riscv/trunk/asp_baseplatform/OBJ/K210_GCC/DEMO/demo.cfg

    r453 r458  
    1111INCLUDE("syssvc/serial.cfg");
    1212INCLUDE("syssvc/logtask.cfg");
     13INCLUDE("syssvc/malloc.cfg");
    1314INCLUDE("pdic/k210/device.cfg");
    1415INCLUDE("pdic/k210/dvp.cfg");
  • azure_iot_hub_riscv/trunk/asp_baseplatform/arch/riscv_gcc/riscv32elf.ld

    r453 r458  
    22 *  @(#) $Id$
    33 */
    4 
    5 MEMORY
    6 {
    7   /*
    8    * Memory with CPU cache.
    9    *6M CPU SRAM
    10    */
    11   ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = (6 * 1024 * 1024)
    12   /*
    13    * Memory without CPU cache
    14    * 6M CPU SRAM
    15   */
    16   ram_nocache (wxa!ri) : ORIGIN = 0x40000000, LENGTH = (6 * 1024 * 1024)
    17 }
    184
    195OUTPUT_ARCH(riscv)
     
    228PROVIDE(software_init_hook = 0);
    239PROVIDE(software_term_hook = 0);
    24 PROVIDE(__idata_start = 0);
    25 PROVIDE(__idata_end = 0);
    2610STARTUP(start.o)
    2711
     
    3317    {
    3418        KEEP (*(.init))
    35     }>ram
     19    }
    3620    .text :
    3721    {
     
    3923        *(.text .stub .text.* .gnu.linkonce.t.*)
    4024
    41     }>ram
     25    }
    4226    .fini :
    4327    {
    4428        KEEP (*(.fini))
    45     }>ram
     29    }
    4630    _etext = . ;
    4731    PROVIDE (etext = .) ;
     
    4933    {
    5034        *(.rodata .rodata.* .gnu.linkonce.r.*)
    51     }>ram
     35    }
    5236    . = ALIGN(4) ;
    53     .data :
     37    __idata_start = . ;
     38    .data : AT(__idata_start)
    5439    {
    5540        __data_start = . ;
    56         /* Writable data segment (.data segment) */
    5741        *(.data .data.*)
    58         *(.sdata .sdata.* .sdata2 .sdata2.*)
     42        *(.sdata .sdata.* .sdata2.*)
    5943        . = ALIGN(8);
    60         PROVIDE( __global_pointer$ = ABSOLUTE(.) + 0x800);
    61     }>ram
    62     .eh_frame : { KEEP (*(.eh_frame)) }>ram
    63     .gcc_except_table : { *(.gcc_except_table .gcc_except_table.*) }>ram
     44        PROVIDE( __global_pointer$ = . + 0x800 );
     45    }
     46    .eh_frame : { KEEP (*(.eh_frame)) }
     47    .gcc_except_table : { *(.gcc_except_table) }
    6448    .ctors :
    6549    {
     
    6852        KEEP (*(SORT(.ctors.*)))
    6953        KEEP (*(.ctors))
    70     }>ram
     54    }
    7155    .dtors :
    7256    {
     
    7559        KEEP (*(SORT(.dtors.*)))
    7660        KEEP (*(.dtors))
    77     }>ram
     61    }
     62    __idata_end = __idata_start + SIZEOF(.data) ;
    7863    _edata  = . ;
    7964    PROVIDE (edata = .) ;
    8065    . = ALIGN(4) ;
    8166    __bss_start = . ;
    82     _bss = .;
    8367    .bss :
    8468    {
    8569        *(.bss .bss.*)
    86         *(.sbss .sbss.* .sbss2 .sbss2.*)
     70        *(.sbss .sbss.* .sbss2.*)
    8771        *(COMMON)
    88     }>ram
     72    }
    8973    _end = . ;
    9074    __bss_end = . ;
    91     _ebss = . ;
    92     .stack (NOLOAD) :
     75    .stack :
    9376    {
    9477        *(.stack)
    95     }>ram
    96     .heap (NOLOAD) :
    97     {
    98         PROVIDE (_heap_start = .) ;
    99         *(.heap)
    100     }>ram
    101     PROVIDE (_heap_end = .) ;
     78    }
    10279    PROVIDE (end = .) ;
    10380    .comment        0 : { *(.comment) }
  • azure_iot_hub_riscv/trunk/asp_baseplatform/arch/riscv_gcc/riscv64elf.ld

    r453 r458  
    22 *  @(#) $Id$
    33 */
    4 
    5 MEMORY
    6 {
    7   /*
    8    * Memory with CPU cache.
    9    *6M CPU SRAM
    10    */
    11   ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = (6 * 1024 * 1024)
    12   /*
    13    * Memory without CPU cache
    14    * 6M CPU SRAM
    15   */
    16   ram_nocache (wxa!ri) : ORIGIN = 0x40000000, LENGTH = (6 * 1024 * 1024)
    17 }
    184
    195OUTPUT_ARCH(riscv)
     
    228PROVIDE(software_init_hook = 0);
    239PROVIDE(software_term_hook = 0);
    24 PROVIDE(__idata_start = 0);
    25 PROVIDE(__idata_end = 0);
    2610STARTUP(start.o)
    2711
     
    3317    {
    3418        KEEP (*(.init))
    35     }>ram
     19    }
    3620    .text :
    3721    {
     
    3923        *(.text .stub .text.* .gnu.linkonce.t.*)
    4024
    41     }>ram
     25    }
    4226    .fini :
    4327    {
    4428        KEEP (*(.fini))
    45     }>ram
     29    }
    4630    _etext = . ;
    4731    PROVIDE (etext = .) ;
     
    4933    {
    5034        *(.rodata .rodata.* .gnu.linkonce.r.*)
    51     }>ram
     35    }
    5236    . = ALIGN(8);
    53     .data :
     37    __idata_start = . ;
     38    .data :
    5439    {
    5540        __data_start = . ;
    5641        /* Writable data segment (.data segment) */
    5742        *(.data .data.*)
    58         *(.sdata .sdata.* .sdata2 .sdata2.*)
     43        *(.sdata .sdata.* .sdata2.*)
    5944        . = ALIGN(8);
    6045        PROVIDE( __global_pointer$ = ABSOLUTE(.) + 0x800);
    61     }>ram
    62     .eh_frame : { KEEP (*(.eh_frame)) }>ram
    63     .gcc_except_table : { *(.gcc_except_table .gcc_except_table.*) }>ram
     46    }
     47    .eh_frame : { KEEP (*(.eh_frame)) }
     48    .gcc_except_table : { *(.gcc_except_table) }
    6449    .ctors :
    6550    {
     
    6853        KEEP (*(SORT(.ctors.*)))
    6954        KEEP (*(.ctors))
    70     }>ram
     55    }
    7156    .dtors :
    7257    {
     
    7560        KEEP (*(SORT(.dtors.*)))
    7661        KEEP (*(.dtors))
    77     }>ram
     62    }
     63    __idata_end = __idata_start + SIZEOF(.data) ;
    7864    _edata  = . ;
    7965    PROVIDE (edata = .) ;
    8066    . = ALIGN(8) ;
    8167    __bss_start = . ;
    82     _bss = .;
    8368    .bss :
    8469    {
    8570        *(.bss .bss.*)
    86         *(.sbss .sbss.* .sbss2 .sbss2.*)
     71        *(.sbss .sbss.* .sbss2.*)
    8772        *(COMMON)
    88     }>ram
     73    }
    8974    _end = . ;
    9075    __bss_end = . ;
    91     _ebss = . ;
    92     .stack (NOLOAD) :
     76    .stack :
    9377    {
    9478        *(.stack)
    95     }>ram
    96     .heap (NOLOAD) :
    97     {
    98         PROVIDE (_heap_start = .) ;
    99         *(.heap)
    100     }>ram
    101     PROVIDE (_heap_end = .) ;
     79    }
    10280    PROVIDE (end = .) ;
    10381    .comment        0 : { *(.comment) }
  • azure_iot_hub_riscv/trunk/asp_baseplatform/gdic/sipeed_ov2640/sipeed_ov2640.c

    r453 r458  
    750750                        dly_tsk(1);
    751751        }
    752         reverse_u32pixel((uint32_t*)hcmr->_dataBuffer, hcmr->_width * hcmr->_height/2);
     752        //reverse_u32pixel((uint32_t*)hcmr->_dataBuffer, hcmr->_width * hcmr->_height/2);
    753753        return E_OK;
    754754}
  • azure_iot_hub_riscv/trunk/asp_baseplatform/gdic/sipeed_st7789/sipeed_st7789.c

    r453 r458  
    8383static void set_dcx_control(LCD_Handler_t *hlcd)
    8484{
    85     gpio_set_pin(TADR_GPIO_BASE, hlcd->dcx_no, PORT_LOW);
     85        gpio_set_pin(TADR_GPIO_BASE, hlcd->dcx_no, PORT_LOW);
    8686}
    8787
    8888static void set_dcx_data(LCD_Handler_t *hlcd)
    8989{
    90     gpio_set_pin(TADR_GPIO_BASE, hlcd->dcx_no, PORT_HIGH);
     90        gpio_set_pin(TADR_GPIO_BASE, hlcd->dcx_no, PORT_HIGH);
    9191}
    9292
     
    101101
    102102        aTxBuffer[0] = c;
    103     set_dcx_control(hlcd);
     103        set_dcx_control(hlcd);
    104104        hspi->Init.DataSize = 8;
    105105        hspi->Init.InstLength = 8;
    106106        hspi->Init.AddrLength = 0;
    107     ercd = spi_core_transmit(hspi, hlcd->cs_sel, (uint8_t *)(aTxBuffer), 1);
     107        ercd = spi_core_transmit(hspi, hlcd->cs_sel, (uint8_t *)(aTxBuffer), 1);
    108108#if SPI_WAIT_TIME == 0
    109109        if(ercd == E_OK)
     
    128128                aTxBuffer[i] = buf[i];
    129129
    130     set_dcx_data(hlcd);
     130        set_dcx_data(hlcd);
    131131        hspi->Init.DataSize = 8;
    132132        hspi->Init.InstLength = 8;
     
    146146        ER ercd = E_OK;
    147147
    148     set_dcx_data(hlcd);
     148        set_dcx_data(hlcd);
    149149        hspi->Init.DataSize = 8;
    150150        hspi->Init.InstLength = 8;
     
    167167        ER ercd = E_OK;
    168168
    169     set_dcx_data(hlcd);
     169        set_dcx_data(hlcd);
    170170        hspi->Init.DataSize = 16;
    171171        hspi->Init.InstLength = 16;
     
    188188        ER ercd = E_OK;
    189189
    190     set_dcx_data(hlcd);
     190        set_dcx_data(hlcd);
    191191        hspi->Init.DataSize = 32;
    192192        hspi->Init.InstLength = 0;
     
    206206{
    207207        GPIO_Init_t init = {0};
    208     uint8_t data = 0;
     208        uint8_t data[2] = {0};
    209209
    210210        /*
     
    214214        init.mode = GPIO_MODE_OUTPUT;
    215215        init.pull = GPIO_PULLDOWN;
    216     gpio_setup(TADR_GPIO_BASE, &init, hlcd->dcx_no);
    217     gpio_set_pin(TADR_GPIO_BASE, hlcd->dcx_no, PORT_HIGH);
     216        gpio_setup(TADR_GPIO_BASE, &init, hlcd->dcx_no);
     217        gpio_set_pin(TADR_GPIO_BASE, hlcd->dcx_no, PORT_HIGH);
    218218
    219219        /*
     
    227227                gpio_set_pin(TADR_GPIO_BASE, hlcd->rst_no, PORT_HIGH);
    228228
    229             gpio_set_pin(TADR_GPIO_BASE, hlcd->rst_no, 0);
    230             gpio_set_pin(TADR_GPIO_BASE, hlcd->rst_no, 1);
     229                gpio_set_pin(TADR_GPIO_BASE, hlcd->rst_no, 0);
     230                gpio_set_pin(TADR_GPIO_BASE, hlcd->rst_no, 1);
    231231        }
    232232
     
    245245         */
    246246        lcd_writecommand(hlcd, PIXEL_FORMAT_SET);
    247         data = 0x55;
    248     lcd_writebyte(hlcd, &data, 1);
     247        data[0] = 0x55;
     248        lcd_writebyte(hlcd, &data, 1);
    249249        if(hlcd->dir & DIR_XY_MASK){
    250250                hlcd->_width = ST7789_TFTHEIGHT;
     
    259259
    260260        lcd_writecommand(hlcd, MEMORY_ACCESS_CTL);
    261     lcd_writebyte(hlcd, (uint8_t *)&hlcd->dir, 1);
     261        lcd_writebyte(hlcd, (uint8_t *)&hlcd->dir, 1);
     262
     263        //lcd_writecommand(hlcd, RGB_IF_SIGNAL_CTL);
     264        //data[0] = 0x00;
     265        //data[1] = 0xF8;
     266        //lcd_writebyte(hlcd, &data, 2);
    262267
    263268        /*
     
    274279lcd_setAddrWindow(LCD_Handler_t *hlcd,  uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1)
    275280{
    276     uint8_t data[4] = {0};
    277 
    278     data[0] = (uint8_t)(x0 >> 8);
    279     data[1] = (uint8_t)(x0);
    280     data[2] = (uint8_t)(x1 >> 8);
    281     data[3] = (uint8_t)(x1);
     281        uint8_t data[4] = {0};
     282
     283        data[0] = (uint8_t)(x0 >> 8);
     284        data[1] = (uint8_t)(x0);
     285        data[2] = (uint8_t)(x1 >> 8);
     286        data[3] = (uint8_t)(x1);
    282287        lcd_writecommand(hlcd, HORIZONTAL_ADDRESS_SET);
    283     lcd_writebyte(hlcd, data, 4);
    284 
    285     data[0] = (uint8_t)(y0 >> 8);
    286     data[1] = (uint8_t)(y0);
    287     data[2] = (uint8_t)(y1 >> 8);
    288     data[3] = (uint8_t)(y1);
     288        lcd_writebyte(hlcd, data, 4);
     289
     290        data[0] = (uint8_t)(y0 >> 8);
     291        data[1] = (uint8_t)(y0);
     292        data[2] = (uint8_t)(y1 >> 8);
     293        data[3] = (uint8_t)(y1);
    289294        lcd_writecommand(hlcd, VERTICAL_ADDRESS_SET);
    290     lcd_writebyte(hlcd, data, 4);
     295        lcd_writebyte(hlcd, data, 4);
    291296
    292297        SVC_PERROR(lcd_writecommand(hlcd, MEMORY_WRITE));
     
    305310lcd_fillRect(LCD_Handler_t *hlcd, int16_t x, int16_t y, int16_t w, int16_t h, color_t color)
    306311{
    307     uint32_t data = ((uint32_t)color << 16) | (uint32_t)color;
     312        uint32_t data = ((uint32_t)color << 16) | (uint32_t)color;
    308313        // rudimentary clipping (drawChar w/big text requires this)
    309314        if((x >= hlcd->_width) || (y >= hlcd->_height)) return;
     
    312317
    313318        lcd_setAddrWindow(hlcd, x, y, x+w-1, y+h-1);
    314     SVC_PERROR(lcd_filldata(hlcd, &data, (h*w+1)/2));
     319        SVC_PERROR(lcd_filldata(hlcd, &data, (h*w+1)/2));
    315320}
    316321
     
    326331{
    327332        uint32_t data = color;
    328     lcd_setAddrWindow(hlcd, x, y, x, y);
     333        lcd_setAddrWindow(hlcd, x, y, x, y);
    329334        SVC_PERROR(lcd_writehalf(hlcd, &data, 1));
    330335}
     
    341346lcd_drawFastVLine(LCD_Handler_t *hlcd, int16_t x, int16_t y, int16_t h, color_t color)
    342347{
    343     uint32_t data = ((uint32_t)color << 16) | (uint32_t)color;
     348        uint32_t data = ((uint32_t)color << 16) | (uint32_t)color;
    344349        // Rudimentary clipping
    345350        if(h == 0) return;
     
    347352        if((y+h-1) >= hlcd->_height) h = hlcd->_height-y;
    348353        lcd_setAddrWindow(hlcd, x, y, x, y+h-1);
    349     SVC_PERROR(lcd_filldata(hlcd, &data, (h+1)/2));
     354        SVC_PERROR(lcd_filldata(hlcd, &data, (h+1)/2));
    350355}
    351356
     
    360365void lcd_drawFastHLine(LCD_Handler_t *hlcd, int16_t x, int16_t y, int16_t w, color_t color)
    361366{
    362     uint32_t data = ((uint32_t)color << 16) | (uint32_t)color;
     367        uint32_t data = ((uint32_t)color << 16) | (uint32_t)color;
    363368        // Rudimentary clipping
    364369        if(w == 0) return;
     
    366371        if((x+w-1) >= hlcd->_width)  w = hlcd->_width-x;
    367372        lcd_setAddrWindow(hlcd, x, y, x+w-1, y);
    368     SVC_PERROR(lcd_filldata(hlcd, &data, (w+1)/2));
     373        SVC_PERROR(lcd_filldata(hlcd, &data, (w+1)/2));
    369374}
    370375
     
    462467
    463468        lcd_setAddrWindow(hlcd, x, y, x+width-1, y+height-1);
    464     set_dcx_data(hlcd);
     469        set_dcx_data(hlcd);
    465470        hspi->Init.DataSize = 32;
    466471        hspi->Init.InstLength = 0;
     
    533538{
    534539        LCD_Handler_t *hlcd = pDrawProp->hlcd;
    535         int32_t   decision;    /* Decision Variable */
     540        int32_t   decision;    /* Decision Variable */
    536541        uint32_t  current_x;   /* Current X Value */
    537542        uint32_t  current_y;   /* Current Y Value */
  • azure_iot_hub_riscv/trunk/asp_baseplatform/pdic/k210/dvp.c

    r453 r458  
    6666
    6767#define DEAFULT_CLEAR_INT       (DVP_STS_FRAME_START  | DVP_STS_FRAME_START_WE | \
    68                                 DVP_STS_FRAME_FINISH | DVP_STS_FRAME_FINISH_WE)
     68                                                                DVP_STS_FRAME_FINISH | DVP_STS_FRAME_FINISH_WE)
    6969
    7070
     
    7575{
    7676        uint32_t clk_sel0 = sil_rew_mem((uint32_t *)(TADR_SYSCTL_BASE+TOFF_CLK_SEL0));
    77     uint32_t source = 0;
    78     uint32_t result = 0;
     77        uint32_t source = 0;
     78        uint32_t result = 0;
    7979        uint32_t threshold = 0;
    8080
     
    9797        result = source / (threshold + 1);
    9898        syslog_2(LOG_NOTICE, "## dvp_clock_get_freq req(%d) result(%d) ##", clock, result);
    99     return result;
     99        return result;
    100100}
    101101
     
    104104{
    105105        while(sil_rew_mem((uint32_t *)(hdvp->base+TOFF_DVP_STS)) & DVP_STS_SCCB_EN)
    106         ;
     106                ;
    107107        sil_wrw_mem((uint32_t *)(hdvp->base+TOFF_DVP_STS), (DVP_STS_SCCB_EN | DVP_STS_SCCB_EN_WE));
    108     while (sil_rew_mem((uint32_t *)(hdvp->base+TOFF_DVP_STS)) & DVP_STS_SCCB_EN)
    109         ;
     108        while (sil_rew_mem((uint32_t *)(hdvp->base+TOFF_DVP_STS)) & DVP_STS_SCCB_EN)
     109                ;
    110110}
    111111
     
    150150        tmp = sil_rew_mem((uint32_t *)(hdvp->base+TOFF_DVP_SCCB_CFG)) & (~DVP_SCCB_BYTE_NUM_MASK);
    151151
    152     if (hdvp->Init.num_sccb_reg == 8)
     152        if (hdvp->Init.num_sccb_reg == 8)
    153153                tmp |= DVP_SCCB_BYTE_NUM_2;
    154154        else
     
    164164        sil_wrw_mem((uint32_t *)(hdvp->base+TOFF_DVP_SCCB_CTL), tmp);
    165165
    166     dvp_sccb_start_transfer(hdvp);
     166        dvp_sccb_start_transfer(hdvp);
    167167
    168168        sil_wrw_mem((uint32_t *)(hdvp->base+TOFF_DVP_SCCB_CTL), addr);
    169169
    170     dvp_sccb_start_transfer(hdvp);
     170        dvp_sccb_start_transfer(hdvp);
    171171
    172172        tmp = sil_rew_mem((uint32_t *)(hdvp->base+TOFF_DVP_SCCB_CFG));
     
    182182dvp_init(DVP_Handle_t *hdvp)
    183183{
    184     uint32_t v_apb1_clk, v_period;
     184        uint32_t v_apb1_clk, v_period;
    185185
    186186        if(hdvp == NULL)
     
    201201        fpioa_set_function(hdvp->Init.SccbSdaPin, FUNC_SCCB_SDA);
    202202
    203     /* Do a power cycle */
    204     dvp_dcmi_powerdown(hdvp, false);
    205     dly_tsk(10);
    206 
    207     dvp_dcmi_powerdown(hdvp, true);
    208     dly_tsk(100);
     203        /* Do a power cycle */
     204        dvp_dcmi_powerdown(hdvp, false);
     205        dly_tsk(10);
     206
     207        dvp_dcmi_powerdown(hdvp, true);
     208        dly_tsk(100);
    209209
    210210        /*
     
    372372        cfg  = sil_rew_mem((uint32_t *)(hdvp->base+TOFF_DVP_CFG));
    373373        cfg &= ~(DVP_CFG_HREF_BURST_NUM_MASK | DVP_CFG_LINE_NUM_MASK);
    374     cfg |= hdvp->Init.Height << 20;
    375 
    376     if((cfg & DVP_CFG_BURST_SIZE_4BEATS) != 0)
     374        cfg |= hdvp->Init.Height << 20;
     375
     376        if((cfg & DVP_CFG_BURST_SIZE_4BEATS) != 0)
    377377                divw = 4;
    378378        else
    379379                divw = 1;
    380380        cfg |= (hdvp->Init.Width / 8 / divw) << 12;
    381     sil_wrw_mem((uint32_t *)(hdvp->base+TOFF_DVP_CFG), cfg);
     381        sil_wrw_mem((uint32_t *)(hdvp->base+TOFF_DVP_CFG), cfg);
    382382        return E_OK;
    383383}
     
    403403
    404404        sccb_cfg  = sil_rew_mem((uint32_t *)(hdvp->base+TOFF_DVP_SCCB_CFG));
    405     sccb_cfg &= ~(DVP_SCCB_SCL_LCNT_MASK | DVP_SCCB_SCL_HCNT_MASK);
    406     sccb_cfg |= (v_period_clk_cnt << 8) | (v_period_clk_cnt << 16);
     405        sccb_cfg &= ~(DVP_SCCB_SCL_LCNT_MASK | DVP_SCCB_SCL_HCNT_MASK);
     406        sccb_cfg |= (v_period_clk_cnt << 8) | (v_period_clk_cnt << 16);
    407407        sil_wrw_mem((uint32_t *)(hdvp->base+TOFF_DVP_SCCB_CFG), sccb_cfg);
    408408        return dvp_clock_get_freq(DVP_CLOCK_REQ) / (v_period_clk_cnt * 2);
     
    454454        uint32_t istatus, estatus;
    455455
    456         if(hdvp == NULL)
     456        if (hdvp == NULL) {
     457                syslog_0(LOG_NOTICE, "dvp_handler hdvp == NULL");
    457458                return;
     459        }
    458460        istatus = sil_rew_mem((uint32_t *)(hdvp->base+TOFF_DVP_STS));
    459         if(istatus == 0)
     461        if (istatus == 0) {
     462                syslog_0(LOG_DEBUG, "dvp_handler istatus == 0");
    460463                return;
     464        }
    461465        estatus = istatus;
    462         syslog_2(LOG_DEBUG, "sensor_irq istatus[%08x] hdvp->state(%d)", istatus, hdvp->state);
     466        syslog_2(LOG_DEBUG, "dvp_handler istatus[%08x] hdvp->state(%d)", istatus, hdvp->state);
    463467        if((istatus & DVP_STS_FRAME_FINISH) != 0){      //frame end
    464468                estatus |= DVP_STS_FRAME_FINISH_WE;
     
    469473        if((istatus & DVP_STS_FRAME_START) != 0){       //frame start
    470474                estatus |= DVP_STS_FRAME_START_WE;
    471         if(hdvp->state == DVP_STATE_ACTIVATE){  //only we finish the convert, do transmit again
     475                if(hdvp->state == DVP_STATE_ACTIVATE){  //only we finish the convert, do transmit again
    472476                        /*
    473477                         *  コンバートスタート
     
    479483        sil_orw_mem((uint32_t *)(hdvp->base+TOFF_DVP_STS), estatus);
    480484}
    481 
    482 
  • azure_iot_hub_riscv/trunk/asp_baseplatform/pdic/k210/spi.c

    r453 r458  
    5656sil_rel_mem(const uint64_t *mem)
    5757{
    58         uint64_t        data;
    59 
    60         data = *((const volatile uint64_t *) mem);
    61         return(data);
    62 }
    63 
    64 #define sil_orw_mem(a, b)               sil_wrw_mem((a), sil_rew_mem(a) | (b))
    65 #define sil_andw_mem(a, b)              sil_wrw_mem((a), sil_rew_mem(a) & ~(b))
    66 #define sil_modw_mem(a, b, c)   sil_wrw_mem((a), (sil_rew_mem(a) & (~b)) | (c))
     58        uint64_t data;
     59
     60        data = *((const volatile uint64_t *)mem);
     61        return (data);
     62}
     63
     64#define sil_orw_mem(a, b) sil_wrw_mem((a), sil_rew_mem(a) | (b))
     65#define sil_andw_mem(a, b) sil_wrw_mem((a), sil_rew_mem(a) & ~(b))
     66#define sil_modw_mem(a, b, c) sil_wrw_mem((a), (sil_rew_mem(a) & (~b)) | (c))
    6767
    6868/*
    6969 *  SPIOポートIDから管理ブロックを取り出すためのマクロ
    7070 */
    71 #define INDEX_SPI(spiid)        ((uint_t)((spiid) - 1))
    72 
    73 #define get_framewidth(l)       (((l)+7)/8)
    74 
    75 #define SPI_SSIENR_DISABLE      0x00000000
    76 #define SPI_SSIENR_ENABLE       0x00000001
    77 
    78 #define SPI_DMACR_RXENABLE      0x00000001
    79 #define SPI_DMACR_TXENABLE      0x00000002
     71#define INDEX_SPI(spiid) ((uint_t)((spiid)-1))
     72
     73#define get_framewidth(l) (((l) + 7) / 8)
     74
     75#define SPI_SSIENR_DISABLE 0x00000000
     76#define SPI_SSIENR_ENABLE 0x00000001
     77
     78#define SPI_DMACR_RXENABLE 0x00000001
     79#define SPI_DMACR_TXENABLE 0x00000002
    8080
    8181/*
     
    8383 */
    8484
    85 typedef struct _SPI_PortControlBlock{
    86         unsigned long         base;
    87         int16_t               func_data;
    88         int16_t               func_ss;
    89         int16_t               func_arb;
    90         int16_t               func_sclk;
     85typedef struct _SPI_PortControlBlock {
     86        unsigned long base;
     87        int16_t func_data;
     88        int16_t func_ss;
     89        int16_t func_arb;
     90        int16_t func_sclk;
    9191} SPI_PortControlBlock;
    9292
    9393static const SPI_PortControlBlock spi_pcb[NUM_SPIPORT] = {
    94         {TADR_SPI0_BASE, FUNC_SPI0_D0,      FUNC_SPI0_SS0,     FUNC_SPI0_ARB, FUNC_SPI0_SCLK     },
    95         {TADR_SPI1_BASE, FUNC_SPI1_D0,      FUNC_SPI1_SS0,     FUNC_SPI1_ARB, FUNC_SPI1_SCLK     },
     94        {TADR_SPI0_BASE, FUNC_SPI0_D0,      FUNC_SPI0_SS0,     FUNC_SPI0_ARB, FUNC_SPI0_SCLK},
     95        {TADR_SPI1_BASE, FUNC_SPI1_D0,      FUNC_SPI1_SS0,     FUNC_SPI1_ARB, FUNC_SPI1_SCLK},
    9696        {TADR_SPIS_BASE, FUNC_SPI_SLAVE_D0, FUNC_SPI_SLAVE_SS, -1,            FUNC_SPI_SLAVE_SCLK},
    97         {TADR_SPI2_BASE, -1,                -1,                -1,            -1                 }
     97        {TADR_SPI2_BASE, -1,                -1,                -1,            -1}
    9898};
    9999
     
    109109{
    110110        SPI_Init_t *init;
    111     uint32_t inst_l = 4;
    112     uint32_t addr_l;
     111        uint32_t inst_l = 4;
     112        uint32_t addr_l;
    113113
    114114        init = &hspi->Init;
    115     switch (init->InstLength){
     115        switch (init->InstLength) {
    116116        case 0:
    117117                inst_l = 0;
     
    128128        default:
    129129                break;
    130     }
    131         if(inst_l == 4)
     130        }
     131        if (inst_l == 4)
    132132                return E_PAR;
    133133
    134134        addr_l = init->AddrLength / 4;
    135         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_CTRLR0), (init->WorkMode << hspi->work_mode_offset) | \
     135        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_CTRLR0), (init->WorkMode << hspi->work_mode_offset) |
    136136                (init->FrameFormat << hspi->frf_offset) | ((init->DataSize - 1) << hspi->dfs_offset));
    137         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SPI_CTRLR0),
    138                 ((init->WaitCycles << 11) | (inst_l << 8) | (addr_l << 2) | init->IATransMode));
    139         sil_modw_mem((uint32_t *)(hspi->base+TOFF_SPI_CTRLR0), (3 << hspi->tmod_offset), (tmod << hspi->tmod_offset));
     137        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SPI_CTRLR0),
     138                                ((init->WaitCycles << 11) | (inst_l << 8) | (addr_l << 2) | init->IATransMode));
     139        sil_modw_mem((uint32_t *)(hspi->base + TOFF_SPI_CTRLR0), (3 << hspi->tmod_offset), (tmod << hspi->tmod_offset));
    140140        return E_OK;
    141141}
     
    148148{
    149149        SPI_Handle_t *hspi = (SPI_Handle_t *)hdma->localdata;
    150         if(hspi != NULL && hspi->Init.semdmaid != 0){
     150        if (hspi != NULL && hspi->Init.semdmaid != 0) {
    151151                isig_sem(hspi->Init.semdmaid);
    152152        }
     
    158158DMA_Handle_t *
    159159spi_dmac_set_single_mode(SPI_Handle_t *hspi, uint8_t rtx,
    160                                                   int8_t ss_no, const void *src, void *dest,
    161                                                   uint8_t src_inc, uint8_t dest_inc,
    162                           uint8_t dmac_burst_size, uint8_t dmac_trans_width,
    163                           size_t block_size)
     160                                                 int8_t ss_no, const void *src, void *dest,
     161                                                 uint8_t src_inc, uint8_t dest_inc,
     162                                                uint8_t dmac_burst_size, uint8_t dmac_trans_width,
     163                                                size_t block_size)
    164164{
    165165        DMA_Handle_t *hdma;
    166     int mem_type_src, mem_type_dest;
    167     uint8_t flow_control;
    168 
    169         if(rtx == 0){
     166        int mem_type_src, mem_type_dest;
     167        uint8_t flow_control;
     168
     169        if (rtx == 0) {
    170170                hdma = hspi->hdmatx;
    171         flow_control = DMA_MEMORY_TO_PERIPH;
     171                flow_control = DMA_MEMORY_TO_PERIPH;
    172172                mem_type_src = 1;
    173173                mem_type_dest = 0;
    174174        }
    175         else{
     175        else {
    176176                hdma = hspi->hdmarx;
    177         flow_control = DMA_PERIPH_TO_MEMORY;
     177                flow_control = DMA_PERIPH_TO_MEMORY;
    178178                mem_type_src = 0;
    179179                mem_type_dest = 1;
    180180        }
    181         if(ss_no < 0)
     181        if (ss_no < 0)
    182182                ss_no = 0;
    183183
    184         hdma->Init.Direction    = flow_control; /* DMA転送方向 */
    185         hdma->Init.SrcHandShake = (mem_type_src ? DMAC_HS_SOFTWARE : DMAC_HS_HARDWARE); /* ソースハンドシェイク */
    186         hdma->Init.DrcHandShake = (mem_type_dest ? DMAC_HS_SOFTWARE : DMAC_HS_HARDWARE);        /* デスティネーションハンドシェイク */
    187         hdma->Init.SrcInc       = src_inc;      /* ソースインクリメント設定 */
    188         hdma->Init.DstInc       = dest_inc;     /* デスティネーションインクリメント設定 */
    189         hdma->Init.SrcTransWidth = dmac_trans_width;    /* ソース転送幅 */
    190         hdma->Init.DstTransWidth = dmac_trans_width;    /* デスティネーション転送幅 */
    191         hdma->Init.SrcBurstSize = dmac_burst_size;      /* ソースバーストサイズ */
    192         hdma->Init.DstBurstSize = dmac_burst_size;      /* デスティネーションバーストサイズ */
     184        hdma->Init.Direction = flow_control;                                                                                     /* DMA転送方向 */
     185        hdma->Init.SrcHandShake = (mem_type_src ? DMAC_HS_SOFTWARE : DMAC_HS_HARDWARE);  /* ソースハンドシェイク */
     186        hdma->Init.DrcHandShake = (mem_type_dest ? DMAC_HS_SOFTWARE : DMAC_HS_HARDWARE); /* デスティネーションハンドシェイク */
     187        hdma->Init.SrcInc = src_inc;                                                                                                     /* ソースインクリメント設定 */
     188        hdma->Init.DstInc = dest_inc;                                                                                                    /* デスティネーションインクリメント設定 */
     189        hdma->Init.SrcTransWidth = dmac_trans_width;                                                                     /* ソース転送幅 */
     190        hdma->Init.DstTransWidth = dmac_trans_width;                                                                     /* デスティネーション転送幅 */
     191        hdma->Init.SrcBurstSize = dmac_burst_size;                                                                               /* ソースバーストサイズ */
     192        hdma->Init.DstBurstSize = dmac_burst_size;                                                                               /* デスティネーションバーストサイズ */
    193193        dma_reset(hdma);
    194         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SER), (1 << ss_no));
     194        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SER), (1 << ss_no));
    195195        dma_start(hdma, (uintptr_t)src, (uintptr_t)dest, block_size);
    196196        return hdma;
     
    201201 */
    202202ER
    203 spi_dmac_wait_done(DMA_Handle_t * hdma)
     203spi_dmac_wait_done(DMA_Handle_t *hdma)
    204204{
    205205        SPI_Handle_t *hspi = (SPI_Handle_t *)hdma->localdata;
     
    207207        int tick = DMA_TRS_TIMEOUT;
    208208
    209         while((hdma->status == DMA_STATUS_BUSY) && tick > 0){
    210                 if(hspi != NULL && hspi->Init.semdmaid != 0){
    211                         ercd = twai_sem(hspi->Init.semdmaid, 5);
     209        while ((hdma->status == DMA_STATUS_BUSY) && tick > 0) {
     210                if (hspi != NULL && hspi->Init.semdmaid != 0) {
     211                        ercd = twai_sem(hspi->Init.semdmaid, 5);
    212212                }
    213213                else
     
    216216        }
    217217        dma_end(hdma);
    218         if(hdma->ErrorCode != 0)
     218        if (hdma->ErrorCode != 0)
    219219                ercd = E_OBJ;
    220         else if(tick == 0)
     220        else if (tick == 0)
    221221                ercd = E_TMOUT;
    222222        return ercd;
     
    232232        int tick = timeout;
    233233
    234         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_IMR), 0x0011);
    235     while((sil_rew_mem((uint32_t *)(hspi->base+TOFF_SPI_SR)) & 0x05) != 0x04 && tick > 0){
    236                 if(hspi->Init.semid != 0)
    237                         twai_sem(hspi->Init.semid, 5);
    238                 else
    239                         dly_tsk(1);
    240                 tick--;
    241         }
    242         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SER), 0x00000000);
    243         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SSIENR), SPI_SSIENR_DISABLE);
    244 
    245         if(hspi->ErrorCode != 0)
     234        if (hspi->hdmatx != NULL) {
     235                sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_IMR), 0x0011);
     236                while ((sil_rew_mem((uint32_t *)(hspi->base + TOFF_SPI_SR)) & 0x05) != 0x04 && tick > 0) {
     237                        if (hspi->Init.semid != 0)
     238                                twai_sem(hspi->Init.semid, 5);
     239                        else
     240                                dly_tsk(1);
     241                        tick--;
     242                }
     243        }
     244        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SER), 0x00000000);
     245        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SSIENR), SPI_SSIENR_DISABLE);
     246
     247        if (hspi->ErrorCode != 0)
    246248                ercd = E_OBJ;
    247         else if(tick == 0)
     249        else if (tick == 0)
    248250                ercd = E_TMOUT;
    249251        hspi->TxXferCount = 0;
     
    266268        const SPI_PortControlBlock *spcb;
    267269        unsigned long base;
    268         uint8_t  spi_num;
     270        uint8_t spi_num;
    269271        uint32_t spi_baudr, clk_th1, threshold;
    270     uint8_t dfs_offset, frf_offset, work_mode_offset, tmod_offset;
     272        uint8_t dfs_offset, frf_offset, work_mode_offset, tmod_offset;
    271273        uint32_t dsize_err = 0;
    272     uint32_t inst_l = 4;
    273     uint32_t addr_l;
    274 
    275         if(port < SPI1_PORTID || port > NUM_SPIPORT)
     274        uint32_t inst_l = 4;
     275        uint32_t addr_l;
     276
     277        if (port < SPI1_PORTID || port > NUM_SPIPORT)
    276278                return NULL;
    277279        spi_num = INDEX_SPI(port);
    278         if(init == NULL)
     280        if (init == NULL)
    279281                return NULL;
    280         if(init->DataSize < 4 && init->DataSize > 32)
     282        if (init->DataSize < 4 && init->DataSize > 32)
    281283                return NULL;
    282         if(init->AddrLength % 4 != 0 && init->AddrLength > 60)
     284        if (init->AddrLength % 4 != 0 && init->AddrLength > 60)
    283285                return NULL;
    284286
     
    286288         *  クロック設定
    287289         */
    288     if(spi_num == 3){
    289                 sil_orw_mem((uint32_t *)(TADR_SYSCTL_BASE+TOFF_CLK_SEL0), SYSCTL_CLK_SEL0_SPI3_CLK_SEL);
    290         }
    291         if(spi_num < 2)
    292                 sil_orw_mem((uint32_t *)(TADR_SYSCTL_BASE+TOFF_SYSCTL_CLK_EN_CENT), SYSCTL_CLK_EN_CENT_APB2_CLK_EN);
    293         else if(spi_num == 2)
    294                 sil_orw_mem((uint32_t *)(TADR_SYSCTL_BASE+TOFF_SYSCTL_CLK_EN_CENT), SYSCTL_CLK_EN_CENT_APB0_CLK_EN);
    295         sil_orw_mem((uint32_t *)(TADR_SYSCTL_BASE+TOFF_SYSCTL_CLK_EN_PERI), (SYSCTL_CLK_EN_PERI_SPI0_CLK_EN<<spi_num));
    296         sil_andw_mem((uint32_t *)(TADR_SYSCTL_BASE+TOFF_SYSCTL_CLK_TH1), 0xFF << (spi_num*8));
     290        if (spi_num == 3) {
     291                sil_orw_mem((uint32_t *)(TADR_SYSCTL_BASE + TOFF_CLK_SEL0), SYSCTL_CLK_SEL0_SPI3_CLK_SEL);
     292        }
     293        if (spi_num < 2)
     294                sil_orw_mem((uint32_t *)(TADR_SYSCTL_BASE + TOFF_SYSCTL_CLK_EN_CENT), SYSCTL_CLK_EN_CENT_APB2_CLK_EN);
     295        else if (spi_num == 2)
     296                sil_orw_mem((uint32_t *)(TADR_SYSCTL_BASE + TOFF_SYSCTL_CLK_EN_CENT), SYSCTL_CLK_EN_CENT_APB0_CLK_EN);
     297        sil_orw_mem((uint32_t *)(TADR_SYSCTL_BASE + TOFF_SYSCTL_CLK_EN_PERI), (SYSCTL_CLK_EN_PERI_SPI0_CLK_EN << spi_num));
     298        sil_andw_mem((uint32_t *)(TADR_SYSCTL_BASE + TOFF_SYSCTL_CLK_TH1), 0xFF << (spi_num * 8));
    297299
    298300        /*
     
    300302         */
    301303        spcb = &spi_pcb[spi_num];
    302         if(spcb->func_ss >= 0 && init->SsPin >= 0)
     304        if (spcb->func_ss >= 0 && init->SsPin >= 0)
    303305                fpioa_set_function(init->SsPin, (uint8_t)(spcb->func_ss + init->SsNo));
    304         if(spcb->func_sclk >= 0 && init->SclkPin >= 0)
     306        if (spcb->func_sclk >= 0 && init->SclkPin >= 0)
    305307                fpioa_set_function(init->SclkPin, (uint8_t)(spcb->func_sclk));
    306         if(spcb->func_data >= 0){
    307                 if(init->MosiPin >= 0)
     308        if (spcb->func_data >= 0) {
     309                if (init->MosiPin >= 0)
    308310                        fpioa_set_function(init->MosiPin, (uint8_t)(spcb->func_data));
    309                 if(init->MisoPin >= 0)
    310                         fpioa_set_function(init->MisoPin, (uint8_t)(spcb->func_data+1));
    311 
     311                if (init->MisoPin >= 0)
     312                        fpioa_set_function(init->MisoPin, (uint8_t)(spcb->func_data + 1));
    312313        }
    313314        hspi = &SpiHandle[spi_num];
    314315        base = spcb->base;
    315316
    316     switch(spi_num){
     317        switch (spi_num) {
    317318        case 0:
    318319        case 1:
     
    331332        }
    332333
    333         switch(init->FrameFormat){
     334        switch (init->FrameFormat) {
    334335        case SPI_FF_DUAL:
    335                 if(init->DataSize % 2 != 0)
     336                if (init->DataSize % 2 != 0)
    336337                        dsize_err = 1;
    337338                break;
    338339        case SPI_FF_QUAD:
    339                 if(init->DataSize % 4 != 0)
     340                if (init->DataSize % 4 != 0)
    340341                        dsize_err = 1;
    341342                break;
    342343        case SPI_FF_OCTAL:
    343                 if(init->DataSize % 8 != 0)
     344                if (init->DataSize % 8 != 0)
    344345                        dsize_err = 1;
    345346                break;
     
    348349        }
    349350
    350         switch(init->InstLength){
     351        switch (init->InstLength) {
    351352        case 0:
    352353                inst_l = 0;
     
    364365                break;
    365366        }
    366         if(inst_l == 4 || dsize_err){
     367        if (inst_l == 4 || dsize_err) {
    367368                syslog_0(LOG_ERROR, "Invalid instruction length");
    368369                return NULL;
     
    372373        memcpy(&hspi->Init, init, sizeof(SPI_Init_t));
    373374
    374     if(sil_rew_mem((uint32_t *)(base+TOFF_SPI_BAUDR)) == 0)
    375                 sil_wrw_mem((uint32_t *)(base+TOFF_SPI_BAUDR), 0x14);
     375        if (sil_rew_mem((uint32_t *)(base + TOFF_SPI_BAUDR)) == 0)
     376                sil_wrw_mem((uint32_t *)(base + TOFF_SPI_BAUDR), 0x14);
    376377        /*
    377378         *  割込み不許可
    378379         */
    379         sil_wrw_mem((uint32_t *)(base+TOFF_SPI_IMR), 0x00000000);
    380 
    381         sil_wrw_mem((uint32_t *)(base+TOFF_SPI_DMACR), 0x00000000);
    382         sil_wrw_mem((uint32_t *)(base+TOFF_SPI_DMATDLR), 0x00000010);
    383         sil_wrw_mem((uint32_t *)(base+TOFF_SPI_DMARDLR), 0x00000000);
    384         sil_wrw_mem((uint32_t *)(base+TOFF_SPI_SER), 0x00000000);
    385         sil_wrw_mem((uint32_t *)(base+TOFF_SPI_SSIENR), SPI_SSIENR_DISABLE);
    386         sil_wrw_mem((uint32_t *)(base+TOFF_SPI_CTRLR0), (init->WorkMode << work_mode_offset) | \
     380        sil_wrw_mem((uint32_t *)(base + TOFF_SPI_IMR), 0x00000000);
     381
     382        sil_wrw_mem((uint32_t *)(base + TOFF_SPI_DMACR), 0x00000000);
     383        sil_wrw_mem((uint32_t *)(base + TOFF_SPI_DMATDLR), 0x00000010);
     384        sil_wrw_mem((uint32_t *)(base + TOFF_SPI_DMARDLR), 0x00000000);
     385        sil_wrw_mem((uint32_t *)(base + TOFF_SPI_SER), 0x00000000);
     386        sil_wrw_mem((uint32_t *)(base + TOFF_SPI_SSIENR), SPI_SSIENR_DISABLE);
     387        sil_wrw_mem((uint32_t *)(base + TOFF_SPI_CTRLR0), (init->WorkMode << work_mode_offset) |
    387388                (init->FrameFormat << frf_offset) | ((init->DataSize - 1) << dfs_offset));
    388         sil_wrw_mem((uint32_t *)(base+TOFF_SPI_SPI_CTRLR0),
     389        sil_wrw_mem((uint32_t *)(base + TOFF_SPI_SPI_CTRLR0),
    389390                ((init->WaitCycles << 11) | (inst_l << 8) | (addr_l << 2) | init->IATransMode));
    390         sil_wrw_mem((uint32_t *)(base+TOFF_SPI_ENDIAN), init->SignBit);
     391        sil_wrw_mem((uint32_t *)(base + TOFF_SPI_ENDIAN), init->SignBit);
    391392
    392393        /*
    393394         *  転送クロック設定
    394395         */
    395         clk_th1 = sil_rew_mem((uint32_t *)(TADR_SYSCTL_BASE+TOFF_SYSCTL_CLK_TH1));
     396        clk_th1 = sil_rew_mem((uint32_t *)(TADR_SYSCTL_BASE + TOFF_SYSCTL_CLK_TH1));
    396397        threshold = (clk_th1 >> (spi_num * 8)) & 0xff;
    397398        spi_baudr = (get_pll_clock(0) / ((threshold + 1) * 2)) / init->Prescaler;
    398399
    399 
    400         if(spi_baudr < 2 ){
     400        if (spi_baudr < 2) {
    401401                spi_baudr = 2;
    402402        }
    403         else if(spi_baudr > 65534){
     403        else if (spi_baudr > 65534) {
    404404                spi_baudr = 65534;
    405405        }
    406         sil_wrw_mem((uint32_t *)(base+TOFF_SPI_BAUDR), spi_baudr);
     406        sil_wrw_mem((uint32_t *)(base + TOFF_SPI_BAUDR), spi_baudr);
    407407
    408408        /*
     
    411411        hspi->base = base;
    412412        hspi->spi_num = spi_num;
    413         hspi->dfs_offset  = dfs_offset;
    414         hspi->frf_offset  = frf_offset;
     413        hspi->dfs_offset = dfs_offset;
     414        hspi->frf_offset = frf_offset;
    415415        hspi->work_mode_offset = work_mode_offset;
    416416        hspi->tmod_offset = tmod_offset;
    417417        hspi->hdmatx = NULL;
    418418        hspi->hdmarx = NULL;
    419         if(init->TxDMAChannel >= 0){
     419        if (init->TxDMAChannel >= 0) {
    420420                hdma = &spi_dma_handle[init->TxDMAChannel][0];
    421421                hdma->chnum = init->TxDMAChannel;
    422                 if(init->RxDMAChannel >= 0)
    423                         hdma->xfercallback      = NULL;
     422                if (init->RxDMAChannel >= 0)
     423                        hdma->xfercallback = NULL;
    424424                else
    425                         hdma->xfercallback      = spi_dma_comp;
    426                 hdma->errorcallback     = NULL;
    427                 hdma->Init.Request      = DMA_SELECT_SSI0_TX_REQ + spi_num * 2; /* DMA選択 */
    428                 hdma->Init.Direction    = DMA_MEMORY_TO_PERIPH; /* DMA転送方向 */
    429                 hdma->Init.SrcMultBlock = DMAC_MULTBLOCK_CONT;  /* ソースマルチブロックタイプ */
    430                 hdma->Init.DrcMultBlock = DMAC_MULTBLOCK_CONT;  /* デスティネーションマルチブロックタイプ */
    431                 hdma->Init.SrcHandShake = DMAC_HS_SOFTWARE;     /* ソースハンドシェイク */
    432                 hdma->Init.DrcHandShake = DMAC_HS_HARDWARE;     /* デスティネーションハンドシェイク */
    433                 hdma->Init.SrcHwhsPol   = DMAC_HWHS_POLARITY_LOW;       /* ソースハードウェアハンドシェイク極性 */
    434                 hdma->Init.DrcHwhsPol   = DMAC_HWHS_POLARITY_LOW;       /* デスティネーションハードウェアハンドシェイク極性 */
    435                 hdma->Init.Priority     = 4;    /* 優先度 */
    436                 hdma->Init.SrcMaster    = DMAC_MASTER1; /* ソースマスター設定 */
    437                 hdma->Init.DstMaster    = DMAC_MASTER2; /* デスティネーションマスター設定 */
    438                 hdma->Init.SrcInc       = DMAC_ADDR_INCREMENT;  /* ソースインクリメント設定 */
    439                 hdma->Init.DstInc       = DMAC_ADDR_NOCHANGE;   /* デスティネーションインクリメント設定 */
    440                 hdma->Init.SrcTransWidth = DMAC_TRANS_WIDTH_32; /* ソース転送幅 */
    441                 hdma->Init.DstTransWidth = DMAC_TRANS_WIDTH_32; /* デスティネーション転送幅 */
    442                 hdma->Init.SrcBurstSize = DMAC_MSIZE_4; /* ソースバーストサイズ */
    443                 hdma->Init.DstBurstSize = DMAC_MSIZE_4; /* デスティネーションバーストサイズ */
    444                 hdma->Init.IocBlkTrans  = 0;    /* IOCブロック転送 */
    445                 hdma->localdata         = (void *)hspi;
     425                        hdma->xfercallback = spi_dma_comp;
     426                hdma->errorcallback = NULL;
     427                hdma->Init.Request = DMA_SELECT_SSI0_TX_REQ + spi_num * 2; /* DMA選択 */
     428                hdma->Init.Direction = DMA_MEMORY_TO_PERIPH;                       /* DMA転送方向 */
     429                hdma->Init.SrcMultBlock = DMAC_MULTBLOCK_CONT;                     /* ソースマルチブロックタイプ */
     430                hdma->Init.DrcMultBlock = DMAC_MULTBLOCK_CONT;                     /* デスティネーションマルチブロックタイプ */
     431                hdma->Init.SrcHandShake = DMAC_HS_SOFTWARE;                                /* ソースハンドシェイク */
     432                hdma->Init.DrcHandShake = DMAC_HS_HARDWARE;                                /* デスティネーションハンドシェイク */
     433                hdma->Init.SrcHwhsPol = DMAC_HWHS_POLARITY_LOW;                    /* ソースハードウェアハンドシェイク極性 */
     434                hdma->Init.DrcHwhsPol = DMAC_HWHS_POLARITY_LOW;                    /* デスティネーションハードウェアハンドシェイク極性 */
     435                hdma->Init.Priority = 4;                                                                   /* 優先度 */
     436                hdma->Init.SrcMaster = DMAC_MASTER1;                                       /* ソースマスター設定 */
     437                hdma->Init.DstMaster = DMAC_MASTER2;                                       /* デスティネーションマスター設定 */
     438                hdma->Init.SrcInc = DMAC_ADDR_INCREMENT;                                   /* ソースインクリメント設定 */
     439                hdma->Init.DstInc = DMAC_ADDR_NOCHANGE;                                    /* デスティネーションインクリメント設定 */
     440                hdma->Init.SrcTransWidth = DMAC_TRANS_WIDTH_32;                    /* ソース転送幅 */
     441                hdma->Init.DstTransWidth = DMAC_TRANS_WIDTH_32;                    /* デスティネーション転送幅 */
     442                hdma->Init.SrcBurstSize = DMAC_MSIZE_4;                                    /* ソースバーストサイズ */
     443                hdma->Init.DstBurstSize = DMAC_MSIZE_4;                                    /* デスティネーションバーストサイズ */
     444                hdma->Init.IocBlkTrans = 0;                                                                /* IOCブロック転送 */
     445                hdma->localdata = (void *)hspi;
    446446                dma_init(hdma);
    447447                hspi->hdmatx = hdma;
    448448        }
    449         if(init->RxDMAChannel >= 0){
     449        if (init->RxDMAChannel >= 0) {
    450450                hdma = &spi_dma_handle[init->RxDMAChannel][1];
    451451                hdma->chnum = init->RxDMAChannel;
    452                 hdma->xfercallback      = spi_dma_comp;
    453                 hdma->errorcallback     = NULL;
    454                 hdma->Init.Request      = DMA_SELECT_SSI0_RX_REQ + spi_num * 2; /* DMA選択 */
    455                 hdma->Init.Direction    = DMA_PERIPH_TO_MEMORY; /* DMA転送方向 */
    456                 hdma->Init.SrcMultBlock = DMAC_MULTBLOCK_CONT;  /* ソースマルチブロックタイプ */
    457                 hdma->Init.DrcMultBlock = DMAC_MULTBLOCK_CONT;  /* デスティネーションマルチブロックタイプ */
    458                 hdma->Init.SrcHandShake = DMAC_HS_HARDWARE;     /* ソースハンドシェイク */
    459                 hdma->Init.DrcHandShake = DMAC_HS_SOFTWARE;     /* デスティネーションハンドシェイク */
    460                 hdma->Init.SrcHwhsPol   = DMAC_HWHS_POLARITY_LOW;       /* ソースハードウェアハンドシェイク極性 */
    461                 hdma->Init.DrcHwhsPol   = DMAC_HWHS_POLARITY_LOW;       /* デスティネーションハードウェアハンドシェイク極性 */
    462                 hdma->Init.Priority     = 4;    /* 優先度 */
    463                 hdma->Init.SrcMaster    = DMAC_MASTER1; /* ソースマスター設定 */
    464                 hdma->Init.DstMaster    = DMAC_MASTER2; /* デスティネーションマスター設定 */
    465                 hdma->Init.SrcInc       = DMAC_ADDR_NOCHANGE;   /* ソースインクリメント設定 */
    466                 hdma->Init.DstInc       = DMAC_ADDR_INCREMENT;  /* デスティネーションインクリメント設定 */
    467                 hdma->Init.SrcTransWidth = DMAC_TRANS_WIDTH_32; /* ソース転送幅 */
    468                 hdma->Init.DstTransWidth = DMAC_TRANS_WIDTH_32; /* デスティネーション転送幅 */
    469                 hdma->Init.SrcBurstSize = DMAC_MSIZE_4; /* ソースバーストサイズ */
    470                 hdma->Init.DstBurstSize = DMAC_MSIZE_4; /* デスティネーションバーストサイズ */
    471                 hdma->Init.IocBlkTrans  = 0;    /* IOCブロック転送 */
    472                 hdma->localdata         = (void *)hspi;
     452                hdma->xfercallback = spi_dma_comp;
     453                hdma->errorcallback = NULL;
     454                hdma->Init.Request = DMA_SELECT_SSI0_RX_REQ + spi_num * 2; /* DMA選択 */
     455                hdma->Init.Direction = DMA_PERIPH_TO_MEMORY;                       /* DMA転送方向 */
     456                hdma->Init.SrcMultBlock = DMAC_MULTBLOCK_CONT;                     /* ソースマルチブロックタイプ */
     457                hdma->Init.DrcMultBlock = DMAC_MULTBLOCK_CONT;                     /* デスティネーションマルチブロックタイプ */
     458                hdma->Init.SrcHandShake = DMAC_HS_HARDWARE;                                /* ソースハンドシェイク */
     459                hdma->Init.DrcHandShake = DMAC_HS_SOFTWARE;                                /* デスティネーションハンドシェイク */
     460                hdma->Init.SrcHwhsPol = DMAC_HWHS_POLARITY_LOW;                    /* ソースハードウェアハンドシェイク極性 */
     461                hdma->Init.DrcHwhsPol = DMAC_HWHS_POLARITY_LOW;                    /* デスティネーションハードウェアハンドシェイク極性 */
     462                hdma->Init.Priority = 4;                                                                   /* 優先度 */
     463                hdma->Init.SrcMaster = DMAC_MASTER1;                                       /* ソースマスター設定 */
     464                hdma->Init.DstMaster = DMAC_MASTER2;                                       /* デスティネーションマスター設定 */
     465                hdma->Init.SrcInc = DMAC_ADDR_NOCHANGE;                                    /* ソースインクリメント設定 */
     466                hdma->Init.DstInc = DMAC_ADDR_INCREMENT;                                   /* デスティネーションインクリメント設定 */
     467                hdma->Init.SrcTransWidth = DMAC_TRANS_WIDTH_32;                    /* ソース転送幅 */
     468                hdma->Init.DstTransWidth = DMAC_TRANS_WIDTH_32;                    /* デスティネーション転送幅 */
     469                hdma->Init.SrcBurstSize = DMAC_MSIZE_4;                                    /* ソースバーストサイズ */
     470                hdma->Init.DstBurstSize = DMAC_MSIZE_4;                                    /* デスティネーションバーストサイズ */
     471                hdma->Init.IocBlkTrans = 0;                                                                /* IOCブロック転送 */
     472                hdma->localdata = (void *)hspi;
    473473                dma_init(hdma);
    474474                hspi->hdmarx = hdma;
    475475        }
    476476        hspi->status = SPI_STATUS_READY;
    477         hspi->xmode  = 0;
     477        hspi->xmode = 0;
    478478        return hspi;
    479479}
     
    487487spi_deinit(SPI_Handle_t *hspi)
    488488{
    489         if(hspi == NULL)
     489        if (hspi == NULL)
    490490                return E_PAR;
    491491
    492         if(hspi->hdmatx != NULL){
     492        if (hspi->hdmatx != NULL) {
    493493                dma_deinit(hspi->hdmatx);
    494494                hspi->hdmatx = NULL;
    495495        }
    496         if(hspi->hdmarx != NULL){
     496        if (hspi->hdmarx != NULL) {
    497497                dma_deinit(hspi->hdmarx);
    498498                hspi->hdmarx = NULL;
    499499        }
    500         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SSIENR), SPI_SSIENR_DISABLE);
     500        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SSIENR), SPI_SSIENR_DISABLE);
    501501
    502502        hspi->ErrorCode = SPI_ERROR_NONE;
     
    509509 */
    510510static void
    511 spi_send_data_normal2(SPI_Handle_t *hspi, int8_t ss_no, const uint8_t *tx_buff, size_t tx_len)
    512 {
    513         size_t index, fifo_len;
     511spi_send_data_normal(SPI_Handle_t *hspi, int8_t ss_no, const uint8_t *tx_buff, size_t tx_len)
     512{
     513        size_t fifo_len;
     514        const uint32_t *src = (const uint32_t *)tx_buff;
     515
     516        if (ss_no < 0)
     517                ss_no = 0;
     518
     519        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SSIENR), SPI_SSIENR_ENABLE);
     520        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SER), (1 << ss_no));
     521        while (tx_len > 0) {
     522                fifo_len = 32 - sil_rew_mem((uint32_t *)(hspi->base + TOFF_SPI_TXFLR));
     523                fifo_len = fifo_len < tx_len ? fifo_len : tx_len;
     524                uint32_t *dst = (uint32_t *)(hspi->base + TOFF_SPI_DR);
     525                uint32_t *end = &dst[fifo_len];
     526                for (; dst < end; src++, dst++) {
     527                        sil_wrw_mem(dst, *src);
     528                }
     529                tx_len -= fifo_len;
     530
     531                int tick = 200;
     532                //sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_IMR), 0x0011);
     533                while ((sil_rew_mem((uint32_t *)(hspi->base + TOFF_SPI_SR)) & 0x05) != 0x04 && tick > 0) {
     534                        //if(hspi->Init.semid != 0)
     535                        //      twai_sem(hspi->Init.semid, 1);
     536                        //else
     537                        //      dly_tsk(1);
     538                        tick--;
     539                }
     540        }
     541}
     542
     543/*
     544 *  ポーリングデータ送信
     545 */
     546static void
     547spi_send_data_normal2(SPI_Handle_t *hspi, int8_t ss_no, uint32_t tx_data, size_t tx_len)
     548{
     549        size_t fifo_len;
    514550        uint8_t frame_width = get_framewidth(hspi->Init.DataSize);
    515         uint8_t v_misalign_flag = 0;
    516         uint32_t v_send_data;
    517         uint32_t i = 0;
    518 
    519         if((uintptr_t)tx_buff % frame_width){
    520                 v_misalign_flag = 1;
    521         }
    522         if(ss_no < 0)
     551
     552        switch (frame_width)
     553        {
     554        case 2:
     555                tx_data = (tx_data << 16) | (tx_data & 0xFFFF);
     556                break;
     557        case 1:
     558                tx_data = (tx_data << 24) | ((tx_data << 16) & 0xFF0000) | ((tx_data << 8) & 0xFF00) | (tx_data & 0xFF);
     559                break;
     560        }
     561
     562        if (ss_no < 0)
    523563                ss_no = 0;
    524564
    525         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SSIENR), SPI_SSIENR_ENABLE);
    526         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SER), (1 << ss_no));
    527         while(tx_len > 0){
    528                 fifo_len = 32 - sil_rew_mem((uint32_t *)(hspi->base+TOFF_SPI_TXFLR));
     565        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SSIENR), SPI_SSIENR_ENABLE);
     566        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SER), (1 << ss_no));
     567        while (tx_len > 0) {
     568                fifo_len = 32 - sil_rew_mem((uint32_t *)(hspi->base + TOFF_SPI_TXFLR));
    529569                fifo_len = fifo_len < tx_len ? fifo_len : tx_len;
    530                 switch(frame_width){
    531                 case SPI_TRANS_INT:
    532                         fifo_len = fifo_len / 4 * 4;
    533                         if(v_misalign_flag){
    534                                 for(index = 0; index < fifo_len; index +=4){
    535                                         memcpy(&v_send_data, tx_buff + i , 4);
    536                                         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_DR), v_send_data);
    537                                         i += 4;
    538                                 }
    539                         }
    540                         else{
    541                                 for(index = 0; index < fifo_len / 4; index++)
    542                                         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_DR), ((uint32_t *)tx_buff)[i++]);
    543                         }
    544                         break;
    545                 case SPI_TRANS_SHORT:
    546                         fifo_len = fifo_len / 2 * 2;
    547                         if(v_misalign_flag){
    548                                 for(index = 0; index < fifo_len; index +=2){
    549                                         memcpy(&v_send_data, tx_buff + i, 2);
    550                                         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_DR), v_send_data);
    551                                         i += 2;
    552                                 }
    553                         }
    554                         else{
    555                                 for(index = 0; index < fifo_len / 2; index++)
    556                                         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_DR), ((uint16_t *)tx_buff)[i++]);
    557                         }
    558                         break;
    559                 default:
    560                         for(index = 0; index < fifo_len; index++)
    561                                 sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_DR), tx_buff[i++]);
    562                         break;
    563                 }
     570                uint32_t *dst = (uint32_t *)(hspi->base + TOFF_SPI_DR);
     571                uint32_t *end = &dst[fifo_len];
     572                for (; dst < end; dst++) {
     573                        sil_wrw_mem(dst, tx_data);
     574                }
    564575                tx_len -= fifo_len;
     576
     577                int tick = 200;
     578                //sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_IMR), 0x0011);
     579                while ((sil_rew_mem((uint32_t *)(hspi->base + TOFF_SPI_SR)) & 0x05) != 0x04 && tick > 0) {
     580                        //if(hspi->Init.semid != 0)
     581                        //      twai_sem(hspi->Init.semid, 1);
     582                        //else
     583                        //      dly_tsk(1);
     584                        tick--;
     585                }
    565586        }
    566587}
     
    580601        ER ercd = E_OK;
    581602
    582         if(hspi == NULL)
     603        if (hspi == NULL)
    583604                return E_PAR;
    584605
    585         if(hspi->Init.semlock != 0)
     606        if (hspi->Init.semlock != 0)
    586607                wai_sem(hspi->Init.semlock);
     608
    587609        hspi->xmode = SPI_XMODE_TX;
    588     spi_set_tmod(hspi, SPI_TMOD_TRANS);
    589         if(hspi->hdmatx != NULL){
    590                 sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_DMACR), SPI_DMACR_TXENABLE);
    591                 sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SSIENR), SPI_SSIENR_ENABLE);
    592                 hdma = spi_dmac_set_single_mode(hspi, 0, ss_no, (const void *)pdata, 
    593                                                         (void *)(hspi->base+TOFF_SPI_DR), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
    594                                                         DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, length);
     610        spi_set_tmod(hspi, SPI_TMOD_TRANS);
     611        if (hspi->hdmatx != NULL) {
     612                sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_DMACR), SPI_DMACR_TXENABLE);
     613                sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SSIENR), SPI_SSIENR_ENABLE);
     614                hdma = spi_dmac_set_single_mode(hspi, 0, ss_no, (const void *)pdata,
     615                                                                                (void *)(hspi->base + TOFF_SPI_DR), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
     616                                                                                DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, length);
    595617                spi_dmac_wait_done(hdma);
    596618        }
    597         else{
    598                 spi_send_data_normal2(hspi, ss_no, (const void *)pdata, length);
     619        else {
     620                spi_send_data_normal(hspi, ss_no, (const void *)pdata, length);
    599621        }
    600622
     
    602624        ercd = spi_inwait(hspi, SPI_WAIT_TIME * length);
    603625
    604         if(hspi->Init.semlock != 0)
     626        if (hspi->Init.semlock != 0)
    605627                sig_sem(hspi->Init.semlock);
    606628#endif
     
    622644        ER ercd = E_OK;
    623645
    624         if(hspi == NULL)
     646        if (hspi == NULL)
    625647                return E_PAR;
    626648
    627         if(hspi->Init.semlock != 0)
     649        if (hspi->Init.semlock != 0)
    628650                wai_sem(hspi->Init.semlock);
    629651
    630652        hspi->xmode = SPI_XMODE_TX;
    631653        spi_set_tmod(hspi, SPI_TMOD_TRANS);
    632         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_DMACR), SPI_DMACR_TXENABLE);
    633         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SSIENR), SPI_SSIENR_ENABLE);
    634 
    635     hdmatx = spi_dmac_set_single_mode(hspi, 0, ss_no, tx_buff, (void *)(hspi->base+TOFF_SPI_DR), DMAC_ADDR_NOCHANGE, DMAC_ADDR_NOCHANGE,
    636                                 DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, tx_len);
    637     spi_dmac_wait_done(hdmatx);
    638 
     654        if (hspi->hdmatx != NULL) {
     655                sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_DMACR), SPI_DMACR_TXENABLE);
     656                sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SSIENR), SPI_SSIENR_ENABLE);
     657
     658                hdmatx = spi_dmac_set_single_mode(hspi, 0, ss_no, tx_buff,
     659                        (void *)(hspi->base + TOFF_SPI_DR), DMAC_ADDR_NOCHANGE, DMAC_ADDR_NOCHANGE,
     660                        DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, tx_len);
     661                spi_dmac_wait_done(hdmatx);
     662        }
     663        else {
     664                spi_send_data_normal2(hspi, ss_no, *tx_buff, tx_len);
     665        }
    639666#if SPI_WAIT_TIME != 0
    640667        ercd = spi_inwait(hspi, SPI_WAIT_TIME * tx_len);
    641668
    642         if(hspi->Init.semlock != 0)
     669        if (hspi->Init.semlock != 0)
    643670                sig_sem(hspi->Init.semlock);
    644671#endif
     
    657684spi_core_receive(SPI_Handle_t *hspi, int8_t ss_no, void *rx_buff, size_t rx_len)
    658685{
    659         DMA_Handle_t * hdmarx;
     686        DMA_Handle_t *hdmarx;
    660687        ER ercd = E_OK;
    661688
    662         if(hspi == NULL || hspi->spi_num == 2)
     689        if (hspi == NULL || hspi->spi_num == 2)
    663690                return E_PAR;
    664691
    665         if(hspi->Init.semlock != 0)
     692        if (hspi->Init.semlock != 0)
    666693                wai_sem(hspi->Init.semlock);
    667694
     
    669696        spi_set_tmod(hspi, SPI_TMOD_RECV);
    670697
    671         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_CTRLR1), (rx_len - 1));
    672         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_DMACR), SPI_DMACR_RXENABLE);
    673         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SSIENR), SPI_SSIENR_ENABLE);
    674 
    675     hdmarx = spi_dmac_set_single_mode(hspi, 1, ss_no, (void *)(hspi->base+TOFF_SPI_DR), rx_buff, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
    676                            DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, rx_len);
    677     if(hspi->Init.FrameFormat == SPI_FF_STANDARD)
    678                 sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_DR), 0xFFFFFFFF);
    679     spi_dmac_wait_done(hdmarx);
    680 
    681         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SER), 0x00000000);
    682         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SSIENR), SPI_SSIENR_DISABLE);
     698        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_CTRLR1), (rx_len - 1));
     699        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_DMACR), SPI_DMACR_RXENABLE);
     700        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SSIENR), SPI_SSIENR_ENABLE);
     701
     702        hdmarx = spi_dmac_set_single_mode(hspi, 1, ss_no,
     703                (void *)(hspi->base + TOFF_SPI_DR), rx_buff, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
     704                DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, rx_len);
     705        if (hspi->Init.FrameFormat == SPI_FF_STANDARD)
     706                sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_DR), 0xFFFFFFFF);
     707        spi_dmac_wait_done(hdmarx);
     708
     709        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SER), 0x00000000);
     710        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SSIENR), SPI_SSIENR_DISABLE);
    683711
    684712#if SPI_WAIT_TIME != 0
    685713        ercd = spi_inwait(hspi, SPI_WAIT_TIME * rx_len);
    686714
    687         if(hspi->Init.semlock != 0)
     715        if (hspi->Init.semlock != 0)
    688716                sig_sem(hspi->Init.semlock);
    689717#endif
     
    703731spi_core_transrecv(SPI_Handle_t *hspi, int8_t ss_no, const uint8_t *tx_buf, uint8_t *rx_buf, size_t len)
    704732{
    705         DMA_Handle_t * hdmarx, *hdmatx;
    706     uint8_t frame_width = get_framewidth(hspi->Init.DataSize);
    707     size_t v_len = len / frame_width;
     733        DMA_Handle_t *hdmarx, *hdmatx;
     734        uint8_t frame_width = get_framewidth(hspi->Init.DataSize);
     735        size_t v_len = len / frame_width;
    708736        ER ercd = E_OK;
    709737
    710         if(hspi == NULL)
     738        if (hspi == NULL)
    711739                return E_PAR;
    712740
    713         if(hspi->Init.semlock != 0)
     741        if (hspi->Init.semlock != 0)
    714742                wai_sem(hspi->Init.semlock);
    715743
    716744        hspi->xmode = SPI_XMODE_TXRX;
    717     spi_set_tmod(hspi, SPI_TMOD_TRANS_RECV);
    718 
    719 
    720         if(hspi->hdmatx != NULL){
    721                 sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_DMACR), (SPI_DMACR_TXENABLE | SPI_DMACR_RXENABLE));
    722                 sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SSIENR), SPI_SSIENR_ENABLE);
    723 
    724             hdmarx = spi_dmac_set_single_mode(hspi, 1, ss_no, (void *)(hspi->base+TOFF_SPI_DR), rx_buf, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
    725                            DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, v_len);
    726             hdmatx = spi_dmac_set_single_mode(hspi, 0, -1, tx_buf, (void *)(hspi->base+TOFF_SPI_DR), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
    727                            DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, v_len);
    728 
    729             spi_dmac_wait_done(hdmatx);
    730         }
    731         else{
    732                 sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_DMACR), SPI_DMACR_RXENABLE);
    733                 sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SSIENR), SPI_SSIENR_ENABLE);
    734 
    735             hdmarx = spi_dmac_set_single_mode(hspi, 1, ss_no, (void *)(hspi->base+TOFF_SPI_DR), rx_buf, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
    736                            DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, v_len);
    737                 spi_send_data_normal2(hspi, -1, (const void *)tx_buf, len);
     745        spi_set_tmod(hspi, SPI_TMOD_TRANS_RECV);
     746
     747        if (hspi->hdmatx != NULL) {
     748                sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_DMACR), (SPI_DMACR_TXENABLE | SPI_DMACR_RXENABLE));
     749                sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SSIENR), SPI_SSIENR_ENABLE);
     750
     751                hdmarx = spi_dmac_set_single_mode(hspi, 1, ss_no, (void *)(hspi->base + TOFF_SPI_DR), rx_buf, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
     752                                                                                  DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, v_len);
     753                hdmatx = spi_dmac_set_single_mode(hspi, 0, -1, tx_buf, (void *)(hspi->base + TOFF_SPI_DR), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
     754                                                                                  DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, v_len);
     755
     756                spi_dmac_wait_done(hdmatx);
     757        }
     758        else {
     759                sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_DMACR), SPI_DMACR_RXENABLE);
     760                sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SSIENR), SPI_SSIENR_ENABLE);
     761
     762                hdmarx = spi_dmac_set_single_mode(hspi, 1, ss_no,
     763                        (void *)(hspi->base + TOFF_SPI_DR), rx_buf, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
     764                        DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, v_len);
     765                spi_send_data_normal(hspi, -1, (const void *)tx_buf, len);
    738766        }
    739767        spi_dmac_wait_done(hdmarx);
    740768
    741         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SER), 0x00000000);
    742         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_SSIENR), SPI_SSIENR_DISABLE);
     769        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SER), 0x00000000);
     770        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_SSIENR), SPI_SSIENR_DISABLE);
    743771
    744772#if SPI_WAIT_TIME != 0
    745773        ercd = spi_inwait(hspi, SPI_WAIT_TIME * len);
    746774
    747         if(hspi->Init.semlock != 0)
     775        if (hspi->Init.semlock != 0)
    748776                sig_sem(hspi->Init.semlock);
    749777#endif
     
    760788
    761789#if SPI_WAIT_TIME == 0
    762         if(hspi == NULL)
     790        if (hspi == NULL)
    763791                return E_PAR;
    764792        ercd = spi_inwait(hspi, timeout);
    765         if(hspi->Init.semlock != 0)
     793        if (hspi->Init.semlock != 0)
    766794                sig_sem(hspi->Init.semlock);
    767795#endif
     
    769797}
    770798
    771 
    772799/*
    773800 *  SPI割込みサービスルーチン
     
    776803spi_handler(SPI_Handle_t *hspi)
    777804{
    778         volatile uint32_t imr, isr, tmp;
    779 
    780         imr = sil_rew_mem((uint32_t *)(hspi->base+TOFF_SPI_IMR));
    781         isr = sil_rew_mem((uint32_t *)(hspi->base+TOFF_SPI_ISR));
    782         sil_wrw_mem((uint32_t *)(hspi->base+TOFF_SPI_IMR), 0);
    783 
    784         syslog_2(LOG_DEBUG, "spi_handler imr[%08x] isr[%08x]", imr, isr);
    785         tmp = sil_rew_mem((uint32_t *)(hspi->base+TOFF_SPI_ICR));
    786         if(hspi->Init.semid != 0)
     805        //volatile uint32_t imr, isr;
     806        volatile uint32_t tmp;
     807
     808        //imr = sil_rew_mem((uint32_t *)(hspi->base+TOFF_SPI_IMR));
     809        //isr = sil_rew_mem((uint32_t *)(hspi->base+TOFF_SPI_ISR));
     810        sil_wrw_mem((uint32_t *)(hspi->base + TOFF_SPI_IMR), 0);
     811
     812        //syslog_2(LOG_DEBUG, "spi_handler imr[%08x] isr[%08x]", imr, isr);
     813        tmp = sil_rew_mem((uint32_t *)(hspi->base + TOFF_SPI_ICR));
     814        if (hspi->Init.semid != 0)
    787815                isig_sem(hspi->Init.semid);
    788816        (void)(tmp);
     
    794822void spi_isr(intptr_t exinf)
    795823{
    796   spi_handler(&SpiHandle[INDEX_SPI((uint32_t)exinf)]);
    797 }
    798 
    799 
     824        spi_handler(&SpiHandle[INDEX_SPI((uint32_t)exinf)]);
     825}
  • azure_iot_hub_riscv/trunk/asp_baseplatform/pdic/k210/spi.h

    r453 r458  
    4949
    5050#ifdef __cplusplus
    51  extern "C" {
     51extern "C" {
    5252#endif
    5353
     
    5555 *  SPIポート定義
    5656 */
    57 #define SPI1_PORTID             1
    58 #define SPI2_PORTID             2
    59 #define SPI3_PORTID             3
    60 #define SPI4_PORTID             3
    61 #define NUM_SPIPORT             4
    62 
     57#define SPI1_PORTID 1
     58#define SPI2_PORTID 2
     59#define SPI3_PORTID 3
     60#define SPI4_PORTID 3
     61#define NUM_SPIPORT 4
    6362
    6463/*
    6564 *  SPI状態定義
    6665 */
    67 #define SPI_STATUS_RESET        0x0000  /* SPI未使用状態 */
    68 #define SPI_STATUS_READY        0x0001  /* SPIレディ状態 */
    69 #define SPI_STATUS_ERROR        0x0002  /* SPIエラー状態 */
    70 #define SPI_STATUS_BUSY         0x0004  /* SPI処理中 */
     66#define SPI_STATUS_RESET 0x0000 /* SPI未使用状態 */
     67#define SPI_STATUS_READY 0x0001 /* SPIレディ状態 */
     68#define SPI_STATUS_ERROR 0x0002 /* SPIエラー状態 */
     69#define SPI_STATUS_BUSY 0x0004  /* SPI処理中 */
    7170
    7271/*
    7372 *  SPI転送モード
    7473 */
    75 #define SPI_XMODE_TX            0x0000  /* 送信モード */
    76 #define SPI_XMODE_RX            0x0001  /* 受信モード */
    77 #define SPI_XMODE_TXRX          0x0002  /* 送受信モード */
     74#define SPI_XMODE_TX 0x0000       /* 送信モード */
     75#define SPI_XMODE_RX 0x0001       /* 受信モード */
     76#define SPI_XMODE_TXRX 0x0002 /* 送受信モード */
    7877
    7978/*
    8079 *  SPIエラー定義
    8180 */
    82 #define SPI_ERROR_NONE          0x00000000      /* No error */
    83 #define SPI_ERROR_MODF          0x00000001      /* MODF error */
    84 #define SPI_ERROR_CRC           0x00000002      /* CRC error */
    85 #define SPI_ERROR_OVR           0x00000004      /* OVR error */
    86 #define SPI_ERROR_FRE           0x00000008      /* FRE error */
    87 #define SPI_ERROR_DMA           0x00000010      /* DMA transfer error */
    88 #define SPI_ERROR_TIMEOUT       0x00000020
     81#define SPI_ERROR_NONE 0x00000000 /* No error */
     82#define SPI_ERROR_MODF 0x00000001 /* MODF error */
     83#define SPI_ERROR_CRC 0x00000002  /* CRC error */
     84#define SPI_ERROR_OVR 0x00000004  /* OVR error */
     85#define SPI_ERROR_FRE 0x00000008  /* FRE error */
     86#define SPI_ERROR_DMA 0x00000010  /* DMA transfer error */
     87#define SPI_ERROR_TIMEOUT 0x00000020
    8988
    9089/*
    9190 *  SPIワークモード定義
    9291 */
    93 #define SPI_WORK_MODE_0         0x00000000
    94 #define SPI_WORK_MODE_1         0x00000001
    95 #define SPI_WORK_MODE_2         0x00000002
    96 #define SPI_WORK_MODE_3         0x00000003
     92#define SPI_WORK_MODE_0 0x00000000
     93#define SPI_WORK_MODE_1 0x00000001
     94#define SPI_WORK_MODE_2 0x00000002
     95#define SPI_WORK_MODE_3 0x00000003
    9796
    9897/*
    9998 *  SPIフレームフォーマット定義
    10099 */
    101 #define SPI_FF_STANDARD         0x00000000
    102 #define SPI_FF_DUAL             0x00000001
    103 #define SPI_FF_QUAD             0x00000002
    104 #define SPI_FF_OCTAL            0x00000003
     100#define SPI_FF_STANDARD 0x00000000
     101#define SPI_FF_DUAL 0x00000001
     102#define SPI_FF_QUAD 0x00000002
     103#define SPI_FF_OCTAL 0x00000003
    105104
    106105/*
    107106 *  SPIインストラクションアドレスモード
    108107 */
    109 #define SPI_AITM_STANDARD        0x00000000
    110 #define SPI_AITM_ADDR_STANDARD   0x00000001
     108#define SPI_AITM_STANDARD 0x00000000
     109#define SPI_AITM_ADDR_STANDARD 0x00000001
    111110#define SPI_AITM_AS_FRAME_FORMAT 0x00000002
    112111
    113 
    114112/*
    115113 *  SPI転送モード定義
    116114 */
    117 #define SPI_TMOD_TRANS_RECV     0x00000000
    118 #define SPI_TMOD_TRANS          0x00000001
    119 #define SPI_TMOD_RECV           0x00000002
    120 #define SPI_TMOD_EEROM          0x00000003
     115#define SPI_TMOD_TRANS_RECV 0x00000000
     116#define SPI_TMOD_TRANS 0x00000001
     117#define SPI_TMOD_RECV 0x00000002
     118#define SPI_TMOD_EEROM 0x00000003
    121119
    122120/*
    123121 *  SPI転送データ長定義
    124122 */
    125 #define SPI_TRANS_CHAR          0x01
    126 #define SPI_TRANS_SHORT         0x02
    127 #define SPI_TRANS_INT           0x04
     123#define SPI_TRANS_CHAR 0x01
     124#define SPI_TRANS_SHORT 0x02
     125#define SPI_TRANS_INT 0x04
    128126
    129127/*
    130128 *  SPI CS選択定義
    131129 */
    132 #define SPI_CHIP_SELECT_0       0x00
    133 #define SPI_CHIP_SELECT_1       0x01
    134 #define SPI_CHIP_SELECT_2       0x02
    135 #define SPI_CHIP_SELECT_3       0x03
    136 #define SPI_CHIP_SELECT_MAX     4
    137 
    138 /*
     130#define SPI_CHIP_SELECT_0 0x00
     131#define SPI_CHIP_SELECT_1 0x01
     132#define SPI_CHIP_SELECT_2 0x02
     133#define SPI_CHIP_SELECT_3 0x03
     134#define SPI_CHIP_SELECT_MAX 4
     135
     136        /*
    139137 *  SPI 設定初期設定構造体
    140138 */
    141 typedef struct
    142 {
    143         uint32_t              WorkMode;
    144         uint32_t              FrameFormat;
    145     uint32_t              DataSize;                     /* SPI転送データサイズ */
    146         uint32_t              Prescaler;                /* SPIクロック分周設定 */
    147         uint32_t              SignBit;                  /* SPI MSB/LSB設定 */
    148         uint32_t              InstLength;               /* SPI Instraction Length */
    149         uint32_t              AddrLength;               /* SPI Address Length */
    150         uint32_t              WaitCycles;               /* SPI WaitCycles */
    151         uint32_t              IATransMode;              /* SPI 転送モード */
    152         int32_t               SclkPin;                  /* SPI SCLK-PIN */
    153         int32_t               MosiPin;                  /* SPI MOSI-PIN */
    154         int32_t               MisoPin;                  /* SPI MISO-PIN */
    155         int32_t               SsPin;                    /* SPI Slave Select-PIN */
    156         int32_t               SsNo;                             /* SPI Slave Select-Number */
    157         int32_t               TxDMAChannel;             /* SPI TxDMAチャンネル */
    158         int32_t               RxDMAChannel;             /* SPI RxDMAチャンネル */
    159         int                   semid;                    /* SPI 通信用セマフォ値 */
    160         int                   semlock;                  /* SPI ロックセマフォ値 */
    161         int                   semdmaid;                 /* SPI DMA通信用セマフォ値 */
    162 }SPI_Init_t;
    163 
    164 /*
     139        typedef struct
     140        {
     141                uint32_t WorkMode;
     142                uint32_t FrameFormat;
     143                uint32_t DataSize;        /* SPI転送データサイズ */
     144                uint32_t Prescaler;       /* SPIクロック分周設定 */
     145                uint32_t SignBit;         /* SPI MSB/LSB設定 */
     146                uint32_t InstLength;  /* SPI Instraction Length */
     147                uint32_t AddrLength;  /* SPI Address Length */
     148                uint32_t WaitCycles;  /* SPI WaitCycles */
     149                uint32_t IATransMode; /* SPI 転送モード */
     150                int32_t SclkPin;          /* SPI SCLK-PIN */
     151                int32_t MosiPin;          /* SPI MOSI-PIN */
     152                int32_t MisoPin;          /* SPI MISO-PIN */
     153                int32_t SsPin;            /* SPI Slave Select-PIN */
     154                int32_t SsNo;             /* SPI Slave Select-Number */
     155                int32_t TxDMAChannel; /* SPI TxDMAチャンネル */
     156                int32_t RxDMAChannel; /* SPI RxDMAチャンネル */
     157                int semid;                        /* SPI 通信用セマフォ値 */
     158                int semlock;              /* SPI ロックセマフォ値 */
     159                int semdmaid;             /* SPI DMA通信用セマフォ値 */
     160        } SPI_Init_t;
     161
     162        /*
    165163 *  SPIハンドラ
    166164 */
    167 typedef struct _SPI_Handle_t
    168 {
    169         unsigned long         base;                             /* SPI registers base address */
    170         SPI_Init_t            Init;                             /* SPI communication parameters */
    171         uint8_t               spi_num;
    172         uint8_t               dfs_offset;
    173         uint8_t               frf_offset;
    174         uint8_t               work_mode_offset;
    175         uint8_t               tmod_offset;
    176         uint8_t               dummy[3];
    177         uint8_t               *pTxBuffPtr;              /* Pointer to SPI Tx transfer Buffer */
    178         uint32_t              TxXferSize;               /* SPI Tx transfer size */
    179         uint32_t              TxXferCount;              /* SPI Tx Transfer Counter */
    180         uint8_t               *pRxBuffPtr;              /* Pointer to SPI Rx transfer Buffer */
    181         uint32_t              RxXferSize;               /* SPI Rx transfer size */
    182         uint32_t              RxXferCount;              /* SPI Rx Transfer Counter */
    183         DMA_Handle_t          *hdmatx;                  /* SPI Tx DMA handle parameters */
    184         DMA_Handle_t          *hdmarx;                  /* SPI Rx DMA handle parameters */
    185         uint16_t              xmode;                    /* SPI Transfar mode */
    186         volatile uint16_t     status;                   /* SPI communication state */
    187         volatile uint32_t     ErrorCode;                /* SPI Error code */
    188 }SPI_Handle_t;
    189 
    190 
    191 extern SPI_Handle_t *spi_init(ID port, const SPI_Init_t *init);
    192 extern ER spi_deinit(SPI_Handle_t *hspi);
    193 extern ER spi_core_transmit(SPI_Handle_t *hspi, int8_t ss_no, uint8_t *pdata, uint16_t length);
    194 extern ER spi_core_transmit_fill(SPI_Handle_t *hspi, int8_t ss_no, const uint32_t *tx_buff, size_t tx_len);
    195 extern ER spi_core_receive(SPI_Handle_t *hspi, int8_t ss_no, void *rx_buff, size_t rx_len);
    196 extern ER spi_core_transrecv(SPI_Handle_t *hspi, int8_t ss_no, const uint8_t *tx_buf, uint8_t *rx_buf, size_t len);
    197 extern ER spi_transmit(SPI_Handle_t *hspi, uint8_t *pdata, uint16_t length);
    198 extern ER spi_receive(SPI_Handle_t *hspi, uint8_t *pdata, uint16_t length);
    199 extern ER spi_transrecv(SPI_Handle_t *hspi, uint8_t *ptxData, uint8_t *prxData, uint16_t length);
    200 extern ER spi_wait(SPI_Handle_t *hspi, uint32_t timeout);
    201 extern void spi_handler(SPI_Handle_t *hspi);
    202 extern void spi_isr(intptr_t exinf);
    203 extern DMA_Handle_t *spi_dmac_set_single_mode(SPI_Handle_t *hspi,
    204                           uint8_t rtx,
    205                                                   int8_t  ss_no,
    206                           const void *src, void *dest, uint8_t src_inc,
    207                           uint8_t dest_inc,
    208                           uint8_t dmac_burst_size,
    209                           uint8_t dmac_trans_width,
    210                           size_t block_size);
    211 extern ER spi_dmac_wait_done(DMA_Handle_t * hdma);
    212 
     165        typedef struct _SPI_Handle_t
     166        {
     167                unsigned long base; /* SPI registers base address */
     168                SPI_Init_t Init;        /* SPI communication parameters */
     169                uint8_t spi_num;
     170                uint8_t dfs_offset;
     171                uint8_t frf_offset;
     172                uint8_t work_mode_offset;
     173                uint8_t tmod_offset;
     174                uint8_t dummy[3];
     175                uint8_t *pTxBuffPtr;             /* Pointer to SPI Tx transfer Buffer */
     176                uint32_t TxXferSize;             /* SPI Tx transfer size */
     177                uint32_t TxXferCount;            /* SPI Tx Transfer Counter */
     178                uint8_t *pRxBuffPtr;             /* Pointer to SPI Rx transfer Buffer */
     179                uint32_t RxXferSize;             /* SPI Rx transfer size */
     180                uint32_t RxXferCount;            /* SPI Rx Transfer Counter */
     181                DMA_Handle_t *hdmatx;            /* SPI Tx DMA handle parameters */
     182                DMA_Handle_t *hdmarx;            /* SPI Rx DMA handle parameters */
     183                uint16_t xmode;                          /* SPI Transfar mode */
     184                volatile uint16_t status;        /* SPI communication state */
     185                volatile uint32_t ErrorCode; /* SPI Error code */
     186        } SPI_Handle_t;
     187
     188        extern SPI_Handle_t *spi_init(ID port, const SPI_Init_t *init);
     189        extern ER spi_deinit(SPI_Handle_t *hspi);
     190        extern ER spi_core_transmit(SPI_Handle_t *hspi, int8_t ss_no, uint8_t *pdata, uint16_t length);
     191        extern ER spi_core_transmit_fill(SPI_Handle_t *hspi, int8_t ss_no, const uint32_t *tx_buff, size_t tx_len);
     192        extern ER spi_core_receive(SPI_Handle_t *hspi, int8_t ss_no, void *rx_buff, size_t rx_len);
     193        extern ER spi_core_transrecv(SPI_Handle_t *hspi, int8_t ss_no, const uint8_t *tx_buf, uint8_t *rx_buf, size_t len);
     194        extern ER spi_transmit(SPI_Handle_t *hspi, uint8_t *pdata, uint16_t length);
     195        extern ER spi_receive(SPI_Handle_t *hspi, uint8_t *pdata, uint16_t length);
     196        extern ER spi_transrecv(SPI_Handle_t *hspi, uint8_t *ptxData, uint8_t *prxData, uint16_t length);
     197        extern ER spi_wait(SPI_Handle_t *hspi, uint32_t timeout);
     198        extern void spi_handler(SPI_Handle_t *hspi);
     199        extern void spi_isr(intptr_t exinf);
     200        extern DMA_Handle_t *spi_dmac_set_single_mode(SPI_Handle_t *hspi,
     201                                                                                                  uint8_t rtx,
     202                                                                                                  int8_t ss_no,
     203                                                                                                  const void *src, void *dest, uint8_t src_inc,
     204                                                                                                  uint8_t dest_inc,
     205                                                                                                  uint8_t dmac_burst_size,
     206                                                                                                  uint8_t dmac_trans_width,
     207                                                                                                  size_t block_size);
     208        extern ER spi_dmac_wait_done(DMA_Handle_t *hdma);
    213209
    214210#ifdef __cplusplus
     
    216212#endif
    217213
    218 #endif  /* _SPI_H_ */
    219 
     214#endif /* _SPI_H_ */
  • azure_iot_hub_riscv/trunk/asp_baseplatform/pdic/k210/spi_reg.c

    r453 r458  
    169169        return ercd;
    170170}
    171 
  • azure_iot_hub_riscv/trunk/asp_baseplatform/syssvc/logtask.h

    r453 r458  
    6262
    6363#ifndef LOGTASK_STACK_SIZE
    64 #define LOGTASK_STACK_SIZE      1024    /* スタック領域のサイズ */
     64#define LOGTASK_STACK_SIZE      2048    /* スタック領域のサイズ */
    6565#endif /* LOGTASK_STACK_SIZE */
    6666
  • azure_iot_hub_riscv/trunk/asp_baseplatform/syssvc/malloc.c

    r453 r458  
    307307                ER ret;
    308308                if (sense_context())
    309                         ret = iloc_cpu();
     309                        //ret = iloc_cpu();
     310                        ret = E_CTX;
    310311                else
    311                         ret = loc_cpu();
     312                        ret = wai_sem(MALLOC_SEM);
    312313                if (ret != E_OK)
    313314                        syslog_1(LOG_ERROR, "__malloc_unlock: count[%d] loc_cpu", malloc_lock_count);
     
    322323                ER ret;
    323324                if (sense_context())
    324                         ret = iunl_cpu();
     325                        //ret = iunl_cpu();
     326                        ret = E_CTX;
    325327                else
    326                         ret = unl_cpu();
     328                        ret = sig_sem(MALLOC_SEM);
    327329                if (ret != E_OK)
    328330                        syslog_1(LOG_ERROR, "__malloc_unlock: count[%d] unl_cpu error !", malloc_lock_count);
  • azure_iot_hub_riscv/trunk/asp_baseplatform/syssvc/serial.c

    r453 r458  
    5656 */
    5757#ifndef SERIAL_RCV_BUFSZ1
    58 #define SERIAL_RCV_BUFSZ1       256                     /* ポート1の受信バッファサイズ */
    59 #endif /* SERIAL_RCV_BUFSZ1 */
     58#define SERIAL_RCV_BUFSZ1 256 /* ポート1の受信バッファサイズ */
     59#endif                                            /* SERIAL_RCV_BUFSZ1 */
    6060
    6161#ifndef SERIAL_SND_BUFSZ1
    62 #define SERIAL_SND_BUFSZ1       256                     /* ポート1の送信バッファサイズ */
    63 #endif /* SERIAL_SND_BUFSZ1 */
    64 
    65 static char     rcv_buffer1[SERIAL_RCV_BUFSZ1];
    66 static char     snd_buffer1[SERIAL_SND_BUFSZ1];
    67 
    68 #if TNUM_PORT >= 2                                              /* ポート2に関する定義 */
     62#define SERIAL_SND_BUFSZ1 256 /* ポート1の送信バッファサイズ */
     63#endif                                            /* SERIAL_SND_BUFSZ1 */
     64
     65static char rcv_buffer1[SERIAL_RCV_BUFSZ1];
     66static char snd_buffer1[SERIAL_SND_BUFSZ1];
     67
     68#if TNUM_PORT >= 2 /* ポート2に関する定義 */
    6969
    7070#ifndef SERIAL_RCV_BUFSZ2
    71 #define SERIAL_RCV_BUFSZ2       256                     /* ポート2の受信バッファサイズ */
    72 #endif /* SERIAL_RCV_BUFSZ2 */
     71#define SERIAL_RCV_BUFSZ2 256 /* ポート2の受信バッファサイズ */
     72#endif                                            /* SERIAL_RCV_BUFSZ2 */
    7373
    7474#ifndef SERIAL_SND_BUFSZ2
    75 #define SERIAL_SND_BUFSZ2       256                     /* ポート2の送信バッファサイズ */
    76 #endif /* SERIAL_SND_BUFSZ2 */
    77 
    78 static char     rcv_buffer2[SERIAL_RCV_BUFSZ2];
    79 static char     snd_buffer2[SERIAL_SND_BUFSZ2];
     75#define SERIAL_SND_BUFSZ2 256 /* ポート2の送信バッファサイズ */
     76#endif                                            /* SERIAL_SND_BUFSZ2 */
     77
     78static char rcv_buffer2[SERIAL_RCV_BUFSZ2];
     79static char snd_buffer2[SERIAL_SND_BUFSZ2];
    8080
    8181#endif /* TNUM_PORT >= 2 */
    8282
    83 #if TNUM_PORT >= 3                                              /* ポート3に関する定義 */
     83#if TNUM_PORT >= 3 /* ポート3に関する定義 */
    8484
    8585#ifndef SERIAL_RCV_BUFSZ3
    86 #define SERIAL_RCV_BUFSZ3       256                     /* ポート3の受信バッファサイズ */
    87 #endif /* SERIAL_RCV_BUFSZ3 */
     86#define SERIAL_RCV_BUFSZ3 256 /* ポート3の受信バッファサイズ */
     87#endif                                            /* SERIAL_RCV_BUFSZ3 */
    8888
    8989#ifndef SERIAL_SND_BUFSZ3
    90 #define SERIAL_SND_BUFSZ3       256                     /* ポート3の送信バッファサイズ */
    91 #endif /* SERIAL_SND_BUFSZ3 */
    92 
    93 static char     rcv_buffer3[SERIAL_RCV_BUFSZ3];
    94 static char     snd_buffer3[SERIAL_SND_BUFSZ3];
     90#define SERIAL_SND_BUFSZ3 256 /* ポート3の送信バッファサイズ */
     91#endif                                            /* SERIAL_SND_BUFSZ3 */
     92
     93static char rcv_buffer3[SERIAL_RCV_BUFSZ3];
     94static char snd_buffer3[SERIAL_SND_BUFSZ3];
    9595
    9696#endif /* TNUM_PORT >= 3 */
    9797
    98 #if TNUM_PORT >= 4                                              /* ポート4に関する定義 */
     98#if TNUM_PORT >= 4 /* ポート4に関する定義 */
    9999
    100100#ifndef SERIAL_RCV_BUFSZ4
    101 #define SERIAL_RCV_BUFSZ4       256                     /* ポート4の受信バッファサイズ */
    102 #endif /* SERIAL_RCV_BUFSZ4 */
     101#define SERIAL_RCV_BUFSZ4 256 /* ポート4の受信バッファサイズ */
     102#endif                                            /* SERIAL_RCV_BUFSZ4 */
    103103
    104104#ifndef SERIAL_SND_BUFSZ4
    105 #define SERIAL_SND_BUFSZ4       256                     /* ポート4の送信バッファサイズ */
    106 #endif /* SERIAL_SND_BUFSZ4 */
    107 
    108 static char     rcv_buffer4[SERIAL_RCV_BUFSZ4];
    109 static char     snd_buffer4[SERIAL_SND_BUFSZ4];
     105#define SERIAL_SND_BUFSZ4 256 /* ポート4の送信バッファサイズ */
     106#endif                                            /* SERIAL_SND_BUFSZ4 */
     107
     108static char rcv_buffer4[SERIAL_RCV_BUFSZ4];
     109static char snd_buffer4[SERIAL_SND_BUFSZ4];
    110110
    111111#endif /* TNUM_PORT >= 4 */
     
    118118 *  フロー制御に関連する定数とマクロ
    119119 */
    120 #define FC_STOP                 '\023'          /* コントロール-S */
    121 #define FC_START                '\021'          /* コントロール-Q */
    122 
    123 #define BUFCNT_STOP(bufsz)              ((bufsz) * 3 / 4)       /* STOPを送る基準文字数 */
    124 #define BUFCNT_START(bufsz)             ((bufsz) / 2)           /* STARTを送る基準文字数 */
     120#define FC_STOP '\023'  /* コントロール-S */
     121#define FC_START '\021' /* コントロール-Q */
     122
     123#define BUFCNT_STOP(bufsz) ((bufsz)*3 / 4) /* STOPを送る基準文字数 */
     124#define BUFCNT_START(bufsz) ((bufsz) / 2)  /* STARTを送る基準文字数 */
    125125
    126126/*
     
    128128 */
    129129typedef struct serial_port_initialization_block {
    130         ID              rcv_semid;              /* 受信バッファ管理用セマフォのID */
    131         ID              snd_semid;              /* 送信バッファ管理用セマフォのID */
    132         uint_t  rcv_bufsz;              /* 受信バッファサイズ */
    133         char    *rcv_buffer;    /* 受信バッファ */
    134         uint_t  snd_bufsz;              /* 送信バッファサイズ */
    135         char    *snd_buffer;    /* 送信バッファ */
     130        ID rcv_semid;     /* 受信バッファ管理用セマフォのID */
     131        ID snd_semid;     /* 送信バッファ管理用セマフォのID */
     132        uint_t rcv_bufsz; /* 受信バッファサイズ */
     133        char *rcv_buffer; /* 受信バッファ */
     134        uint_t snd_bufsz; /* 送信バッファサイズ */
     135        char *snd_buffer; /* 送信バッファ */
    136136} SPINIB;
    137137
    138138static const SPINIB spinib_table[TNUM_PORT] = {
    139         { SERIAL_RCV_SEM1, SERIAL_SND_SEM1,
    140           SERIAL_RCV_BUFSZ1, rcv_buffer1,
    141           SERIAL_SND_BUFSZ1, snd_buffer1 },
     139        {SERIAL_RCV_SEM1, SERIAL_SND_SEM1,
     140         SERIAL_RCV_BUFSZ1, rcv_buffer1,
     141         SERIAL_SND_BUFSZ1, snd_buffer1},
    142142#if TNUM_PORT >= 2
    143         { SERIAL_RCV_SEM2, SERIAL_SND_SEM2,
    144           SERIAL_RCV_BUFSZ2, rcv_buffer2,
    145           SERIAL_SND_BUFSZ2, snd_buffer2 },
     143        {SERIAL_RCV_SEM2, SERIAL_SND_SEM2,
     144         SERIAL_RCV_BUFSZ2, rcv_buffer2,
     145         SERIAL_SND_BUFSZ2, snd_buffer2},
    146146#endif /* TNUM_PORT >= 2 */
    147147#if TNUM_PORT >= 3
    148         { SERIAL_RCV_SEM3, SERIAL_SND_SEM3,
    149           SERIAL_RCV_BUFSZ3, rcv_buffer3,
    150           SERIAL_SND_BUFSZ3, snd_buffer3 },
     148        {SERIAL_RCV_SEM3, SERIAL_SND_SEM3,
     149         SERIAL_RCV_BUFSZ3, rcv_buffer3,
     150         SERIAL_SND_BUFSZ3, snd_buffer3},
    151151#endif /* TNUM_PORT >= 3 */
    152152#if TNUM_PORT >= 4
    153         { SERIAL_RCV_SEM4, SERIAL_SND_SEM4,
    154           SERIAL_RCV_BUFSZ4, rcv_buffer4,
    155           SERIAL_SND_BUFSZ4, snd_buffer4 },
     153        {SERIAL_RCV_SEM4, SERIAL_SND_SEM4,
     154         SERIAL_RCV_BUFSZ4, rcv_buffer4,
     155         SERIAL_SND_BUFSZ4, snd_buffer4},
    156156#endif /* TNUM_PORT >= 4 */
    157157};
     
    161161 */
    162162typedef struct serial_port_control_block {
    163         const SPINIB *p_spinib;         /* シリアルポート初期化ブロック */
    164         SIOPCB  *p_siopcb;                      /* シリアルI/Oポート管理ブロック */
    165         bool_t  openflag;                       /* オープン済みフラグ */
    166         bool_t  errorflag;                      /* エラーフラグ */
    167         uint_t  ioctl;                          /* 動作制御の設定値 */
    168 
    169         uint_t  rcv_read_ptr;           /* 受信バッファ読出しポインタ */
    170         uint_t  rcv_write_ptr;          /* 受信バッファ書込みポインタ */
    171         uint_t  rcv_count;                      /* 受信バッファ中の文字数 */
    172         char    rcv_fc_chr;                     /* 送るべきSTART/STOP */
    173         bool_t  rcv_stopped;            /* STOPを送った状態か? */
    174 
    175         uint_t  snd_read_ptr;           /* 送信バッファ読出しポインタ */
    176         uint_t  snd_write_ptr;          /* 送信バッファ書込みポインタ */
    177         uint_t  snd_count;                      /* 送信バッファ中の文字数 */
    178         bool_t  snd_stopped;            /* STOPを受け取った状態か? */
     163        const SPINIB *p_spinib; /* シリアルポート初期化ブロック */
     164        SIOPCB *p_siopcb;               /* シリアルI/Oポート管理ブロック */
     165        bool_t openflag;                /* オープン済みフラグ */
     166        bool_t errorflag;               /* エラーフラグ */
     167        uint_t ioctl;                   /* 動作制御の設定値 */
     168
     169        uint_t rcv_read_ptr;  /* 受信バッファ読出しポインタ */
     170        uint_t rcv_write_ptr; /* 受信バッファ書込みポインタ */
     171        uint_t rcv_count;         /* 受信バッファ中の文字数 */
     172        char rcv_fc_chr;          /* 送るべきSTART/STOP */
     173        bool_t rcv_stopped;       /* STOPを送った状態か? */
     174
     175        uint_t snd_read_ptr;  /* 送信バッファ読出しポインタ */
     176        uint_t snd_write_ptr; /* 送信バッファ書込みポインタ */
     177        uint_t snd_count;         /* 送信バッファ中の文字数 */
     178        bool_t snd_stopped;       /* STOPを受け取った状態か? */
    179179} SPCB;
    180180
    181 static SPCB     spcb_table[TNUM_PORT];
     181static SPCB spcb_table[TNUM_PORT];
    182182
    183183/*
    184184 *  シリアルポートIDからシリアルポート管理ブロックを取り出すためのマクロ
    185185 */
    186 #define INDEX_PORT(portid)      ((uint_t)((portid) - 1))
    187 #define get_spcb(portid)        (&(spcb_table[INDEX_PORT(portid)]))
     186#define INDEX_PORT(portid) ((uint_t)((portid)-1))
     187#define get_spcb(portid) (&(spcb_table[INDEX_PORT(portid)]))
    188188
    189189/*
    190190 *  ポインタのインクリメント
    191191 */
    192 #define INC_PTR(ptr, bufsz) do {        \
    193         if (++(ptr) == (bufsz)) {               \
    194                 (ptr) = 0;                                      \
    195          }                                                              \
    196 } while (false)
     192#define INC_PTR(ptr, bufsz) do {   \
     193                if (++(ptr) == (bufsz)) {  \
     194                        (ptr) = 0;             \
     195                }                          \
     196        } while (false)
    197197
    198198/*
     
    202202 *  合には,ercにercd_expを評価した値を代入し,error_exitにgotoする.
    203203 */
    204 #define SVC(exp, ercd_exp) do {         \
    205         if ((exp) < 0) {                                \
    206                 ercd = (ercd_exp);                      \
    207                 goto error_exit;                        \
    208         }                                                               \
    209 } while (false)
     204#define SVC(exp, ercd_exp) do {    \
     205                if ((exp) < 0) {           \
     206                        ercd = (ercd_exp);     \
     207                        goto error_exit;       \
     208                }                          \
     209        } while (false)
    210210
    211211/*
     
    216216{
    217217        p_spcb->errorflag = true;
    218         return(E_SYS);
     218        return (E_SYS);
    219219}
    220220
     
    228228        case E_RLWAI:
    229229        case E_DLT:
    230                 return(rercd);
     230                return (rercd);
    231231        default:
    232232                p_spcb->errorflag = true;
    233                 return(E_SYS);
     233                return (E_SYS);
    234234        }
    235235}
     
    241241serial_initialize(intptr_t exinf)
    242242{
    243         uint_t  i;
    244         SPCB    *p_spcb;
     243        uint_t i;
     244        SPCB *p_spcb;
    245245
    246246        for (i = 0; i < TNUM_PORT; i++) {
     
    257257serial_opn_por(ID portid)
    258258{
    259         SPCB    *p_spcb;
    260         ER              ercd;
    261 
    262         if (sns_dpn()) {                                /* コンテキストのチェック */
    263                 return(E_CTX);
     259        SPCB *p_spcb;
     260        ER ercd;
     261
     262        if (sns_dpn()) { /* コンテキストのチェック */
     263                return (E_CTX);
    264264        }
    265265        if (!(1 <= portid && portid <= TNUM_PORT)) {
    266                 return(E_ID);                           /* ポート番号のチェック */
     266                return (E_ID); /* ポート番号のチェック */
    267267        }
    268268        p_spcb = get_spcb(portid);
    269269
    270270        SVC(dis_dsp(), gen_ercd_sys(p_spcb));
    271         if (p_spcb->openflag) {                 /* オープン済みかのチェック */
     271        if (p_spcb->openflag) { /* オープン済みかのチェック */
    272272                ercd = E_OBJ;
    273273        }
     
    292292                 *  これ以降,割込みを禁止する.
    293293                 */
    294                 if (loc_cpu() < 0) {
     294                if (loc_cpu() < 0)      {
    295295                        ercd = E_SYS;
    296296                        goto error_exit_enadsp;
     
    300300                 *  ハードウェア依存のオープン処理
    301301                 */
    302                 p_spcb->p_siopcb = sio_opn_por(portid, (intptr_t) p_spcb);
     302                p_spcb->p_siopcb = sio_opn_por(portid, (intptr_t)p_spcb);
    303303
    304304                /*
     
    317317        }
    318318
    319   error_exit_enadsp:
     319error_exit_enadsp:
    320320        SVC(ena_dsp(), gen_ercd_sys(p_spcb));
    321321
    322   error_exit:
    323         return(ercd);
     322error_exit:
     323        return (ercd);
    324324}
    325325
     
    330330serial_cls_por(ID portid)
    331331{
    332         SPCB    *p_spcb;
    333         ER              ercd;
    334         bool_t  eflag = false;
    335 
    336         if (sns_dpn()) {                                /* コンテキストのチェック */
    337                 return(E_CTX);
     332        SPCB *p_spcb;
     333        ER ercd;
     334        bool_t eflag = false;
     335
     336        if (sns_dpn()) { /* コンテキストのチェック */
     337                return (E_CTX);
    338338        }
    339339        if (!(1 <= portid && portid <= TNUM_PORT)) {
    340                 return(E_ID);                           /* ポート番号のチェック */
     340                return (E_ID); /* ポート番号のチェック */
    341341        }
    342342        p_spcb = get_spcb(portid);
    343343
    344344        SVC(dis_dsp(), gen_ercd_sys(p_spcb));
    345         if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
     345        if (!(p_spcb->openflag)) { /* オープン済みかのチェック */
    346346                ercd = E_OBJ;
    347347        }
     
    381381        SVC(ena_dsp(), gen_ercd_sys(p_spcb));
    382382
    383   error_exit:
    384         return(ercd);
     383error_exit:
     384        return (ercd);
    385385}
    386386
     
    397397{
    398398        if (sio_snd_chr(p_spcb->p_siopcb, c)) {
    399                 return(true);
     399                return (true);
    400400        }
    401401        else {
    402402                sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_SND);
    403                 return(false);
     403                return (false);
    404404        }
    405405}
     
    411411serial_wri_chr(SPCB *p_spcb, char c)
    412412{
    413         bool_t  buffer_full;
    414         ER              ercd, rercd;
     413        bool_t buffer_full;
     414        ER ercd, rercd;
    415415
    416416        /*
     
    424424                 */
    425425                SVC(rercd = serial_wri_chr(p_spcb, '\r'), rercd);
    426                 if ((bool_t) rercd) {
     426                if ((bool_t)rercd) {
    427427                        SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid),
    428                                                                                 gen_ercd_wait(rercd, p_spcb));
     428                                gen_ercd_wait(rercd, p_spcb));
    429429                }
    430430        }
     
    432432        SVC(loc_cpu(), gen_ercd_sys(p_spcb));
    433433        if (p_spcb->snd_count == 0U && !(p_spcb->snd_stopped)
    434                                                                 && serial_snd_chr(p_spcb, c)) {
     434                && serial_snd_chr(p_spcb, c)) {
    435435                /*
    436436                 *  シリアルI/Oデバイスの送信レジスタに文字を入れることに成功し
     
    450450
    451451        SVC(unl_cpu(), gen_ercd_sys(p_spcb));
    452         ercd = (ER_BOOL) buffer_full;
    453 
    454   error_exit:
    455         return(ercd);
     452        ercd = (ER_BOOL)buffer_full;
     453
     454error_exit:
     455        return (ercd);
    456456}
    457457
     
    462462serial_wri_dat(ID portid, const char *buf, uint_t len)
    463463{
    464         SPCB    *p_spcb;
    465         bool_t  buffer_full;
    466         uint_t  wricnt = 0U;
    467         ER              ercd, rercd;
    468 
    469         if (sns_dpn()) {                                /* コンテキストのチェック */
    470                 return(E_CTX);
     464        SPCB *p_spcb;
     465        bool_t buffer_full;
     466        uint_t wricnt = 0U;
     467        ER ercd, rercd;
     468
     469        if (sns_dpn()) { /* コンテキストのチェック */
     470                return (E_CTX);
    471471        }
    472472        if (!(1 <= portid && portid <= TNUM_PORT)) {
    473                 return(E_ID);                           /* ポート番号のチェック */
     473                return (E_ID); /* ポート番号のチェック */
    474474        }
    475475
    476476        p_spcb = get_spcb(portid);
    477         if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
    478                 return(E_OBJ);
    479         }
    480         if (p_spcb->errorflag) {                /* エラー状態かのチェック */
    481                 return(E_SYS);
    482         }
    483 
    484         buffer_full = true;                             /* ループの1回めはwai_semする */
     477        if (!(p_spcb->openflag)) { /* オープン済みかのチェック */
     478                return (E_OBJ);
     479        }
     480        if (p_spcb->errorflag) { /* エラー状態かのチェック */
     481                return (E_SYS);
     482        }
     483
     484        buffer_full = true; /* ループの1回めはwai_semする */
    485485        while (wricnt < len) {
    486486                if (buffer_full) {
    487487                        SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid),
    488                                                                                 gen_ercd_wait(rercd, p_spcb));
     488                                gen_ercd_wait(rercd, p_spcb));
    489489                }
    490490                SVC(rercd = serial_wri_chr(p_spcb, *buf++), rercd);
    491491                wricnt++;
    492                 buffer_full = (bool_t) rercd;
     492                buffer_full = (bool_t)rercd;
    493493        }
    494494        if (!buffer_full) {
     
    497497        ercd = E_OK;
    498498
    499   error_exit:
    500         return(wricnt > 0U ? (ER_UINT) wricnt : ercd);
     499error_exit:
     500        return (wricnt > 0U ? (ER_UINT)wricnt : ercd);
    501501}
    502502
     
    507507serial_rea_chr(SPCB *p_spcb, char *p_c)
    508508{
    509         bool_t  buffer_empty;
    510         ER              ercd;
     509        bool_t buffer_empty;
     510        ER ercd;
    511511
    512512        SVC(loc_cpu(), gen_ercd_sys(p_spcb));
     
    523523         *  STARTを送信する.
    524524         */
    525         if (p_spcb->rcv_stopped && p_spcb->rcv_count
    526                                                                 <= BUFCNT_START(p_spcb->p_spinib->rcv_bufsz)) {
     525        if (p_spcb->rcv_stopped
     526                && p_spcb->rcv_count <= BUFCNT_START(p_spcb->p_spinib->rcv_bufsz)) {
    527527                if (!serial_snd_chr(p_spcb, FC_START)) {
    528528                        p_spcb->rcv_fc_chr = FC_START;
     
    532532
    533533        SVC(unl_cpu(), gen_ercd_sys(p_spcb));
    534         ercd = (ER_BOOL) buffer_empty;
    535 
    536   error_exit:
    537         return(ercd);
     534        ercd = (ER_BOOL)buffer_empty;
     535
     536error_exit:
     537        return (ercd);
    538538}
    539539
     
    544544serial_rea_dat(ID portid, char *buf, uint_t len)
    545545{
    546         SPCB    *p_spcb;
    547         bool_t  buffer_empty;
    548         uint_t  reacnt = 0U;
    549         char    c = '\0';               /* コンパイラの警告を抑止するために初期化する */
    550         ER              ercd, rercd;
    551 
    552         if (sns_dpn()) {                                /* コンテキストのチェック */
    553                 return(E_CTX);
     546        SPCB *p_spcb;
     547        bool_t buffer_empty;
     548        uint_t reacnt = 0U;
     549        char c = '\0'; /* コンパイラの警告を抑止するために初期化する */
     550        ER ercd, rercd;
     551
     552        if (sns_dpn()) { /* コンテキストのチェック */
     553                return (E_CTX);
    554554        }
    555555        if (!(1 <= portid && portid <= TNUM_PORT)) {
    556                 return(E_ID);                           /* ポート番号のチェック */
     556                return (E_ID); /* ポート番号のチェック */
    557557        }
    558558
    559559        p_spcb = get_spcb(portid);
    560         if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
    561                 return(E_OBJ);
    562         }
    563         if (p_spcb->errorflag) {                /* エラー状態かのチェック */
    564                 return(E_SYS);
    565         }
    566 
    567         buffer_empty = true;                    /* ループの1回めはwai_semする */
     560        if (!(p_spcb->openflag)) { /* オープン済みかのチェック */
     561                return (E_OBJ);
     562        }
     563        if (p_spcb->errorflag) { /* エラー状態かのチェック */
     564                return (E_SYS);
     565        }
     566
     567        buffer_empty = true; /* ループの1回めはwai_semする */
    568568        while (reacnt < len) {
    569569                if (buffer_empty) {
    570570                        SVC(rercd = wai_sem(p_spcb->p_spinib->rcv_semid),
    571                                                                                 gen_ercd_wait(rercd, p_spcb));
     571                                gen_ercd_wait(rercd, p_spcb));
    572572                }
    573573                SVC(rercd = serial_rea_chr(p_spcb, &c), rercd);
    574574                *buf++ = c;
    575575                reacnt++;
    576                 buffer_empty = (bool_t) rercd;
     576                buffer_empty = (bool_t)rercd;
    577577
    578578                /*
     
    581581                if ((p_spcb->ioctl & IOCTL_ECHO) != 0U) {
    582582                        SVC(rercd = wai_sem(p_spcb->p_spinib->snd_semid),
    583                                                                                 gen_ercd_wait(rercd, p_spcb));
     583                                gen_ercd_wait(rercd, p_spcb));
    584584                        SVC(rercd = serial_wri_chr(p_spcb, c), rercd);
    585                         if (!((bool_t) rercd)) {
     585                        if (!((bool_t)rercd)) {
    586586                                SVC(sig_sem(p_spcb->p_spinib->snd_semid),
    587                                                                                 gen_ercd_sys(p_spcb));
     587                                        gen_ercd_sys(p_spcb));
    588588                        }
    589589                }
     
    594594        ercd = E_OK;
    595595
    596   error_exit:
    597         return(reacnt > 0U ? (ER_UINT) reacnt : ercd);
     596error_exit:
     597        return (reacnt > 0U ? (ER_UINT)reacnt : ercd);
    598598}
    599599
     
    604604serial_ctl_por(ID portid, uint_t ioctl)
    605605{
    606         SPCB    *p_spcb;
    607 
    608         if (sns_dpn()) {                                /* コンテキストのチェック */
    609                 return(E_CTX);
     606        SPCB *p_spcb;
     607
     608        if (sns_dpn()) { /* コンテキストのチェック */
     609                return (E_CTX);
    610610        }
    611611        if (!(1 <= portid && portid <= TNUM_PORT)) {
    612                 return(E_ID);                           /* ポート番号のチェック */
     612                return (E_ID); /* ポート番号のチェック */
    613613        }
    614614
    615615        p_spcb = get_spcb(portid);
    616         if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
    617                 return(E_OBJ);
    618         }
    619         if (p_spcb->errorflag) {                /* エラー状態かのチェック */
    620                 return(E_SYS);
     616        if (!(p_spcb->openflag)) { /* オープン済みかのチェック */
     617                return (E_OBJ);
     618        }
     619        if (p_spcb->errorflag) { /* エラー状態かのチェック */
     620                return (E_SYS);
    621621        }
    622622
    623623        p_spcb->ioctl = ioctl;
    624         return(E_OK);
     624        return (E_OK);
    625625}
    626626
     
    631631serial_ref_por(ID portid, T_SERIAL_RPOR *pk_rpor)
    632632{
    633         SPCB    *p_spcb;
    634 
    635         if (sns_dpn()) {                                /* コンテキストのチェック */
    636                 return(E_CTX);
     633        SPCB *p_spcb;
     634
     635        if (sns_dpn()) { /* コンテキストのチェック */
     636                return (E_CTX);
    637637        }
    638638        if (!(1 <= portid && portid <= TNUM_PORT)) {
    639                 return(E_ID);                           /* ポート番号のチェック */
     639                return (E_ID); /* ポート番号のチェック */
    640640        }
    641641
    642642        p_spcb = get_spcb(portid);
    643         if (!(p_spcb->openflag)) {              /* オープン済みかのチェック */
    644                 return(E_OBJ);
    645         }
    646         if (p_spcb->errorflag) {                /* エラー状態かのチェック */
    647                 return(E_SYS);
     643        if (!(p_spcb->openflag)) { /* オープン済みかのチェック */
     644                return (E_OBJ);
     645        }
     646        if (p_spcb->errorflag) { /* エラー状態かのチェック */
     647                return (E_SYS);
    648648        }
    649649
    650650        pk_rpor->reacnt = p_spcb->rcv_count;
    651651        pk_rpor->wricnt = p_spcb->snd_count;
    652         return(E_OK);
     652        return (E_OK);
    653653}
    654654
     
    659659sio_irdy_snd(intptr_t exinf)
    660660{
    661         SPCB    *p_spcb;
    662 
    663         p_spcb = (SPCB *) exinf;
    664         if (p_spcb->rcv_fc_chr != '\0') {
    665                 /*
    666                  *  START/STOP を送信する.
    667                  */
    668                 (void) sio_snd_chr(p_spcb->p_siopcb, p_spcb->rcv_fc_chr);
    669                 p_spcb->rcv_fc_chr = '\0';
    670         }
    671         else if (!(p_spcb->snd_stopped) && p_spcb->snd_count > 0U) {
    672                 /*
    673                  *  送信バッファ中から文字を取り出して送信する.
    674                  */
    675                 (void) sio_snd_chr(p_spcb->p_siopcb,
    676                                         p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]);
    677                 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
    678                 if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) {
    679                         if (isig_sem(p_spcb->p_spinib->snd_semid) < 0) {
    680                                 p_spcb->errorflag = true;
     661        SPCB *p_spcb;
     662
     663        p_spcb = (SPCB *)exinf;
     664        for (;;) {
     665                if (p_spcb->rcv_fc_chr != '\0') {
     666                        /*
     667                        *  START/STOP を送信する.
     668                        */
     669                        if (!sio_snd_chr(p_spcb->p_siopcb, p_spcb->rcv_fc_chr))
     670                                break;
     671                        p_spcb->rcv_fc_chr = '\0';
     672                }
     673                else if (!(p_spcb->snd_stopped) && p_spcb->snd_count > 0U) {
     674                        /*
     675                        *  送信バッファ中から文字を取り出して送信する.
     676                        */
     677                        if (!sio_snd_chr(p_spcb->p_siopcb,
     678                                                         p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]))
     679                                break;
     680                        INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
     681                        if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) {
     682                                if (isig_sem(p_spcb->p_spinib->snd_semid) < 0) {
     683                                        p_spcb->errorflag = true;
     684                                }
    681685                        }
    682                 }
    683                 p_spcb->snd_count--;
    684         }
    685         else {
    686                 /*
    687                  *  送信すべき文字がない場合は,送信可能コールバックを禁止する.
    688                  */
    689                 sio_dis_cbr(p_spcb->p_siopcb, SIO_RDY_SND);
     686                        p_spcb->snd_count--;
     687                }
     688                else {
     689                        /*
     690                        *  送信すべき文字がない場合は,送信可能コールバックを禁止する.
     691                        */
     692                        sio_dis_cbr(p_spcb->p_siopcb, SIO_RDY_SND);
     693                        break;
     694                }
    690695        }
    691696}
     
    697702sio_irdy_rcv(intptr_t exinf)
    698703{
    699         SPCB    *p_spcb;
    700         char    c;
    701 
    702         p_spcb = (SPCB *) exinf;
    703         c = (char) sio_rcv_chr(p_spcb->p_siopcb);
    704         if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_STOP) {
    705                 /*
    706                  *  送信を一時停止する.送信中の文字はそのまま送信する.
    707                  */
    708                 p_spcb->snd_stopped = true;
    709         }
    710         else if (p_spcb->snd_stopped && (c == FC_START
    711                                 || (p_spcb->ioctl & IOCTL_FCANY) != 0U)) {
    712                 /*
    713                  *  送信を再開する.
    714                  */
    715                 p_spcb->snd_stopped = false;
    716                 if (p_spcb->snd_count > 0U) {
    717                         c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr];
    718                         if (serial_snd_chr(p_spcb, c)) {
    719                                 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
    720                                 if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) {
    721                                         if (isig_sem(p_spcb->p_spinib->snd_semid) < 0) {
    722                                                 p_spcb->errorflag = true;
     704        SPCB *p_spcb;
     705        int_t c;
     706
     707        p_spcb = (SPCB *)exinf;
     708        for (;;) {
     709                c = sio_rcv_chr(p_spcb->p_siopcb);
     710                if (c < 0)
     711                        break;
     712                if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_STOP) {
     713                        /*
     714                        *  送信を一時停止する.送信中の文字はそのまま送信する.
     715                        */
     716                        p_spcb->snd_stopped = true;
     717                }
     718                else if (p_spcb->snd_stopped && (c == FC_START
     719                        || (p_spcb->ioctl & IOCTL_FCANY) != 0U)) {
     720                        /*
     721                        *  送信を再開する.
     722                        */
     723                        p_spcb->snd_stopped = false;
     724                        if (p_spcb->snd_count > 0U) {
     725                                c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr];
     726                                if (serial_snd_chr(p_spcb, c)) {
     727                                        INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
     728                                        if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) {
     729                                                if (isig_sem(p_spcb->p_spinib->snd_semid) < 0) {
     730                                                        p_spcb->errorflag = true;
     731                                                }
    723732                                        }
     733                                        p_spcb->snd_count--;
    724734                                }
    725                                 p_spcb->snd_count--;
    726735                        }
    727736                }
    728         }
    729         else if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_START) {
    730                 /*
    731                  *  送信に対してフロー制御している場合,START は捨てる.
    732                  */
    733         }
    734         else if (p_spcb->rcv_count == p_spcb->p_spinib->rcv_bufsz) {
    735                 /*
    736                  *  バッファフルの場合,受信した文字を捨てる.
    737                  */
    738         }
    739         else {
    740                 /*
    741                  *  受信した文字を受信バッファに入れる.
    742                  */
    743                 p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_write_ptr] = c;
    744                 INC_PTR(p_spcb->rcv_write_ptr, p_spcb->p_spinib->rcv_bufsz);
    745                 if (p_spcb->rcv_count == 0U) {
    746                         if (isig_sem(p_spcb->p_spinib->rcv_semid) < 0) {
    747                                 p_spcb->errorflag = true;
     737                else if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_START) {
     738                        /*
     739                        *  送信に対してフロー制御している場合,START は捨てる.
     740                        */
     741                }
     742                else if (p_spcb->rcv_count == p_spcb->p_spinib->rcv_bufsz) {
     743                        /*
     744                        *  バッファフルの場合,受信した文字を捨てる.
     745                        */
     746                }
     747                else {
     748                        /*
     749                        *  受信した文字を受信バッファに入れる.
     750                        */
     751                        p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_write_ptr] = c;
     752                        INC_PTR(p_spcb->rcv_write_ptr, p_spcb->p_spinib->rcv_bufsz);
     753                        if (p_spcb->rcv_count == 0U) {
     754                                if (isig_sem(p_spcb->p_spinib->rcv_semid) < 0) {
     755                                        p_spcb->errorflag = true;
     756                                }
    748757                        }
    749                 }
    750                 p_spcb->rcv_count++;
    751 
    752                 /*
    753                  *  STOPを送信する.
    754                  */
    755                 if ((p_spcb->ioctl & IOCTL_FCRCV) != 0U && !(p_spcb->rcv_stopped)
    756                                                 && p_spcb->rcv_count
    757                                                         >= BUFCNT_STOP(p_spcb->p_spinib->rcv_bufsz)) {
    758                         if (!serial_snd_chr(p_spcb, FC_STOP)) {
    759                                 p_spcb->rcv_fc_chr = FC_STOP;
     758                        p_spcb->rcv_count++;
     759
     760                        /*
     761                        *  STOPを送信する.
     762                        */
     763                        if ((p_spcb->ioctl & IOCTL_FCRCV) != 0U && !(p_spcb->rcv_stopped)
     764                                && p_spcb->rcv_count >= BUFCNT_STOP(p_spcb->p_spinib->rcv_bufsz)) {
     765                                if (!serial_snd_chr(p_spcb, FC_STOP)) {
     766                                        p_spcb->rcv_fc_chr = FC_STOP;
     767                                }
     768                                p_spcb->rcv_stopped = true;
    760769                        }
    761                         p_spcb->rcv_stopped = true;
    762770                }
    763771        }
     
    770778serial_get_chr(ID portid, char *p_c)
    771779{
    772         SPCB    *p_spcb;
    773 
    774         if (1 <= portid && portid <= TNUM_PORT) {       /* ポート番号のチェック */
     780        SPCB *p_spcb;
     781
     782        if (1 <= portid && portid <= TNUM_PORT) { /* ポート番号のチェック */
    775783                p_spcb = get_spcb(portid);
    776                 if (p_spcb->openflag) {                                 /* オープン済みかのチェック */
     784                if (p_spcb->openflag) { /* オープン済みかのチェック */
    777785                        if (p_spcb->snd_count > 0U) {
    778786                                *p_c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr];
    779787                                INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
    780788                                p_spcb->snd_count--;
    781                                 return(true);
     789                                return (true);
    782790                        }
    783791                }
    784792        }
    785         return(false);
    786 }
     793        return (false);
     794}
  • azure_iot_hub_riscv/trunk/asp_baseplatform/target/k210_gcc/Makefile.target

    r453 r458  
    5656#  リンカスクリプトの定義
    5757#
    58 LDSCRIPT = $(SRCDIR)/arch/$(PRC)_$(TOOL)/riscv64elf.ld
     58LDSCRIPT = $(TARGETDIR)/kendryte-k210.ld
    5959
    6060#
  • azure_iot_hub_riscv/trunk/asp_baseplatform/target/k210_gcc/target_serial.c

    r453 r458  
    5555 *  SIL関数のマクロ定義
    5656 */
    57 #define sil_orw_mem(a, b)               sil_wrw_mem((a), sil_rew_mem(a) | (b))
    58 #define sil_andw_mem(a, b)              sil_wrw_mem((a), sil_rew_mem(a) & ~(b))
     57#define sil_orw_mem(a, b) sil_wrw_mem((a), sil_rew_mem(a) | (b))
     58#define sil_andw_mem(a, b) sil_wrw_mem((a), sil_rew_mem(a) & ~(b))
    5959
    6060/*
    6161 * レジスタ設定値
    6262 */
    63 #define INDEX_PORT(x)   ((x) - 1)
    64 #define GET_SIOPCB(x)   (&siopcb_table[INDEX_PORT(x)])
    65 
    66 #define __UART_BRATE_CONST  16
     63#define INDEX_PORT(x) ((x)-1)
     64#define GET_SIOPCB(x) (&siopcb_table[INDEX_PORT(x)])
     65
     66#define __UART_BRATE_CONST 16
    6767
    6868#ifndef COM0
    69 #define COM0                0
     69#define COM0 0
    7070#endif
    7171
     
    7373 *  ビット長パラメータ
    7474 */
    75 #define UART_WordLength_5B  0x00000000
    76 #define UART_WordLength_6B  0x00000001
    77 #define UART_WordLength_7B  0x00000002
    78 #define UART_WordLength_8b  0x00000003
     75#define UART_WordLength_5B 0x00000000
     76#define UART_WordLength_6B 0x00000001
     77#define UART_WordLength_7B 0x00000002
     78#define UART_WordLength_8b 0x00000003
    7979
    8080/*
    8181 *  ストップビットパラメータ
    82  */ 
    83 #define UART_StopBits_1     0x00000000
    84 #define UART_StopBits_1_5   UART_LCR_STB
     82 */
     83#define UART_StopBits_1 0x00000000
     84#define UART_StopBits_1_5 UART_LCR_STB
    8585
    8686/*
    8787 *  パリティパラメータ
    8888 */
    89 #define UART_Parity_No      0x00000000
    90 #define UART_Parity_Odd     UART_LCR_PARITY
    91 #define UART_Parity_Even    (UART_LCR_PARITY | UART_LCR_PEVEN)
     89#define UART_Parity_No 0x00000000
     90#define UART_Parity_Odd UART_LCR_PARITY
     91#define UART_Parity_Even (UART_LCR_PARITY | UART_LCR_PEVEN)
    9292
    9393/*
    9494 *  送信FIFO
    9595 */
    96 #define UART_SEND_FIFO0     0
    97 #define UART_SEND_FIFO2     1
    98 #define UART_SEND_FIFO4     2
    99 #define UART_SEND_FIFO8     3
     96#define UART_SEND_FIFO0 0
     97#define UART_SEND_FIFO2 1
     98#define UART_SEND_FIFO4 2
     99#define UART_SEND_FIFO8 3
    100100
    101101/*
    102102 *  受信FIFO
    103103 */
    104 #define UART_RECEIVE_FIFO1  0
    105 #define UART_RECEIVE_FIFO4  1
    106 #define UART_RECEIVE_FIFO8  2
     104#define UART_RECEIVE_FIFO1 0
     105#define UART_RECEIVE_FIFO4 1
     106#define UART_RECEIVE_FIFO8 2
    107107#define UART_RECEIVE_FIFO14 3
    108108
     
    112112typedef struct sio_port_initialization_block {
    113113        uint64_t base;
    114         INTNO    intno_usart;
     114        INTNO intno_usart;
    115115        uint32_t clk;
    116         uint8_t  txfunc;
    117         uint8_t  rxfunc;
    118         uint8_t  com;
     116        uint8_t txfunc;
     117        uint8_t rxfunc;
     118        uint8_t com;
    119119} SIOPINIB;
    120120
     
    123123 */
    124124struct sio_port_control_block {
    125         const SIOPINIB  *p_siopinib; /* シリアルI/Oポート初期化ブロック */
    126         intptr_t        exinf;        /* 拡張情報 */
    127         bool_t          opnflg;       /* オープン済みフラグ */
     125        const SIOPINIB *p_siopinib; /* シリアルI/Oポート初期化ブロック */
     126        intptr_t exinf;                         /* 拡張情報 */
     127        bool_t opnflg;                          /* オープン済みフラグ */
    128128};
    129129
     
    134134        {(uint32_t)TADR_UART1_BASE, (INTNO)IRQ_VECTOR_UART1, SYSCTL_CLK_EN_PERI_UART1_CLK_EN, FUNC_UART1_TX, FUNC_UART1_RX, COM0},
    135135#if TNUM_SIOP >= 2
    136         {(uint32_t)TADR_UART3_BASE, (INTNO)IRQ_VECTOR_UART3, SYSCTL_CLK_EN_PERI_UART3_CLK_EN, FUNC_UART3_TX, FUNC_UART3_RX, COM0^1}
     136        {(uint32_t)TADR_UART3_BASE, (INTNO)IRQ_VECTOR_UART3, SYSCTL_CLK_EN_PERI_UART3_CLK_EN, FUNC_UART3_TX, FUNC_UART3_RX, COM0 ^ 1}
    137137#endif
    138138};
     
    142142 */
    143143static uint8_t uartpin[2][2] = {
    144         {5, 4},         /* com0 tx, rx */
    145         {6, 7},         /* com1 tx, rx */
     144        {5, 4}, /* com0 tx, rx */
     145        {6, 7}, /* com1 tx, rx */
    146146};
    147147
     
    149149 *  シリアルI/Oポート管理ブロックのエリア
    150150 */
    151 SIOPCB  siopcb_table[TNUM_SIOP];
     151SIOPCB siopcb_table[TNUM_SIOP];
    152152
    153153/*
    154154 *  シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
    155155 */
    156 #define INDEX_SIOP(siopid)      ((uint_t)((siopid) - 1))
    157 #define get_siopcb(siopid)      (&(siopcb_table[INDEX_SIOP(siopid)]))
     156#define INDEX_SIOP(siopid) ((uint_t)((siopid)-1))
     157#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
    158158
    159159extern uint32_t get_pll_clock(uint8_t no);
     
    166166get_clock_aclk(void)
    167167{
    168         uint32_t clk_sel0 = sil_rew_mem((uint32_t *)(TADR_SYSCTL_BASE+TOFF_CLK_SEL0));
     168        uint32_t clk_sel0 = sil_rew_mem((uint32_t *)(TADR_SYSCTL_BASE + TOFF_CLK_SEL0));
    169169        uint32_t select = clk_sel0 & SYSCTL_CLK_SEL0_ACLK_SEL;
    170170        uint32_t source = 0;
    171171
    172         if(select == 0)
     172        if (select == 0)
    173173                source = SYSCTRL_CLOCK_FREQ_IN0;
    174         else if(select == 1)
    175                 source = get_pll_clock(0) / (2UL << ((clk_sel0 & SYSCTL_CLK_SEL0_ACLK_SDIVISER)>>1));
     174        else if (select == 1)
     175                source = get_pll_clock(0) / (2UL << ((clk_sel0 & SYSCTL_CLK_SEL0_ACLK_SDIVISER) >> 1));
    176176        return source;
    177177}
    178 
    179178
    180179void put_hex(char a, int val)
     
    183182        target_fput_log(a);
    184183        target_fput_log(' ');
    185         for(i = 28 ; i >= 0 ; i-= 4){
    186                 j = (val >> i) & 0xf;;
    187                 if(j > 9)
    188                         j += ('A'-10);
     184        for (i = 28; i >= 0; i -= 4) {
     185                j = (val >> i) & 0xf;
     186                if (j > 9)
     187                        j += ('A' - 10);
    189188                else
    190189                        j += '0';
     
    200199sio_initialize(intptr_t exinf)
    201200{
    202         SIOPCB  *p_siopcb;
    203         uint_t  i;
     201        SIOPCB *p_siopcb;
     202        uint_t i;
    204203
    205204        /*
     
    212211}
    213212
    214 
    215213/*
    216214 *  シリアルI/Oポートのオープン
     
    219217sio_opn_por(ID siopid, intptr_t exinf)
    220218{
    221         SIOPCB          *p_siopcb;
    222         const SIOPINIB  *p_siopinib;
    223         bool_t   opnflg;
    224         ER       ercd;
     219        SIOPCB *p_siopcb;
     220        const SIOPINIB *p_siopinib;
     221        bool_t opnflg;
     222        ER ercd;
    225223        unsigned long base;
    226224        uint32_t divisor, threshold, tmp;
    227         uint8_t  dlh, dll, dlf;
     225        uint8_t dlh, dll, dlf;
    228226
    229227        p_siopcb = get_siopcb(siopid);
     
    237235        p_siopcb->exinf = exinf;
    238236        base = p_siopinib->base;
    239         if(base == 0)                           /* no uart port */
     237        if (base == 0) /* no uart port */
    240238                goto sio_opn_exit;
    241239
     
    243241         *  ハードウェアの初期化
    244242         */
    245         sil_orw_mem((uint32_t *)(TADR_SYSCTL_BASE+TOFF_SYSCTL_CLK_EN_PERI), p_siopinib->clk);
    246 
    247         sil_wrw_mem((uint32_t *)(base+TOFF_UART_IER), 0x00000000);
     243        sil_orw_mem((uint32_t *)(TADR_SYSCTL_BASE + TOFF_SYSCTL_CLK_EN_PERI), p_siopinib->clk);
     244
     245        sil_wrw_mem((uint32_t *)(base + TOFF_UART_IER), 0x00000000);
    248246        sil_dly_nse(10000);
    249247
    250         threshold = (sil_rew_mem((uint32_t *)(TADR_SYSCTL_BASE+TOFF_CLK_SEL0)) & SYSCTL_CLK_SEL0_APB0_CLK_SEL) >> 3;
    251     divisor = (get_clock_aclk() / (threshold+1)) / BPS_SETTING;
    252     dlh = divisor >> 12;
    253     dll = (divisor - (dlh << 12)) / __UART_BRATE_CONST;
    254     dlf = divisor - (dlh << 12) - dll * __UART_BRATE_CONST;
    255 
    256     /* Set UART registers */
    257         sil_orw_mem((uint32_t *)(base+TOFF_UART_LCR), UART_LCR_DMD);
    258         sil_wrw_mem((uint32_t *)(base+TOFF_UART_DLH), dlh);
    259         sil_wrw_mem((uint32_t *)(base+TOFF_UART_DLL), dll);
    260         sil_wrw_mem((uint32_t *)(base+TOFF_UART_DLF), dlf);
    261         sil_wrw_mem((uint32_t *)(base+TOFF_UART_LCR), 0x00);
    262         sil_wrw_mem((uint32_t *)(base+TOFF_UART_LCR), (UART_WordLength_8b | UART_StopBits_1 | UART_Parity_No));
    263         sil_andw_mem((uint32_t *)(base+TOFF_UART_LCR), UART_LCR_DMD);
    264         sil_orw_mem((uint32_t *)(base+TOFF_UART_IER), UART_IER_THRE);
    265         sil_wrw_mem((uint32_t *)(base+TOFF_UART_FCR),
    266                         (UART_RECEIVE_FIFO1 << 6 | UART_SEND_FIFO8 << 4 | 0x1 << 3 | 0x1));
     248        threshold = (sil_rew_mem((uint32_t *)(TADR_SYSCTL_BASE + TOFF_CLK_SEL0)) & SYSCTL_CLK_SEL0_APB0_CLK_SEL) >> 3;
     249        divisor = (get_clock_aclk() / (threshold + 1)) / BPS_SETTING;
     250        dlh = divisor >> 12;
     251        dll = (divisor - (dlh << 12)) / __UART_BRATE_CONST;
     252        dlf = divisor - (dlh << 12) - dll * __UART_BRATE_CONST;
     253
     254        /* Set UART registers */
     255        sil_orw_mem((uint32_t *)(base + TOFF_UART_LCR), UART_LCR_DMD);
     256        sil_wrw_mem((uint32_t *)(base + TOFF_UART_DLH), dlh);
     257        sil_wrw_mem((uint32_t *)(base + TOFF_UART_DLL), dll);
     258        sil_wrw_mem((uint32_t *)(base + TOFF_UART_DLF), dlf);
     259        sil_wrw_mem((uint32_t *)(base + TOFF_UART_LCR), 0x00);
     260        sil_wrw_mem((uint32_t *)(base + TOFF_UART_LCR), (UART_WordLength_8b | UART_StopBits_1 | UART_Parity_No));
     261        sil_andw_mem((uint32_t *)(base + TOFF_UART_LCR), UART_LCR_DMD);
     262        sil_orw_mem((uint32_t *)(base + TOFF_UART_IER), UART_IER_THRE);
     263        sil_wrw_mem((uint32_t *)(base + TOFF_UART_FCR),
     264                                (UART_RECEIVE_FIFO14 << 6 | UART_SEND_FIFO8 << 4 /*| 0x1 << 3 DMA mode?*/ | 0x1 /*FIFO enable?*/));
     265        sil_andw_mem((uint32_t *)(base + TOFF_UART_MCR), (1 << 6) | 3);
     266        sil_wrw_mem((uint32_t *)(base + TOFF_UART_TCR), 0x00);
    267267
    268268        fpioa_set_function(uartpin[p_siopinib->com][1], p_siopinib->rxfunc);
    269269        fpioa_set_function(uartpin[p_siopinib->com][0], p_siopinib->txfunc);
    270         sil_orw_mem((uint32_t *)(base+TOFF_UART_IER), UART_IER_RIE);
    271         tmp = sil_rew_mem((uint32_t *)(p_siopcb->p_siopinib->base+TOFF_UART_RBR));
     270        sil_orw_mem((uint32_t *)(base + TOFF_UART_IER), UART_IER_RIE);
     271        tmp = sil_rew_mem((uint32_t *)(p_siopcb->p_siopinib->base + TOFF_UART_RBR));
    272272        p_siopcb->opnflg = true;
    273273        (void)(tmp);
     
    283283
    284284sio_opn_exit:;
    285         return(p_siopcb);
     285        return (p_siopcb);
    286286}
    287287
     
    292292sio_cls_por(SIOPCB *p_siopcb)
    293293{
    294         const SIOPINIB  *p_siopinib;
     294        const SIOPINIB *p_siopinib;
    295295
    296296        p_siopinib = p_siopcb->p_siopinib;
     
    305305         *  シリアル停止
    306306         */
    307         sil_wrw_mem((uint32_t *)(p_siopinib->base+TOFF_UART_IER), 0x00000000);
    308         sil_andw_mem((uint32_t *)(TADR_SYSCTL_BASE+TOFF_SYSCTL_CLK_EN_PERI), p_siopinib->clk);
     307        sil_wrw_mem((uint32_t *)(p_siopinib->base + TOFF_UART_IER), 0x00000000);
     308        sil_andw_mem((uint32_t *)(TADR_SYSCTL_BASE + TOFF_SYSCTL_CLK_EN_PERI), p_siopinib->clk);
    309309        p_siopcb->opnflg = false;
    310310}
     
    318318        SIOPCB *p_siopcb = get_siopcb(exinf);
    319319        unsigned long base = p_siopcb->p_siopinib->base;
    320         uint32_t ip = sil_rew_mem((uint32_t *)(base+TOFF_UART_IIR)) & 0x0F;
    321320        uint32_t tmp;
    322321
    323         if(ip == UART_IIR_RECEIVE || ip == UART_IIR_CTIMEOUT){
    324                 sio_irdy_rcv(p_siopcb->exinf);
    325         }
    326         else if(ip == UART_IIR_SEND){
    327                 sio_irdy_snd(p_siopcb->exinf);
    328         }
    329         else{
    330                 tmp = sil_rew_mem((uint32_t *)(base+TOFF_UART_LSR));
    331                 tmp = sil_rew_mem((uint32_t *)(base+TOFF_UART_USR));
    332                 tmp = sil_rew_mem((uint32_t *)(base+TOFF_UART_MSR));
    333         }
    334         (void)(tmp);
     322        for (;;) {
     323                uint32_t ip = sil_rew_mem((uint32_t *)(base + TOFF_UART_IIR)) & 0x0F;
     324
     325                if (ip == 1) {
     326                        break;
     327                }
     328                else if (ip == UART_IIR_RECEIVE || ip == UART_IIR_CTIMEOUT) {
     329                        sio_irdy_rcv(p_siopcb->exinf);
     330                }
     331                else if (ip == UART_IIR_SEND) {
     332                        sio_irdy_snd(p_siopcb->exinf);
     333                }
     334                else {
     335                        tmp = sil_rew_mem((uint32_t *)(base + TOFF_UART_LSR));
     336                        tmp = sil_rew_mem((uint32_t *)(base + TOFF_UART_USR));
     337                        tmp = sil_rew_mem((uint32_t *)(base + TOFF_UART_MSR));
     338                }
     339                (void)(tmp);
     340        }
    335341}
    336342
     
    339345 */
    340346Inline bool_t
    341 sio_putready(SIOPCB* p_siopcb)
    342 {
    343         uint32_t lsr = sil_rew_mem((uint32_t *)(p_siopcb->p_siopinib->base+TOFF_UART_LSR));
    344 
    345         if((lsr & UART_LSR_TFL) == 0){
     347sio_putready(SIOPCB *p_siopcb)
     348{
     349        uint32_t lsr = sil_rew_mem((uint32_t *)(p_siopcb->p_siopinib->base + TOFF_UART_LSR));
     350
     351        if ((lsr & UART_LSR_TFL) == 0) {
    346352                return 1;
    347353        }
     
    352358sio_snd_chr(SIOPCB *p_siopcb, char c)
    353359{
    354         if(sio_putready(p_siopcb)){
    355                 sil_wrw_mem((uint32_t *)(p_siopcb->p_siopinib->base+TOFF_UART_THR), (uint32_t)c);
     360        if (sio_putready(p_siopcb)) {
     361                sil_wrw_mem((uint32_t *)(p_siopcb->p_siopinib->base + TOFF_UART_THR), (uint32_t)c);
    356362                return true;
    357363        }
     
    367373        int_t c = -1;
    368374
    369         if((sil_rew_mem((uint32_t *)(p_siopcb->p_siopinib->base+TOFF_UART_LSR)) & UART_LSR_RFL) != 0){
    370                 c = sil_rew_mem((uint32_t *)(p_siopcb->p_siopinib->base+TOFF_UART_RBR)) & 0xFF;
     375        if ((sil_rew_mem((uint32_t *)(p_siopcb->p_siopinib->base + TOFF_UART_LSR)) & UART_LSR_RFL) != 0) {
     376                c = sil_rew_mem((uint32_t *)(p_siopcb->p_siopinib->base + TOFF_UART_RBR)) & 0xFF;
    371377        }
    372378        return c;
     
    381387        switch (cbrtn) {
    382388        case SIO_RDY_SND:
    383                 sil_orw_mem((uint32_t *)(p_siopcb->p_siopinib->base+TOFF_UART_IER), UART_IER_TIE);
     389                sil_orw_mem((uint32_t *)(p_siopcb->p_siopinib->base + TOFF_UART_IER), UART_IER_TIE);
    384390                break;
    385391        case SIO_RDY_RCV:
    386                 sil_orw_mem((uint32_t *)(p_siopcb->p_siopinib->base+TOFF_UART_IER), UART_IER_RIE);
     392                sil_orw_mem((uint32_t *)(p_siopcb->p_siopinib->base + TOFF_UART_IER), UART_IER_RIE);
    387393                break;
    388394        }
     
    397403        switch (cbrtn) {
    398404        case SIO_RDY_SND:
    399                 sil_andw_mem((uint32_t *)(p_siopcb->p_siopinib->base+TOFF_UART_IER), UART_IER_TIE);
     405                sil_andw_mem((uint32_t *)(p_siopcb->p_siopinib->base + TOFF_UART_IER), UART_IER_TIE);
    400406                break;
    401407        case SIO_RDY_RCV:
    402                 sil_andw_mem((uint32_t *)(p_siopcb->p_siopinib->base+TOFF_UART_IER), UART_IER_RIE);
     408                sil_andw_mem((uint32_t *)(p_siopcb->p_siopinib->base + TOFF_UART_IER), UART_IER_RIE);
    403409                break;
    404410        }
     
    412418        unsigned long base = siopinib_table[INDEX_PORT(siopid)].base;
    413419
    414         sil_wrw_mem((uint32_t *)(base+TOFF_UART_THR), (uint32_t)c);
    415         while(0 != (sil_rew_mem((uint32_t *)(base+TOFF_UART_LSR)) & UART_LSR_TFL));
     420        sil_wrw_mem((uint32_t *)(base + TOFF_UART_THR), (uint32_t)c);
     421        while (0 != (sil_rew_mem((uint32_t *)(base + TOFF_UART_LSR)) & UART_LSR_TFL))
     422                ;
    416423
    417424        /*
    418425         *  出力が完全に終わるまで待つ
    419426         */
    420         volatile int n = SYS_CLOCK/BPS_SETTING;
    421         while(n--);
     427        volatile int n = SYS_CLOCK / BPS_SETTING;
     428        while (n--)
     429                ;
    422430}
    423431
     
    427435void target_uart_init(ID siopid)
    428436{
    429         const SIOPINIB  *p_siopinib;
     437        const SIOPINIB *p_siopinib;
    430438        unsigned long base;
    431439        uint32_t divisor, threshold;
    432         uint8_t  dlh, dll, dlf;
     440        uint8_t dlh, dll, dlf;
    433441
    434442        p_siopinib = &siopinib_table[INDEX_PORT(siopid)];
     
    438446         *  ハードウェアの初期化
    439447         */
    440         sil_orw_mem((uint32_t *)(TADR_SYSCTL_BASE+TOFF_SYSCTL_CLK_EN_PERI), p_siopinib->clk);
    441 
    442         threshold = (sil_rew_mem((uint32_t *)(TADR_SYSCTL_BASE+TOFF_CLK_SEL0)) & SYSCTL_CLK_SEL0_APB0_CLK_SEL) >> 3;
    443     divisor = (get_clock_aclk() / (threshold+1)) / BPS_SETTING;
    444     dlh = divisor >> 12;
    445     dll = (divisor - (dlh << 12)) / __UART_BRATE_CONST;
    446     dlf = divisor - (dlh << 12) - dll * __UART_BRATE_CONST;
    447 
    448     /* Set UART registers */
    449         sil_orw_mem((uint32_t *)(base+TOFF_UART_LCR), UART_LCR_DMD);
    450         sil_wrw_mem((uint32_t *)(base+TOFF_UART_DLH), dlh);
    451         sil_wrw_mem((uint32_t *)(base+TOFF_UART_DLL), dll);
    452         sil_wrw_mem((uint32_t *)(base+TOFF_UART_DLF), dlf);
    453         sil_wrw_mem((uint32_t *)(base+TOFF_UART_LCR), 0x00);
    454         sil_wrw_mem((uint32_t *)(base+TOFF_UART_LCR), (UART_WordLength_8b | UART_StopBits_1 | UART_Parity_No));
    455         sil_andw_mem((uint32_t *)(base+TOFF_UART_LCR), UART_LCR_DMD);
    456         sil_orw_mem((uint32_t *)(base+TOFF_UART_IER), UART_IER_THRE);
    457         sil_wrw_mem((uint32_t *)(base+TOFF_UART_FCR),
    458                         (UART_RECEIVE_FIFO1 << 6 | UART_SEND_FIFO8 << 4 | 0x1 << 3 | 0x1));
     448        sil_orw_mem((uint32_t *)(TADR_SYSCTL_BASE + TOFF_SYSCTL_CLK_EN_PERI), p_siopinib->clk);
     449
     450        threshold = (sil_rew_mem((uint32_t *)(TADR_SYSCTL_BASE + TOFF_CLK_SEL0)) & SYSCTL_CLK_SEL0_APB0_CLK_SEL) >> 3;
     451        divisor = (get_clock_aclk() / (threshold + 1)) / BPS_SETTING;
     452        dlh = divisor >> 12;
     453        dll = (divisor - (dlh << 12)) / __UART_BRATE_CONST;
     454        dlf = divisor - (dlh << 12) - dll * __UART_BRATE_CONST;
     455
     456        /* Set UART registers */
     457        sil_orw_mem((uint32_t *)(base + TOFF_UART_LCR), UART_LCR_DMD);
     458        sil_wrw_mem((uint32_t *)(base + TOFF_UART_DLH), dlh);
     459        sil_wrw_mem((uint32_t *)(base + TOFF_UART_DLL), dll);
     460        sil_wrw_mem((uint32_t *)(base + TOFF_UART_DLF), dlf);
     461        sil_wrw_mem((uint32_t *)(base + TOFF_UART_LCR), 0x00);
     462        sil_wrw_mem((uint32_t *)(base + TOFF_UART_LCR), (UART_WordLength_8b | UART_StopBits_1 | UART_Parity_No));
     463        sil_andw_mem((uint32_t *)(base + TOFF_UART_LCR), UART_LCR_DMD);
     464        sil_orw_mem((uint32_t *)(base + TOFF_UART_IER), UART_IER_THRE);
     465        sil_wrw_mem((uint32_t *)(base + TOFF_UART_FCR),
     466                                (UART_RECEIVE_FIFO14 << 6 | UART_SEND_FIFO8 << 4 /*| 0x1 << 3 DMA mode?*/ | 0x1 /*FIFO enable?*/));
     467        sil_andw_mem((uint32_t *)(base + TOFF_UART_MCR), (1 << 6) | 3);
     468        sil_wrw_mem((uint32_t *)(base + TOFF_UART_TCR), 0x00);
    459469
    460470        fpioa_set_function(uartpin[p_siopinib->com][1], p_siopinib->rxfunc);
Note: See TracChangeset for help on using the changeset viewer.