/* * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and * its subsidiaries and affiliates (collectly called MKSEMI). * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form, except as embedded into an MKSEMI * integrated circuit in a product or a software update for such product, * must reproduce the above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or other materials * provided with the distribution. * * 3. Neither the name of MKSEMI nor the names of its contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * 4. This software, with or without modification, must only be used with a * MKSEMI integrated circuit. * * 5. Any software provided in binary form under this license must not be * reverse engineered, decompiled, modified and/or disassembled. * * THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL MKSEMI OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include "mk_common.h" #include "mk_uart.h" #include "uart_in_spi.h" // come from uart_example #define TEST_UART_POLL_MODE 0 #define TEST_UART_INTERUPT_MODE 1 #define TEST_UART_DMA_MODE 2 #define TEST_UART_MODE TEST_UART_POLL_MODE #define TEST_PORT_UART UART_ID0 /******************************************************************************* * @Function uart_in_spi_init * @Parameters None. * @Returns void. ******************************************************************************/ void uart_in_spi_init(void) { struct UART_CFG_T test_uart_cfg = { .parity = UART_PARITY_NONE, .stop = UART_STOP_BITS_1, .data = UART_DATA_BITS_8, .flow = UART_FLOW_CONTROL_NONE, .rx_level = UART_RXFIFO_CHAR_1, .tx_level = UART_TXFIFO_EMPTY, .baud = BAUD_921600, #if (TEST_UART_MODE == TEST_UART_POLL_MODE) .dma_en = false, .int_rx = false, .int_tx = false, #elif (TEST_UART_MODE == TEST_UART_INTERUPT_MODE) .dma_en = false, .int_rx = true, .int_tx = true, #elif (TEST_UART_MODE == TEST_UART_DMA_MODE) .dma_en = true, .int_rx = false, .int_tx = false, #endif }; uart_open(TEST_PORT_UART, &test_uart_cfg); return; } #define TAG_UART_CMD_START_HIGH ((uint8_t)0xf1) #define TAG_UART_CMS_START_LOW ((uint8_t)0xbc) /******************************************************************************* * * @Function uart_receive_in_spi * @Parameters rx_buf - the buffer for receiving the data from UART. * buf_size - the buffer size * callback - call back function * @Returns the data length. ******************************************************************************/ int uart_receive_in_spi(uint8_t *rx_buf, uint16_t buf_size, drv_callback_t callback) { int ret; uint16_t len; uint8_t tmp_buf[8]; do { ret = uart_receive(TEST_PORT_UART, tmp_buf, 1, callback); if ((ret != DRV_OK) || (tmp_buf[0] != TAG_UART_CMD_START_HIGH)) { continue; } ret = uart_receive(TEST_PORT_UART, tmp_buf + 1, 1, callback); if ((ret != DRV_OK) || (tmp_buf[1] != TAG_UART_CMS_START_LOW)) { continue; } ret = uart_receive(TEST_PORT_UART, tmp_buf + 2, 2, callback); if (ret != DRV_OK) { // sofCnt++; continue; } len = (uint16_t)(((uint16_t)tmp_buf[2] << 8) + tmp_buf[3]); if ((len < 5) || (len > (255 + 5))) { continue; } else { break; } } while (1); // (sofCnt < sofMaxCnt); ret = uart_receive(TEST_PORT_UART, rx_buf, len, callback); if (ret != DRV_OK) { return ret; } else { return len; } } /******************************************************************************* * * @Function uart_send_in_spi * @Parameters tx_buf - the buffer for sending the data from UART. * len - the data size * callback - call back function * @Returns tx status. ******************************************************************************/ int uart_send_in_spi(uint8_t *tx_buf, uint16_t len, drv_callback_t callback) { return uart_send(TEST_PORT_UART, tx_buf, len, callback); }