{"action":"created","comment":{"url":"https://api.github.com/repos/ARMmbed/mbed-os/pulls/comments/125441419","pull_request_review_id":47827294,"id":125441419,"diff_hunk":"@@ -0,0 +1,823 @@\n+/* mbed Microcontroller Library\n+ * Copyright (c) 2015-2016 Nuvoton\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *     http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+#include \"spi_api.h\"\n+\n+#if DEVICE_SPI\n+\n+#include \"cmsis.h\"\n+#include \"pinmap.h\"\n+#include \"PeripheralPins.h\"\n+#include \"nu_modutil.h\"\n+#include \"nu_miscutil.h\"\n+#include \"nu_bitutil.h\"\n+\n+#if DEVICE_SPI_ASYNCH\n+#include \"dma_api.h\"\n+#include \"dma.h\"\n+#endif\n+\n+#define NU_SPI_FRAME_MIN    8\n+#define NU_SPI_FRAME_MAX    32\n+\n+struct nu_spi_var {\n+#if DEVICE_SPI_ASYNCH\n+    uint8_t     pdma_perp_tx;\n+    uint8_t     pdma_perp_rx;\n+#endif\n+};\n+\n+static struct nu_spi_var spi0_var = {\n+#if DEVICE_SPI_ASYNCH\n+    .pdma_perp_tx       =   PDMA_SPI0_TX,\n+    .pdma_perp_rx       =   PDMA_SPI0_RX\n+#endif\n+};\n+static struct nu_spi_var spi1_var = {\n+#if DEVICE_SPI_ASYNCH\n+    .pdma_perp_tx       =   PDMA_SPI1_TX,\n+    .pdma_perp_rx       =   PDMA_SPI1_RX\n+#endif\n+};\n+static struct nu_spi_var spi2_var = {\n+#if DEVICE_SPI_ASYNCH\n+    .pdma_perp_tx       =   PDMA_SPI2_TX,\n+    .pdma_perp_rx       =   PDMA_SPI2_RX\n+#endif\n+};\n+static struct nu_spi_var spi3_var = {\n+#if DEVICE_SPI_ASYNCH\n+    .pdma_perp_tx       =   PDMA_SPI3_TX,\n+    .pdma_perp_rx       =   PDMA_SPI3_RX\n+#endif\n+};\n+static struct nu_spi_var spi4_var = {\n+#if DEVICE_SPI_ASYNCH\n+    .pdma_perp_tx       =   PDMA_SPI4_TX,\n+    .pdma_perp_rx       =   PDMA_SPI4_RX\n+#endif\n+};\n+\n+#if DEVICE_SPI_ASYNCH\n+static void spi_enable_vector_interrupt(spi_t *obj, uint32_t handler, uint8_t enable);\n+static void spi_master_enable_interrupt(spi_t *obj, uint8_t enable);\n+static uint32_t spi_master_write_asynch(spi_t *obj, uint32_t tx_limit);\n+static uint32_t spi_master_read_asynch(spi_t *obj);\n+static uint32_t spi_event_check(spi_t *obj);\n+static void spi_enable_event(spi_t *obj, uint32_t event, uint8_t enable);\n+static void spi_buffer_set(spi_t *obj, const void *tx, size_t tx_length, void *rx, size_t rx_length);\n+static void spi_check_dma_usage(DMAUsage *dma_usage, int *dma_ch_tx, int *dma_ch_rx);\n+static uint8_t spi_get_data_width(spi_t *obj);\n+static int spi_is_tx_complete(spi_t *obj);\n+static int spi_is_rx_complete(spi_t *obj);\n+static int spi_writeable(spi_t * obj);\n+static int spi_readable(spi_t * obj);\n+static void spi_dma_handler_tx(uint32_t id, uint32_t event_dma);\n+static void spi_dma_handler_rx(uint32_t id, uint32_t event_dma);\n+static uint32_t spi_fifo_depth(spi_t *obj);\n+#endif\n+\n+static uint32_t spi_modinit_mask = 0;\n+\n+static const struct nu_modinit_s spi_modinit_tab[] = {\n+    {SPI_0, SPI0_MODULE, CLK_CLKSEL2_SPI0SEL_PCLK0, MODULE_NoMsk, SPI0_RST, SPI0_IRQn, &spi0_var},\n+    {SPI_1, SPI1_MODULE, CLK_CLKSEL2_SPI1SEL_PCLK1, MODULE_NoMsk, SPI1_RST, SPI1_IRQn, &spi1_var},\n+    {SPI_2, SPI2_MODULE, CLK_CLKSEL2_SPI2SEL_PCLK0, MODULE_NoMsk, SPI2_RST, SPI2_IRQn, &spi2_var},\n+    {SPI_3, SPI3_MODULE, CLK_CLKSEL2_SPI3SEL_PCLK1, MODULE_NoMsk, SPI3_RST, SPI3_IRQn, &spi3_var},\n+    {SPI_4, SPI4_MODULE, CLK_CLKSEL2_SPI4SEL_PCLK0, MODULE_NoMsk, SPI4_RST, SPI4_IRQn, &spi4_var},\n+\n+    {NC, 0, 0, 0, 0, (IRQn_Type) 0, NULL}\n+};\n+\n+void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) {\n+    // Determine which SPI_x the pins are used for\n+    uint32_t spi_mosi = pinmap_peripheral(mosi, PinMap_SPI_MOSI);\n+    uint32_t spi_miso = pinmap_peripheral(miso, PinMap_SPI_MISO);\n+    uint32_t spi_sclk = pinmap_peripheral(sclk, PinMap_SPI_SCLK);\n+    uint32_t spi_ssel = pinmap_peripheral(ssel, PinMap_SPI_SSEL);\n+    uint32_t spi_data = pinmap_merge(spi_mosi, spi_miso);\n+    uint32_t spi_cntl = pinmap_merge(spi_sclk, spi_ssel);\n+    obj->spi.spi = (SPIName) pinmap_merge(spi_data, spi_cntl);\n+    MBED_ASSERT((int)obj->spi.spi != NC);\n+\n+    const struct nu_modinit_s *modinit = get_modinit(obj->spi.spi, spi_modinit_tab);\n+    MBED_ASSERT(modinit != NULL);\n+    MBED_ASSERT(modinit->modname == obj->spi.spi);\n+    \n+    // Reset this module\n+    SYS_ResetModule(modinit->rsetidx);\n+    \n+    // Select IP clock source\n+    CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);\n+    // Enable IP clock\n+    CLK_EnableModuleClock(modinit->clkidx);\n+\n+    //SPI_T *spi_base = (SPI_T *) NU_MODBASE(obj->spi.spi);\n+        \n+    pinmap_pinout(mosi, PinMap_SPI_MOSI);\n+    pinmap_pinout(miso, PinMap_SPI_MISO);\n+    pinmap_pinout(sclk, PinMap_SPI_SCLK);\n+    pinmap_pinout(ssel, PinMap_SPI_SSEL);\n+    \n+    obj->spi.pin_mosi = mosi;\n+    obj->spi.pin_miso = miso;\n+    obj->spi.pin_sclk = sclk;\n+    obj->spi.pin_ssel = ssel;\n+\n+    \n+    // Configure the SPI data format and frequency\n+    //spi_format(obj, 8, 0, SPI_MSB); // 8 bits, mode 0\n+    //spi_frequency(obj, 1000000);\n+    \n+#if DEVICE_SPI_ASYNCH\n+    obj->spi.dma_usage = DMA_USAGE_NEVER;\n+    obj->spi.event = 0;\n+    obj->spi.dma_chn_id_tx = DMA_ERROR_OUT_OF_CHANNELS;\n+    obj->spi.dma_chn_id_rx = DMA_ERROR_OUT_OF_CHANNELS;\n+#endif\n+\n+    // Mark this module to be inited.\n+    int i = modinit - spi_modinit_tab;\n+    spi_modinit_mask |= 1 << i;\n+}\n+\n+void spi_free(spi_t *obj)\n+{\n+#if DEVICE_SPI_ASYNCH\n+    if (obj->spi.dma_chn_id_tx != DMA_ERROR_OUT_OF_CHANNELS) {\n+        dma_channel_free(obj->spi.dma_chn_id_tx);\n+        obj->spi.dma_chn_id_tx = DMA_ERROR_OUT_OF_CHANNELS;\n+    }\n+    if (obj->spi.dma_chn_id_rx != DMA_ERROR_OUT_OF_CHANNELS) {\n+        dma_channel_free(obj->spi.dma_chn_id_rx);\n+        obj->spi.dma_chn_id_rx = DMA_ERROR_OUT_OF_CHANNELS;\n+    }\n+#endif\n+\n+    SPI_Close((SPI_T *) NU_MODBASE(obj->spi.spi));\n+    \n+    const struct nu_modinit_s *modinit = get_modinit(obj->spi.spi, spi_modinit_tab);\n+    MBED_ASSERT(modinit != NULL);\n+    MBED_ASSERT(modinit->modname == obj->spi.spi);\n+    \n+    SPI_DisableInt(((SPI_T *) NU_MODBASE(obj->spi.spi)), (SPI_FIFO_RXOV_INT_MASK | SPI_FIFO_RXTH_INT_MASK | SPI_FIFO_TXTH_INT_MASK));\n+    NVIC_DisableIRQ(modinit->irq_n);\n+    \n+    // Disable IP clock\n+    CLK_DisableModuleClock(modinit->clkidx);\n+    \n+    //((struct nu_spi_var *) modinit->var)->obj = NULL;\n+    \n+    // Mark this module to be deinited.\n+    int i = modinit - spi_modinit_tab;\n+    spi_modinit_mask &= ~(1 << i);\n+}\n+void spi_format(spi_t *obj, int bits, int mode, int slave)\n+{\n+    MBED_ASSERT(bits >= NU_SPI_FRAME_MIN && bits <= NU_SPI_FRAME_MAX);\n+    \n+    SPI_T *spi_base = (SPI_T *) NU_MODBASE(obj->spi.spi);\n+    \n+    // NOTE 1: All configurations should be ready before enabling SPI peripheral.\n+    // NOTE 2: Re-configuration is allowed only as SPI peripheral is idle.\n+    while (SPI_IS_BUSY(spi_base));\n+    SPI_DISABLE(spi_base);\n+\n+    SPI_Open(spi_base,\n+        slave ? SPI_SLAVE : SPI_MASTER,\n+        (mode == 0) ? SPI_MODE_0 : (mode == 1) ? SPI_MODE_1 : (mode == 2) ? SPI_MODE_2 : SPI_MODE_3,\n+        bits,\n+        SPI_GetBusClock(spi_base));\n+    // NOTE: Hardcode to be MSB first.\n+    SPI_SET_MSB_FIRST(spi_base);\n+\n+    if (! slave) {\n+        // Master\n+        if (obj->spi.pin_ssel != NC) {\n+            // Configure SS as low active.            \n+            SPI_EnableAutoSS(spi_base, SPI_SS, SPI_SS_ACTIVE_LOW);\n+        }\n+        else {\n+            SPI_DisableAutoSS(spi_base);\n+        }\n+    }\n+    else {\n+        // Slave\n+        // Configure SS as low active.\n+        spi_base->SSCTL &= ~SPI_SSCTL_SSACTPOL_Msk;\n+    }\n+\n+    // NOTE: M451's/M480's SPI_Open() will enable SPI transfer (SPI_CTL_SPIEN_Msk). This will violate judgement of spi_active(). Disable it.\n+    SPI_DISABLE(spi_base);\n+}\n+\n+void spi_frequency(spi_t *obj, int hz)\n+{\n+    SPI_T *spi_base = (SPI_T *) NU_MODBASE(obj->spi.spi);\n+    \n+    while (SPI_IS_BUSY(spi_base));\n+    SPI_DISABLE(spi_base);\n+\n+    SPI_SetBusClock((SPI_T *) NU_MODBASE(obj->spi.spi), hz);\n+}\n+\n+\n+int spi_master_write(spi_t *obj, int value)\n+{\n+    SPI_T *spi_base = (SPI_T *) NU_MODBASE(obj->spi.spi);\n+    \n+    // NOTE: Data in receive FIFO can be read out via ICE.\n+    SPI_ENABLE(spi_base);\n+    \n+    // Wait for tx buffer empty\n+    while(! spi_writeable(obj));\n+    SPI_WRITE_TX(spi_base, value);\n+\n+    // Wait for rx buffer full\n+    while (! spi_readable(obj));\n+    int value2 = SPI_READ_RX(spi_base);\n+    \n+    SPI_DISABLE(spi_base);\n+    \n+    return value2;\n+}\n+\n+int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length) {\n+    int total = (tx_length > rx_length) ? tx_length : rx_length;\n+\n+    for (int i = 0; i < total; i++) {\n+        char out = (i < tx_length) ? tx_buffer[i] : 0xff;\n+        char in = spi_master_write(obj, out);\n+        if (i < rx_length) {\n+            rx_buffer[i] = in;\n+        }\n+    }\n+\n+    return total;\n+}\n+\n+#if DEVICE_SPISLAVE\n+int spi_slave_receive(spi_t *obj)\n+{\n+    SPI_T *spi_base = (SPI_T *) NU_MODBASE(obj->spi.spi);\n+    \n+    SPI_ENABLE(spi_base);\n+    \n+    return spi_readable(obj);\n+};\n+\n+int spi_slave_read(spi_t *obj)\n+{\n+    SPI_T *spi_base = (SPI_T *) NU_MODBASE(obj->spi.spi);\n+    \n+    SPI_ENABLE(spi_base);\n+    \n+    // Wait for rx buffer full\n+    while (! spi_readable(obj));\n+    int value = SPI_READ_RX(spi_base);\n+    return value;\n+}\n+\n+void spi_slave_write(spi_t *obj, int value)\n+{\n+    SPI_T *spi_base = (SPI_T *) NU_MODBASE(obj->spi.spi);\n+    \n+    SPI_ENABLE(spi_base);\n+    \n+    // Wait for tx buffer empty\n+    while(! spi_writeable(obj));\n+    SPI_WRITE_TX(spi_base, value);\n+}\n+#endif\n+\n+#if DEVICE_SPI_ASYNCH\n+void spi_master_transfer(spi_t *obj, const void *tx, size_t tx_length, void *rx, size_t rx_length, uint8_t bit_width, uint32_t handler, uint32_t event, DMAUsage hint)\n+{\n+    //MBED_ASSERT(bits >= NU_SPI_FRAME_MIN && bits <= NU_SPI_FRAME_MAX);\n+    SPI_T *spi_base = (SPI_T *) NU_MODBASE(obj->spi.spi);\n+    SPI_SET_DATA_WIDTH(spi_base, bit_width);\n+\n+    obj->spi.dma_usage = hint;\n+    spi_check_dma_usage(&obj->spi.dma_usage, &obj->spi.dma_chn_id_tx, &obj->spi.dma_chn_id_rx);\n+    uint32_t data_width = spi_get_data_width(obj);\n+    // Conditions to go DMA way:\n+    // (1) No DMA support for non-8 multiple data width.\n+    // (2) tx length >= rx length. Otherwise, as tx DMA is done, no bus activity for remaining rx.\n+    if ((data_width % 8) ||\n+        (tx_length < rx_length)) {\n+        obj->spi.dma_usage = DMA_USAGE_NEVER;\n+        dma_channel_free(obj->spi.dma_chn_id_tx);\n+        obj->spi.dma_chn_id_tx = DMA_ERROR_OUT_OF_CHANNELS;\n+        dma_channel_free(obj->spi.dma_chn_id_rx);\n+        obj->spi.dma_chn_id_rx = DMA_ERROR_OUT_OF_CHANNELS;\n+    }\n+    \n+    // SPI IRQ is necessary for both interrupt way and DMA way\n+    spi_enable_event(obj, event, 1);\n+    spi_buffer_set(obj, tx, tx_length, rx, rx_length);\n+            \n+    SPI_ENABLE(spi_base);\n+    \n+    if (obj->spi.dma_usage == DMA_USAGE_NEVER) {\n+        // Interrupt way\n+        spi_master_write_asynch(obj, spi_fifo_depth(obj) / 2);\n+        spi_enable_vector_interrupt(obj, handler, 1);\n+        spi_master_enable_interrupt(obj, 1);\n+    } else {\n+        // DMA way\n+        const struct nu_modinit_s *modinit = get_modinit(obj->spi.spi, spi_modinit_tab);\n+        MBED_ASSERT(modinit != NULL);\n+        MBED_ASSERT(modinit->modname == obj->spi.spi);\n+    \n+        PDMA_T *pdma_base = dma_modbase();\n+        \n+        // Configure tx DMA\n+        pdma_base->CHCTL |= 1 << obj->spi.dma_chn_id_tx;  // Enable this DMA channel\n+        PDMA_SetTransferMode(obj->spi.dma_chn_id_tx,\n+            ((struct nu_spi_var *) modinit->var)->pdma_perp_tx,    // Peripheral connected to this PDMA\n+            0,  // Scatter-gather disabled\n+            0); // Scatter-gather descriptor address\n+        PDMA_SetTransferCnt(obj->spi.dma_chn_id_tx, \n+            (data_width == 8) ? PDMA_WIDTH_8 : (data_width == 16) ? PDMA_WIDTH_16 : PDMA_WIDTH_32, \n+            tx_length);\n+        PDMA_SetTransferAddr(obj->spi.dma_chn_id_tx,\n+            (uint32_t) tx,  // NOTE:\n+                            // NUC472: End of source address\n+                            // M451/M480: Start of source address\n+            PDMA_SAR_INC,   // Source address incremental\n+            (uint32_t) &spi_base->TX,   // Destination address\n+            PDMA_DAR_FIX);  // Destination address fixed\n+        PDMA_SetBurstType(obj->spi.dma_chn_id_tx, \n+            PDMA_REQ_SINGLE,    // Single mode\n+            0); // Burst size\n+        PDMA_EnableInt(obj->spi.dma_chn_id_tx,\n+            PDMA_INT_TRANS_DONE);   // Interrupt type\n+        // Register DMA event handler\n+        dma_set_handler(obj->spi.dma_chn_id_tx, (uint32_t) spi_dma_handler_tx, (uint32_t) obj, DMA_EVENT_ALL);\n+        \n+        // Configure rx DMA\n+        pdma_base->CHCTL |= 1 << obj->spi.dma_chn_id_rx;  // Enable this DMA channel\n+        PDMA_SetTransferMode(obj->spi.dma_chn_id_rx,\n+            ((struct nu_spi_var *) modinit->var)->pdma_perp_rx,    // Peripheral connected to this PDMA\n+            0,  // Scatter-gather disabled\n+            0); // Scatter-gather descriptor address\n+        PDMA_SetTransferCnt(obj->spi.dma_chn_id_rx, \n+            (data_width == 8) ? PDMA_WIDTH_8 : (data_width == 16) ? PDMA_WIDTH_16 : PDMA_WIDTH_32, \n+            rx_length);\n+        PDMA_SetTransferAddr(obj->spi.dma_chn_id_rx,\n+            (uint32_t) &spi_base->RX,   // Source address\n+            PDMA_SAR_FIX,   // Source address fixed\n+            (uint32_t) rx,  // NOTE: \n+                            // NUC472: End of destination address\n+                            // M451/M480: Start of destination address\n+            PDMA_DAR_INC);  // Destination address incremental\n+        PDMA_SetBurstType(obj->spi.dma_chn_id_rx, \n+            PDMA_REQ_SINGLE,    // Single mode\n+            0); // Burst size\n+        PDMA_EnableInt(obj->spi.dma_chn_id_rx,\n+            PDMA_INT_TRANS_DONE);   // Interrupt type\n+        // Register DMA event handler\n+        dma_set_handler(obj->spi.dma_chn_id_rx, (uint32_t) spi_dma_handler_rx, (uint32_t) obj, DMA_EVENT_ALL);\n+        \n+        // Start tx/rx DMA transfer\n+        spi_enable_vector_interrupt(obj, handler, 1);\n+        // NOTE: It is safer to start rx DMA first and then tx DMA. Otherwise, receive FIFO is subject to overflow by tx DMA.\n+        SPI_TRIGGER_RX_PDMA(((SPI_T *) NU_MODBASE(obj->spi.spi)));\n+        SPI_TRIGGER_TX_PDMA(((SPI_T *) NU_MODBASE(obj->spi.spi)));\n+        spi_master_enable_interrupt(obj, 1);\n+    }\n+}\n+\n+/**\n+ * Abort an SPI transfer\n+ * This is a helper function for event handling. When any of the events listed occurs, the HAL will abort any ongoing\n+ * transfers\n+ * @param[in] obj The SPI peripheral to stop\n+ */\n+void spi_abort_asynch(spi_t *obj)\n+{\n+    SPI_T *spi_base = (SPI_T *) NU_MODBASE(obj->spi.spi);\n+    PDMA_T *pdma_base = dma_modbase();\n+    \n+    if (obj->spi.dma_usage != DMA_USAGE_NEVER) {\n+        // Receive FIFO Overrun in case of tx length > rx length on DMA way\n+        if (spi_base->STATUS & SPI_STATUS_RXOVIF_Msk) {\n+            spi_base->STATUS = SPI_STATUS_RXOVIF_Msk;\n+        }\n+        \n+        if (obj->spi.dma_chn_id_tx != DMA_ERROR_OUT_OF_CHANNELS) {\n+            PDMA_DisableInt(obj->spi.dma_chn_id_tx, PDMA_INT_TRANS_DONE);\n+            // FIXME: On NUC472, next PDMA transfer will fail with PDMA_STOP() called. Cause is unknown.\n+            //PDMA_STOP(obj->spi.dma_chn_id_tx);\n+            pdma_base->CHCTL &= ~(1 << obj->spi.dma_chn_id_tx);\n+        }\n+        SPI_DISABLE_TX_PDMA(((SPI_T *) NU_MODBASE(obj->spi.spi)));\n+        \n+        if (obj->spi.dma_chn_id_rx != DMA_ERROR_OUT_OF_CHANNELS) {\n+            PDMA_DisableInt(obj->spi.dma_chn_id_rx, PDMA_INT_TRANS_DONE);\n+            // FIXME: On NUC472, next PDMA transfer will fail with PDMA_STOP() called. Cause is unknown.\n+            //PDMA_STOP(obj->spi.dma_chn_id_rx);\n+            pdma_base->CHCTL &= ~(1 << obj->spi.dma_chn_id_rx);\n+        }\n+        SPI_DISABLE_RX_PDMA(((SPI_T *) NU_MODBASE(obj->spi.spi)));\n+    }\n+    \n+    // Necessary for both interrupt way and DMA way\n+    spi_enable_vector_interrupt(obj, 0, 0);\n+    spi_master_enable_interrupt(obj, 0);\n+\n+    // FIXME: SPI H/W may get out of state without the busy check.\n+    while (SPI_IS_BUSY(spi_base));\n+    SPI_DISABLE(spi_base);\n+    \n+    SPI_ClearRxFIFO(spi_base);\n+    SPI_ClearTxFIFO(spi_base);\n+}\n+\n+/**\n+ * Handle the SPI interrupt\n+ * Read frames until the RX FIFO is empty.  Write at most as many frames as were read.  This way,\n+ * it is unlikely that the RX FIFO will overflow.\n+ * @param[in] obj The SPI peripheral that generated the interrupt\n+ * @return\n+ */\n+uint32_t spi_irq_handler_asynch(spi_t *obj)\n+{\n+    // Check for SPI events\n+    uint32_t event = spi_event_check(obj);\n+    if (event) {\n+        spi_abort_asynch(obj);\n+    }\n+\n+    return (obj->spi.event & event) | ((event & SPI_EVENT_COMPLETE) ? SPI_EVENT_INTERNAL_TRANSFER_COMPLETE : 0);\n+}\n+\n+uint8_t spi_active(spi_t *obj)\n+{\n+    SPI_T *spi_base = (SPI_T *) NU_MODBASE(obj->spi.spi);\n+    // FIXME\n+    /*\n+    if ((obj->rx_buff.buffer && obj->rx_buff.pos < obj->rx_buff.length)\n+            || (obj->tx_buff.buffer && obj->tx_buff.pos < obj->tx_buff.length) ){\n+        return 1;\n+    } else  {\n+        // interrupts are disabled, all transaction have been completed\n+        // TODO: checking rx fifo, it reports data eventhough RFDF is not set\n+        return DSPI_HAL_GetIntMode(obj->spi.address, kDspiRxFifoDrainRequest);\n+    }*/\n+    \n+    //return SPI_IS_BUSY(spi_base);\n+    return (spi_base->CTL & SPI_CTL_SPIEN_Msk);\n+}\n+\n+int spi_allow_powerdown(void)\n+{\n+    uint32_t modinit_mask = spi_modinit_mask;\n+    while (modinit_mask) {\n+        int spi_idx = nu_ctz(modinit_mask);\n+        const struct nu_modinit_s *modinit = spi_modinit_tab + spi_idx;\n+        if (modinit->modname != NC) {\n+            SPI_T *spi_base = (SPI_T *) NU_MODBASE(modinit->modname);\n+            // Disallow entering power-down mode if SPI transfer is enabled.\n+            if (spi_base->CTL & SPI_CTL_SPIEN_Msk) {\n+                return 0;\n+            }\n+        }\n+        modinit_mask &= ~(1 << spi_idx);\n+    }\n+    \n+    return 1;\n+}\n+\n+static int spi_writeable(spi_t * obj)\n+{\n+    // Receive FIFO must not be full to avoid receive FIFO overflow on next transmit/receive\n+    return (! SPI_GET_TX_FIFO_FULL_FLAG(((SPI_T *) NU_MODBASE(obj->spi.spi))));\n+}\n+\n+static int spi_readable(spi_t * obj)\n+{\n+    return ! SPI_GET_RX_FIFO_EMPTY_FLAG(((SPI_T *) NU_MODBASE(obj->spi.spi)));\n+}\n+\n+static void spi_enable_event(spi_t *obj, uint32_t event, uint8_t enable)\n+{   \n+    obj->spi.event &= ~SPI_EVENT_ALL;\n+    obj->spi.event |= (event & SPI_EVENT_ALL);\n+    if (event & SPI_EVENT_RX_OVERFLOW) {\n+        SPI_EnableInt((SPI_T *) NU_MODBASE(obj->spi.spi), SPI_FIFO_RXOV_INT_MASK);\n+    }\n+}\n+\n+static void spi_enable_vector_interrupt(spi_t *obj, uint32_t handler, uint8_t enable)\n+{\n+    const struct nu_modinit_s *modinit = get_modinit(obj->spi.spi, spi_modinit_tab);\n+    MBED_ASSERT(modinit != NULL);\n+    MBED_ASSERT(modinit->modname == obj->spi.spi);\n+    \n+    if (enable) {\n+        NVIC_SetVector(modinit->irq_n, handler);\n+        NVIC_EnableIRQ(modinit->irq_n);\n+    }\n+    else {\n+        //NVIC_SetVector(modinit->irq_n, handler);","path":"targets/TARGET_NUVOTON/TARGET_M480/spi_api.c","position":536,"original_position":536,"commit_id":"5c505f4bc939472ec4bd2bbbad0bb33bb249a9b5","original_commit_id":"5c505f4bc939472ec4bd2bbbad0bb33bb249a9b5","user":{"login":"0xc0170","id":2963726,"avatar_url":"https://avatars3.githubusercontent.com/u/2963726?v=3","gravatar_id":"","url":"https://api.github.com/users/0xc0170","html_url":"https://github.com/0xc0170","followers_url":"https://api.github.com/users/0xc0170/followers","following_url":"https://api.github.com/users/0xc0170/following{/other_user}","gists_url":"https://api.github.com/users/0xc0170/gists{/gist_id}","starred_url":"https://api.github.com/users/0xc0170/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/0xc0170/subscriptions","organizations_url":"https://api.github.com/users/0xc0170/orgs","repos_url":"https://api.github.com/users/0xc0170/repos","events_url":"https://api.github.com/users/0xc0170/events{/privacy}","received_events_url":"https://api.github.com/users/0xc0170/received_events","type":"User","site_admin":false},"body":"dead code","created_at":"2017-07-04T10:27:57Z","updated_at":"2017-07-04T10:47:33Z","html_url":"https://github.com/ARMmbed/mbed-os/pull/4608#discussion_r125441419","pull_request_url":"https://api.github.com/repos/ARMmbed/mbed-os/pulls/4608","_links":{"self":{"href":"https://api.github.com/repos/ARMmbed/mbed-os/pulls/comments/125441419"},"html":{"href":"https://github.com/ARMmbed/mbed-os/pull/4608#discussion_r125441419"},"pull_request":{"href":"https://api.github.com/repos/ARMmbed/mbed-os/pulls/4608"}}},"pull_request":{"url":"https://api.github.com/repos/ARMmbed/mbed-os/pulls/4608","id":126895594,"html_url":"https://github.com/ARMmbed/mbed-os/pull/4608","diff_url":"https://github.com/ARMmbed/mbed-os/pull/4608.diff","patch_url":"https://github.com/ARMmbed/mbed-os/pull/4608.patch","issue_url":"https://api.github.com/repos/ARMmbed/mbed-os/issues/4608","number":4608,"state":"open","locked":false,"title":"Support Nuvoton's new target NUMAKER_PFM_M487","user":{"login":"ccli8","id":15923441,"avatar_url":"https://avatars0.githubusercontent.com/u/15923441?v=3","gravatar_id":"","url":"https://api.github.com/users/ccli8","html_url":"https://github.com/ccli8","followers_url":"https://api.github.com/users/ccli8/followers","following_url":"https://api.github.com/users/ccli8/following{/other_user}","gists_url":"https://api.github.com/users/ccli8/gists{/gist_id}","starred_url":"https://api.github.com/users/ccli8/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ccli8/subscriptions","organizations_url":"https://api.github.com/users/ccli8/orgs","repos_url":"https://api.github.com/users/ccli8/repos","events_url":"https://api.github.com/users/ccli8/events{/privacy}","received_events_url":"https://api.github.com/users/ccli8/received_events","type":"User","site_admin":false},"body":"## Description\r\nThis PR is to add support for Nuvoton's new target NUMAKER_PFM_M487.\r\n\r\n\r\n## ARM mbed Greentea test\r\n### ARM toolchain\r\n```\r\n+----------------------+------------------+--------------------------------------------------------------------------------------+--------+--------------------+-------------+\r\n| target               | platform_name    | test suite                                                                           | result | elapsed_time (sec) | copy_method |\r\n+----------------------+------------------+--------------------------------------------------------------------------------------+--------+--------------------+-------------+\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-basic_test                        | OK     | 20.98              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-basic_test_default                | OK     | 20.94              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_async_validate               | OK     | 23.26              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_control_async                | OK     | 28.49              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_control_repeat               | OK     | 23.03              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_selection                    | OK     | 20.92              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_setup_failure                | OK     | 21.51              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_teardown_failure             | OK     | 21.58              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-control_type                      | OK     | 21.78              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-minimal_async_scheduler           | OK     | 21.98              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-minimal_scheduler                 | OK     | 22.71              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-test_assertion_failure_test_setup | OK     | 20.64              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-test_setup_case_selection_failure | OK     | 20.78              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-test_setup_failure                | OK     | 20.97              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-tests-filesystem-heap_block_device                                  | OK     | 23.0               | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-tests-filesystem-mbr_block_device                                   | OK     | 21.76              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-features-tests-filesystem-util_block_device                                  | OK     | 21.12              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-rtos-rtx5-target_cortex_m-tests-memory-heap_and_stack                        | OK     | 20.25              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-events-queue                                                           | OK     | 28.08              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-events-timing                                                          | OK     | 82.24              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-integration-basic                                                      | OK     | 20.01              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-c_strings                                                 | OK     | 22.78              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-dev_null                                                  | OK     | 22.09              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-echo                                                      | OK     | 36.38              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-flashiap                                                  | OK     | 21.18              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-generic_tests                                             | OK     | 21.17              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-lp_timeout                                                | OK     | 30.01              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-race_test                                                 | OK     | 21.86              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-rtc                                                       | OK     | 30.95              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-stl_features                                              | OK     | 21.98              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-ticker                                                    | OK     | 54.02              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-timeout                                                   | OK     | 31.51              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-wait_us                                                   | OK     | 31.89              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-callback                                               | OK     | 22.95              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-callback_big                                           | OK     | 22.53              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-callback_small                                         | OK     | 22.34              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-functionpointer                                        | OK     | 20.93              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | FAIL   | 22.46              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-lp_ticker                                                     | OK     | 30.25              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-rtc_time                                                      | OK     | 40.64              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-ticker                                                        | OK     | 29.75              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-attributes                                              | OK     | 22.73              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-call_before_main                                        | OK     | 20.19              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-cpp                                                     | OK     | 20.17              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-div                                                     | OK     | 25.52              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-static_assert                                           | OK     | 26.05              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-basic                                              | OK     | 31.06              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-isr                                                | OK     | 25.6               | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-mail                                               | OK     | 27.38              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-malloc                                             | OK     | 35.76              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-mutex                                              | OK     | 33.15              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-queue                                              | OK     | 21.7               | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-semaphore                                          | OK     | 28.02              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-signals                                            | OK     | 25.18              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-threads                                            | OK     | 26.33              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-timer                                              | OK     | 31.11              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedtls-selftest                                                       | OK     | 22.01              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-netsocket-ip_parsing                                                   | OK     | 22.56              | shell       |\r\n+----------------------+------------------+--------------------------------------------------------------------------------------+--------+--------------------+-------------+\r\nmbedgt: test suite results: 1 FAIL / 57 OK\r\n```\r\n- `mbed-os-tests-mbed_hal-flash` / `Flash - buffer alignment test` failed\r\nThis test item checks performance drift rate < 0.1%. On M487, it could reach 5%.\r\n\r\n```\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | Flash - buffer alignment test                                 | 1      | 0      | OK     | 0.14               |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | Flash - clock and cache test                                  | 0      | 1      | FAIL   | 0.15               |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | Flash - erase sector                                          | 1      | 0      | OK     | 0.12               |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | Flash - init                                                  | 1      | 0      | OK     | 0.08               |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | Flash - mapping alignment                                     | 1      | 0      | OK     | 0.05               |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | Flash - program page                                          | 1      | 0      | OK     | 0.22               |\r\n```\r\n\r\n### uARM toolchain\r\n```\r\n+-----------------------+------------------+--------------------------------------------------------------------------------------+--------+--------------------+-------------+\r\n| target                | platform_name    | test suite                                                                           | result | elapsed_time (sec) | copy_method |\r\n+-----------------------+------------------+--------------------------------------------------------------------------------------+--------+--------------------+-------------+\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-basic_test                        | OK     | 21.23              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-basic_test_default                | OK     | 20.72              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_async_validate               | OK     | 28.89              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_control_async                | OK     | 28.36              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_control_repeat               | OK     | 22.74              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_selection                    | OK     | 20.61              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_setup_failure                | OK     | 21.2               | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_teardown_failure             | OK     | 21.26              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-control_type                      | OK     | 21.48              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-minimal_async_scheduler           | OK     | 21.53              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-minimal_scheduler                 | OK     | 22.62              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-test_assertion_failure_test_setup | OK     | 22.68              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-test_setup_case_selection_failure | OK     | 20.56              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-test_setup_failure                | OK     | 20.61              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-tests-filesystem-heap_block_device                                  | OK     | 22.36              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-tests-filesystem-mbr_block_device                                   | OK     | 21.62              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-features-tests-filesystem-util_block_device                                  | OK     | 20.94              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-rtos-rtx5-target_cortex_m-tests-memory-heap_and_stack                        | OK     | 19.91              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-events-queue                                                           | OK     | 27.8               | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-events-timing                                                          | OK     | 81.31              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-integration-basic                                                      | OK     | 19.78              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-c_strings                                                 | OK     | 22.53              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-dev_null                                                  | OK     | 21.89              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-echo                                                      | OK     | 36.37              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-flashiap                                                  | OK     | 21.09              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-generic_tests                                             | OK     | 20.97              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-lp_timeout                                                | OK     | 29.83              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-rtc                                                       | OK     | 30.69              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-stl_features                                              | OK     | 21.33              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-ticker                                                    | OK     | 53.82              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-timeout                                                   | OK     | 31.33              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-wait_us                                                   | OK     | 31.28              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-callback                                               | OK     | 22.32              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-callback_big                                           | OK     | 22.25              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-callback_small                                         | OK     | 26.21              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-functionpointer                                        | OK     | 20.92              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | FAIL   | 22.25              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-lp_ticker                                                     | OK     | 29.55              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-rtc_time                                                      | OK     | 46.72              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-ticker                                                        | OK     | 29.52              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-attributes                                              | OK     | 22.73              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-call_before_main                                        | OK     | 19.77              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-cpp                                                     | OK     | 19.97              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-div                                                     | OK     | 19.91              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-static_assert                                           | OK     | 20.26              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedtls-selftest                                                       | OK     | 21.87              | shell       |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-netsocket-ip_parsing                                                   | OK     | 22.45              | shell       |\r\n+-----------------------+------------------+--------------------------------------------------------------------------------------+--------+--------------------+-------------+\r\nmbedgt: test suite results: 1 FAIL / 46 OK\r\n```\r\n- `mbed-os-tests-mbed_hal-flash` / `Flash - buffer alignment test` failed\r\nSame cause as above.\r\n\r\n```\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | Flash - buffer alignment test                                 | 1      | 0      | OK     | 0.14               |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | Flash - clock and cache test                                  | 0      | 1      | FAIL   | 0.15               |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | Flash - erase sector                                          | 1      | 0      | OK     | 0.12               |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | Flash - init                                                  | 1      | 0      | OK     | 0.08               |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | Flash - mapping alignment                                     | 1      | 0      | OK     | 0.05               |\r\n| NUMAKER_PFM_M487-uARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | Flash - program page                                          | 1      | 0      | OK     | 0.22               |\r\n```\r\n\r\n### GCC toolchain\r\n```\r\n+--------------------------+------------------+--------------------------------------------------------------------------------------+--------+--------------------+-------------+\r\n| target                   | platform_name    | test suite                                                                           | result | elapsed_time (sec) | copy_method |\r\n+--------------------------+------------------+--------------------------------------------------------------------------------------+--------+--------------------+-------------+\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-basic_test                        | OK     | 21.11              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-basic_test_default                | OK     | 21.26              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_async_validate               | OK     | 22.74              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_control_async                | OK     | 29.94              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_control_repeat               | OK     | 23.13              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_selection                    | OK     | 21.03              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_setup_failure                | OK     | 21.61              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_teardown_failure             | OK     | 21.64              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-control_type                      | OK     | 21.9               | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-minimal_async_scheduler           | OK     | 22.18              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-minimal_scheduler                 | OK     | 22.81              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-test_assertion_failure_test_setup | OK     | 20.78              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-test_setup_case_selection_failure | OK     | 21.86              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-test_setup_failure                | OK     | 21.15              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-tests-filesystem-heap_block_device                                  | OK     | 22.95              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-tests-filesystem-mbr_block_device                                   | OK     | 22.21              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-features-tests-filesystem-util_block_device                                  | OK     | 21.22              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-rtos-rtx5-target_cortex_m-tests-memory-heap_and_stack                        | OK     | 20.65              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-events-queue                                                           | OK     | 28.14              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-events-timing                                                          | OK     | 81.84              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-integration-basic                                                      | OK     | 27.28              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-c_strings                                                 | OK     | 22.92              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-dev_null                                                  | OK     | 22.87              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-echo                                                      | OK     | 36.74              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-flashiap                                                  | OK     | 21.39              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-generic_tests                                             | OK     | 21.62              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-lp_timeout                                                | OK     | 30.11              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-race_test                                                 | OK     | 22.2               | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-rtc                                                       | OK     | 31.5               | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-stl_features                                              | OK     | 21.78              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-ticker                                                    | OK     | 54.13              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-timeout                                                   | OK     | 31.93              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-wait_us                                                   | OK     | 31.67              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-callback                                               | OK     | 22.81              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-callback_big                                           | OK     | 22.53              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-callback_small                                         | OK     | 22.45              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-functionpointer                                        | OK     | 21.14              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | OK     | 22.46              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-lp_ticker                                                     | OK     | 29.8               | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-rtc_time                                                      | OK     | 59.37              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-ticker                                                        | OK     | 29.87              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-attributes                                              | OK     | 22.82              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-call_before_main                                        | OK     | 20.84              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-cpp                                                     | OK     | 20.89              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-div                                                     | OK     | 20.56              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-static_assert                                           | OK     | 20.7               | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-basic                                              | OK     | 31.28              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-isr                                                | OK     | 25.58              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-mail                                               | OK     | 22.0               | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-malloc                                             | OK     | 35.88              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-mutex                                              | OK     | 39.39              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-queue                                              | OK     | 22.23              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-semaphore                                          | OK     | 27.52              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-signals                                            | OK     | 25.57              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-threads                                            | OK     | 26.63              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-timer                                              | OK     | 31.28              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-mbedtls-selftest                                                       | OK     | 22.42              | shell       |\r\n| NUMAKER_PFM_M487-GCC_ARM | NUMAKER_PFM_M487 | mbed-os-tests-netsocket-ip_parsing                                                   | OK     | 23.42              | shell       |\r\n+--------------------------+------------------+--------------------------------------------------------------------------------------+--------+--------------------+-------------+\r\nmbedgt: test suite results: 58 OK\r\n```\r\n\r\n### IAR toolchain\r\n```\r\n+----------------------+------------------+--------------------------------------------------------------------------------------+--------+--------------------+-------------+\r\n| target               | platform_name    | test suite                                                                           | result | elapsed_time (sec) | copy_method |\r\n+----------------------+------------------+--------------------------------------------------------------------------------------+--------+--------------------+-------------+\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-basic_test                        | OK     | 20.75              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-basic_test_default                | OK     | 20.84              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_async_validate               | OK     | 22.39              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_control_async                | OK     | 28.39              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_control_repeat               | OK     | 22.81              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_selection                    | OK     | 20.67              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_setup_failure                | OK     | 21.23              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-case_teardown_failure             | OK     | 21.25              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-control_type                      | OK     | 21.53              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-minimal_async_scheduler           | OK     | 21.7               | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-minimal_scheduler                 | OK     | 22.32              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-test_assertion_failure_test_setup | OK     | 20.44              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-test_setup_case_selection_failure | OK     | 21.12              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-frameworks-utest-tests-unit_tests-test_setup_failure                | OK     | 21.84              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-tests-filesystem-heap_block_device                                  | OK     | 22.39              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-tests-filesystem-mbr_block_device                                   | OK     | 21.7               | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-features-tests-filesystem-util_block_device                                  | OK     | 20.83              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-rtos-rtx5-target_cortex_m-tests-memory-heap_and_stack                        | OK     | 19.92              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-events-queue                                                           | OK     | 27.89              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-events-timing                                                          | OK     | 81.18              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-integration-basic                                                      | OK     | 19.7               | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-c_strings                                                 | OK     | 22.49              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-dev_null                                                  | OK     | 22.17              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-echo                                                      | OK     | 36.07              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-flashiap                                                  | OK     | 21.05              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-generic_tests                                             | OK     | 21.08              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-lp_timeout                                                | OK     | 29.73              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-race_test                                                 | OK     | 21.76              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-rtc                                                       | OK     | 30.8               | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-stl_features                                              | OK     | 21.2               | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-ticker                                                    | OK     | 53.92              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-timeout                                                   | OK     | 31.33              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_drivers-wait_us                                                   | OK     | 31.28              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-callback                                               | OK     | 22.12              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-callback_big                                           | OK     | 22.23              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-callback_small                                         | OK     | 22.11              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_functional-functionpointer                                        | OK     | 21.36              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-flash                                                         | OK     | 22.25              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-lp_ticker                                                     | OK     | 29.41              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-rtc_time                                                      | OK     | 42.87              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbed_hal-ticker                                                        | OK     | 30.08              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-attributes                                              | OK     | 22.48              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-call_before_main                                        | OK     | 30.28              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-cpp                                                     | OK     | 20.03              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-div                                                     | OK     | 20.0               | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-mbed-static_assert                                           | OK     | 20.38              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-basic                                              | OK     | 30.92              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-isr                                                | OK     | 25.01              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-mail                                               | OK     | 21.51              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-malloc                                             | OK     | 35.32              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-mutex                                              | OK     | 32.93              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-queue                                              | OK     | 22.0               | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-semaphore                                          | OK     | 27.66              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-signals                                            | OK     | 25.07              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-threads                                            | OK     | 26.16              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedmicro-rtos-mbed-timer                                              | OK     | 30.73              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-mbedtls-selftest                                                       | OK     | 21.65              | shell       |\r\n| NUMAKER_PFM_M487-IAR | NUMAKER_PFM_M487 | mbed-os-tests-netsocket-ip_parsing                                                   | OK     | 22.5               | shell       |\r\n+----------------------+------------------+--------------------------------------------------------------------------------------+--------+--------------------+-------------+\r\nmbedgt: test suite results: 58 OK\r\n```\r\n\r\n## ARM mbed CI test\r\n```\r\n+----------------------+------------------+-----------------------------+--------+--------------------+-------------+\r\n| target               | platform_name    | test suite                  | result | elapsed_time (sec) | copy_method |\r\n+----------------------+------------------+-----------------------------+--------+--------------------+-------------+\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-analogin          | OK     | 22.0               | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-businout          | OK     | 41.8               | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-digitalio         | OK     | 22.59              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-i2c               | FAIL   | 24.79              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-interruptin       | OK     | 22.46              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-pwm               | OK     | 103.29             | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-spi               | OK     | 23.37              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-assumptions-analogin  | OK     | 25.05              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-assumptions-digitalio | OK     | 23.32              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-assumptions-i2c       | OK     | 21.04              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-assumptions-pwm       | OK     | 20.84              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-assumptions-pwmout    | OK     | 20.97              | shell       |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-assumptions-spi       | OK     | 21.83              | shell       |\r\n+----------------------+------------------+-----------------------------+--------+--------------------+-------------+\r\nmbedgt: test suite results: 1 FAIL / 12 OK\r\n```\r\n\r\n- `tests-api-i2c` / `I2C -  LM75B Temperature Read` failed\r\nThis test item fails due to no I2C LM75B sensor at hand.\r\n\r\n```\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-i2c               | I2C -  EEProm 2nd WR 10  Bytes                             | 1      | 0      | OK     | 0.06               |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-i2c               | I2C -  EEProm 2nd WR 100 Bytes                             | 1      | 0      | OK     | 0.06               |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-i2c               | I2C -  EEProm 2nd WR 2 Bytes                               | 1      | 0      | OK     | 0.06               |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-i2c               | I2C -  EEProm 2nd WR Single Byte                           | 1      | 0      | OK     | 0.06               |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-i2c               | I2C -  EEProm WR 10  Bytes                                 | 1      | 0      | OK     | 0.06               |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-i2c               | I2C -  EEProm WR 100 Bytes                                 | 1      | 0      | OK     | 0.06               |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-i2c               | I2C -  EEProm WR 2 Bytes                                   | 1      | 0      | OK     | 0.06               |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-i2c               | I2C -  EEProm WR Single Byte                               | 1      | 0      | OK     | 0.06               |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-i2c               | I2C -  Instantiation of I2C Object                         | 1      | 0      | OK     | 0.07               |\r\n| NUMAKER_PFM_M487-ARM | NUMAKER_PFM_M487 | tests-api-i2c               | I2C -  LM75B Temperature Read                              | 0      | 2      | FAIL   | 0.17               |\r\n```\r\n\r\n- `tests-api-pwm`, `tests-assumptions-pwm`, and `tests-assumptions-pwmout`\r\nLimited by pinout of this target board, 2 pin pairs out of 4 are bypassed for these test suites.","created_at":"2017-06-22T02:00:30Z","updated_at":"2017-07-04T10:47:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"036181d23004350426cdb8daafabcc3fca577f96","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/ARMmbed/mbed-os/pulls/4608/commits","review_comments_url":"https://api.github.com/repos/ARMmbed/mbed-os/pulls/4608/comments","review_comment_url":"https://api.github.com/repos/ARMmbed/mbed-os/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ARMmbed/mbed-os/issues/4608/comments","statuses_url":"https://api.github.com/repos/ARMmbed/mbed-os/statuses/5c505f4bc939472ec4bd2bbbad0bb33bb249a9b5","head":{"label":"OpenNuvoton:nuvoton_m487","ref":"nuvoton_m487","sha":"5c505f4bc939472ec4bd2bbbad0bb33bb249a9b5","user":{"login":"OpenNuvoton","id":18352608,"avatar_url":"https://avatars3.githubusercontent.com/u/18352608?v=3","gravatar_id":"","url":"https://api.github.com/users/OpenNuvoton","html_url":"https://github.com/OpenNuvoton","followers_url":"https://api.github.com/users/OpenNuvoton/followers","following_url":"https://api.github.com/users/OpenNuvoton/following{/other_user}","gists_url":"https://api.github.com/users/OpenNuvoton/gists{/gist_id}","starred_url":"https://api.github.com/users/OpenNuvoton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OpenNuvoton/subscriptions","organizations_url":"https://api.github.com/users/OpenNuvoton/orgs","repos_url":"https://api.github.com/users/OpenNuvoton/repos","events_url":"https://api.github.com/users/OpenNuvoton/events{/privacy}","received_events_url":"https://api.github.com/users/OpenNuvoton/received_events","type":"Organization","site_admin":false},"repo":{"id":63859220,"name":"mbed","full_name":"OpenNuvoton/mbed","owner":{"login":"OpenNuvoton","id":18352608,"avatar_url":"https://avatars3.githubusercontent.com/u/18352608?v=3","gravatar_id":"","url":"https://api.github.com/users/OpenNuvoton","html_url":"https://github.com/OpenNuvoton","followers_url":"https://api.github.com/users/OpenNuvoton/followers","following_url":"https://api.github.com/users/OpenNuvoton/following{/other_user}","gists_url":"https://api.github.com/users/OpenNuvoton/gists{/gist_id}","starred_url":"https://api.github.com/users/OpenNuvoton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OpenNuvoton/subscriptions","organizations_url":"https://api.github.com/users/OpenNuvoton/orgs","repos_url":"https://api.github.com/users/OpenNuvoton/repos","events_url":"https://api.github.com/users/OpenNuvoton/events{/privacy}","received_events_url":"https://api.github.com/users/OpenNuvoton/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/OpenNuvoton/mbed","description":"mbed libraries and tools (Classic). For mbed OS, look here: https://www.mbed.com/en/development/software/mbed-os/","fork":true,"url":"https://api.github.com/repos/OpenNuvoton/mbed","forks_url":"https://api.github.com/repos/OpenNuvoton/mbed/forks","keys_url":"https://api.github.com/repos/OpenNuvoton/mbed/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OpenNuvoton/mbed/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OpenNuvoton/mbed/teams","hooks_url":"https://api.github.com/repos/OpenNuvoton/mbed/hooks","issue_events_url":"https://api.github.com/repos/OpenNuvoton/mbed/issues/events{/number}","events_url":"https://api.github.com/repos/OpenNuvoton/mbed/events","assignees_url":"https://api.github.com/repos/OpenNuvoton/mbed/assignees{/user}","branches_url":"https://api.github.com/repos/OpenNuvoton/mbed/branches{/branch}","tags_url":"https://api.github.com/repos/OpenNuvoton/mbed/tags","blobs_url":"https://api.github.com/repos/OpenNuvoton/mbed/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OpenNuvoton/mbed/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OpenNuvoton/mbed/git/refs{/sha}","trees_url":"https://api.github.com/repos/OpenNuvoton/mbed/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OpenNuvoton/mbed/statuses/{sha}","languages_url":"https://api.github.com/repos/OpenNuvoton/mbed/languages","stargazers_url":"https://api.github.com/repos/OpenNuvoton/mbed/stargazers","contributors_url":"https://api.github.com/repos/OpenNuvoton/mbed/contributors","subscribers_url":"https://api.github.com/repos/OpenNuvoton/mbed/subscribers","subscription_url":"https://api.github.com/repos/OpenNuvoton/mbed/subscription","commits_url":"https://api.github.com/repos/OpenNuvoton/mbed/commits{/sha}","git_commits_url":"https://api.github.com/repos/OpenNuvoton/mbed/git/commits{/sha}","comments_url":"https://api.github.com/repos/OpenNuvoton/mbed/comments{/number}","issue_comment_url":"https://api.github.com/repos/OpenNuvoton/mbed/issues/comments{/number}","contents_url":"https://api.github.com/repos/OpenNuvoton/mbed/contents/{+path}","compare_url":"https://api.github.com/repos/OpenNuvoton/mbed/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OpenNuvoton/mbed/merges","archive_url":"https://api.github.com/repos/OpenNuvoton/mbed/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OpenNuvoton/mbed/downloads","issues_url":"https://api.github.com/repos/OpenNuvoton/mbed/issues{/number}","pulls_url":"https://api.github.com/repos/OpenNuvoton/mbed/pulls{/number}","milestones_url":"https://api.github.com/repos/OpenNuvoton/mbed/milestones{/number}","notifications_url":"https://api.github.com/repos/OpenNuvoton/mbed/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OpenNuvoton/mbed/labels{/name}","releases_url":"https://api.github.com/repos/OpenNuvoton/mbed/releases{/id}","deployments_url":"https://api.github.com/repos/OpenNuvoton/mbed/deployments","created_at":"2016-07-21T10:13:33Z","updated_at":"2016-07-21T10:14:34Z","pushed_at":"2017-07-04T03:34:54Z","git_url":"git://github.com/OpenNuvoton/mbed.git","ssh_url":"git@github.com:OpenNuvoton/mbed.git","clone_url":"https://github.com/OpenNuvoton/mbed.git","svn_url":"https://github.com/OpenNuvoton/mbed","homepage":"","size":144545,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ARMmbed:master","ref":"master","sha":"d121a43e37412bd3de800ce72bf58e0ffa44ca9f","user":{"login":"ARMmbed","id":8916057,"avatar_url":"https://avatars0.githubusercontent.com/u/8916057?v=3","gravatar_id":"","url":"https://api.github.com/users/ARMmbed","html_url":"https://github.com/ARMmbed","followers_url":"https://api.github.com/users/ARMmbed/followers","following_url":"https://api.github.com/users/ARMmbed/following{/other_user}","gists_url":"https://api.github.com/users/ARMmbed/gists{/gist_id}","starred_url":"https://api.github.com/users/ARMmbed/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ARMmbed/subscriptions","organizations_url":"https://api.github.com/users/ARMmbed/orgs","repos_url":"https://api.github.com/users/ARMmbed/repos","events_url":"https://api.github.com/users/ARMmbed/events{/privacy}","received_events_url":"https://api.github.com/users/ARMmbed/received_events","type":"Organization","site_admin":false},"repo":{"id":8270972,"name":"mbed-os","full_name":"ARMmbed/mbed-os","owner":{"login":"ARMmbed","id":8916057,"avatar_url":"https://avatars0.githubusercontent.com/u/8916057?v=3","gravatar_id":"","url":"https://api.github.com/users/ARMmbed","html_url":"https://github.com/ARMmbed","followers_url":"https://api.github.com/users/ARMmbed/followers","following_url":"https://api.github.com/users/ARMmbed/following{/other_user}","gists_url":"https://api.github.com/users/ARMmbed/gists{/gist_id}","starred_url":"https://api.github.com/users/ARMmbed/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ARMmbed/subscriptions","organizations_url":"https://api.github.com/users/ARMmbed/orgs","repos_url":"https://api.github.com/users/ARMmbed/repos","events_url":"https://api.github.com/users/ARMmbed/events{/privacy}","received_events_url":"https://api.github.com/users/ARMmbed/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ARMmbed/mbed-os","description":"ARM mbed OS is a platform operating system designed for the internet of things","fork":false,"url":"https://api.github.com/repos/ARMmbed/mbed-os","forks_url":"https://api.github.com/repos/ARMmbed/mbed-os/forks","keys_url":"https://api.github.com/repos/ARMmbed/mbed-os/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ARMmbed/mbed-os/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ARMmbed/mbed-os/teams","hooks_url":"https://api.github.com/repos/ARMmbed/mbed-os/hooks","issue_events_url":"https://api.github.com/repos/ARMmbed/mbed-os/issues/events{/number}","events_url":"https://api.github.com/repos/ARMmbed/mbed-os/events","assignees_url":"https://api.github.com/repos/ARMmbed/mbed-os/assignees{/user}","branches_url":"https://api.github.com/repos/ARMmbed/mbed-os/branches{/branch}","tags_url":"https://api.github.com/repos/ARMmbed/mbed-os/tags","blobs_url":"https://api.github.com/repos/ARMmbed/mbed-os/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ARMmbed/mbed-os/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ARMmbed/mbed-os/git/refs{/sha}","trees_url":"https://api.github.com/repos/ARMmbed/mbed-os/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ARMmbed/mbed-os/statuses/{sha}","languages_url":"https://api.github.com/repos/ARMmbed/mbed-os/languages","stargazers_url":"https://api.github.com/repos/ARMmbed/mbed-os/stargazers","contributors_url":"https://api.github.com/repos/ARMmbed/mbed-os/contributors","subscribers_url":"https://api.github.com/repos/ARMmbed/mbed-os/subscribers","subscription_url":"https://api.github.com/repos/ARMmbed/mbed-os/subscription","commits_url":"https://api.github.com/repos/ARMmbed/mbed-os/commits{/sha}","git_commits_url":"https://api.github.com/repos/ARMmbed/mbed-os/git/commits{/sha}","comments_url":"https://api.github.com/repos/ARMmbed/mbed-os/comments{/number}","issue_comment_url":"https://api.github.com/repos/ARMmbed/mbed-os/issues/comments{/number}","contents_url":"https://api.github.com/repos/ARMmbed/mbed-os/contents/{+path}","compare_url":"https://api.github.com/repos/ARMmbed/mbed-os/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ARMmbed/mbed-os/merges","archive_url":"https://api.github.com/repos/ARMmbed/mbed-os/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ARMmbed/mbed-os/downloads","issues_url":"https://api.github.com/repos/ARMmbed/mbed-os/issues{/number}","pulls_url":"https://api.github.com/repos/ARMmbed/mbed-os/pulls{/number}","milestones_url":"https://api.github.com/repos/ARMmbed/mbed-os/milestones{/number}","notifications_url":"https://api.github.com/repos/ARMmbed/mbed-os/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ARMmbed/mbed-os/labels{/name}","releases_url":"https://api.github.com/repos/ARMmbed/mbed-os/releases{/id}","deployments_url":"https://api.github.com/repos/ARMmbed/mbed-os/deployments","created_at":"2013-02-18T15:23:11Z","updated_at":"2017-07-04T09:18:32Z","pushed_at":"2017-07-04T09:29:40Z","git_url":"git://github.com/ARMmbed/mbed-os.git","ssh_url":"git@github.com:ARMmbed/mbed-os.git","clone_url":"https://github.com/ARMmbed/mbed-os.git","svn_url":"https://github.com/ARMmbed/mbed-os","homepage":"https://mbed.com","size":145956,"stargazers_count":1099,"watchers_count":1099,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1029,"mirror_url":null,"open_issues_count":486,"forks":1029,"open_issues":486,"watchers":1099,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ARMmbed/mbed-os/pulls/4608"},"html":{"href":"https://github.com/ARMmbed/mbed-os/pull/4608"},"issue":{"href":"https://api.github.com/repos/ARMmbed/mbed-os/issues/4608"},"comments":{"href":"https://api.github.com/repos/ARMmbed/mbed-os/issues/4608/comments"},"review_comments":{"href":"https://api.github.com/repos/ARMmbed/mbed-os/pulls/4608/comments"},"review_comment":{"href":"https://api.github.com/repos/ARMmbed/mbed-os/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ARMmbed/mbed-os/pulls/4608/commits"},"statuses":{"href":"https://api.github.com/repos/ARMmbed/mbed-os/statuses/5c505f4bc939472ec4bd2bbbad0bb33bb249a9b5"}}}}
{"actor":{"display_login":"0xc0170"}}