/*
|
* 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 <stdio.h>
|
#include <stdlib.h>
|
#include <stddef.h>
|
#include <stdarg.h>
|
#include <stdbool.h>
|
#include <errno.h>
|
#include <string.h>
|
#include <ctype.h>
|
#include <stdint.h>
|
#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);
|
}
|