split some files in units to smaller .c files, comments etc
This commit is contained in:
@@ -1,74 +0,0 @@
|
||||
//
|
||||
// Created by MightyPork on 2018/01/14.
|
||||
//
|
||||
|
||||
#include "platform.h"
|
||||
#include "unit_base.h"
|
||||
|
||||
#define UUSART_INTERNAL
|
||||
#include "_internal.h"
|
||||
|
||||
/** Load from a binary buffer stored in Flash */
|
||||
void UUSART_loadBinary(Unit *unit, PayloadParser *pp)
|
||||
{
|
||||
struct priv *priv = unit->data;
|
||||
|
||||
uint8_t version = pp_u8(pp);
|
||||
(void)version;
|
||||
|
||||
priv->periph_num = pp_u8(pp);
|
||||
priv->remap = pp_u8(pp);
|
||||
|
||||
priv->baudrate = pp_u32(pp);
|
||||
priv->parity = pp_u8(pp);
|
||||
priv->stopbits = pp_u8(pp);
|
||||
priv->direction = pp_u8(pp);
|
||||
|
||||
priv->hw_flow_control = pp_u8(pp);
|
||||
priv->clock_output = pp_bool(pp);
|
||||
priv->cpol = pp_bool(pp);
|
||||
priv->cpha = pp_bool(pp);
|
||||
priv->lsb_first = pp_bool(pp);
|
||||
priv->width = pp_u8(pp);
|
||||
|
||||
priv->data_inv = pp_bool(pp);
|
||||
priv->rx_inv = pp_bool(pp);
|
||||
priv->tx_inv = pp_bool(pp);
|
||||
|
||||
priv->de_output = pp_bool(pp);
|
||||
priv->de_polarity = pp_bool(pp);
|
||||
priv->de_assert_time = pp_u8(pp);
|
||||
priv->de_clear_time = pp_u8(pp);
|
||||
}
|
||||
|
||||
/** Write to a binary buffer for storing in Flash */
|
||||
void UUSART_writeBinary(Unit *unit, PayloadBuilder *pb)
|
||||
{
|
||||
struct priv *priv = unit->data;
|
||||
|
||||
pb_u8(pb, 0); // version
|
||||
|
||||
pb_u8(pb, priv->periph_num);
|
||||
pb_u8(pb, priv->remap);
|
||||
|
||||
pb_u32(pb, priv->baudrate);
|
||||
pb_u8(pb, priv->parity);
|
||||
pb_u8(pb, priv->stopbits);
|
||||
pb_u8(pb, priv->direction);
|
||||
|
||||
pb_u8(pb, priv->hw_flow_control);
|
||||
pb_bool(pb, priv->clock_output);
|
||||
pb_bool(pb, priv->cpol);
|
||||
pb_bool(pb, priv->cpha);
|
||||
pb_bool(pb, priv->lsb_first);
|
||||
pb_u8(pb, priv->width);
|
||||
|
||||
pb_bool(pb, priv->data_inv);
|
||||
pb_bool(pb, priv->rx_inv);
|
||||
pb_bool(pb, priv->tx_inv);
|
||||
|
||||
pb_bool(pb, priv->de_output);
|
||||
pb_bool(pb, priv->de_polarity);
|
||||
pb_u8(pb, priv->de_assert_time);
|
||||
pb_u8(pb, priv->de_clear_time);
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
//
|
||||
// Created by MightyPork on 2018/02/03.
|
||||
//
|
||||
|
||||
#include "platform.h"
|
||||
#include "unit_base.h"
|
||||
#include "unit_usart.h"
|
||||
|
||||
#define UUSART_INTERNAL
|
||||
#include "_usart_internal.h"
|
||||
|
||||
|
||||
error_t UU_USART_Write(Unit *unit, const uint8_t *buffer, uint32_t len)
|
||||
{
|
||||
CHECK_TYPE(unit, &UNIT_USART);
|
||||
struct priv *priv = unit->data;
|
||||
|
||||
uint32_t t_start = HAL_GetTick();
|
||||
while (len > 0) {
|
||||
// this should be long enough even for the slowest bitrates and 512 bytes
|
||||
if (HAL_GetTick() - t_start > 5000) {
|
||||
return E_HW_TIMEOUT;
|
||||
}
|
||||
|
||||
uint16_t chunk = UUSART_DMA_TxQueue(priv, buffer, (uint16_t) len);
|
||||
|
||||
buffer += chunk;
|
||||
len -= chunk;
|
||||
|
||||
// We give up control if there's another thread waiting and this isn't the last cycle
|
||||
if (len > 0) {
|
||||
osThreadYield();
|
||||
}
|
||||
}
|
||||
|
||||
return E_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
error_t UU_USART_WriteSync(Unit *unit, const uint8_t *buffer, uint32_t len)
|
||||
{
|
||||
CHECK_TYPE(unit, &UNIT_USART);
|
||||
struct priv *priv = unit->data;
|
||||
|
||||
TRY(UU_USART_Write(unit, buffer, len));
|
||||
|
||||
// Now wait for the last DMA to complete
|
||||
uint32_t t_start = HAL_GetTick();
|
||||
while (priv->tx_dma_busy) {
|
||||
if (HAL_GetTick() - t_start > 1000) {
|
||||
return E_HW_TIMEOUT;
|
||||
}
|
||||
}
|
||||
|
||||
return E_SUCCESS;
|
||||
}
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "unit_base.h"
|
||||
|
||||
#define UUSART_INTERNAL
|
||||
#include "_internal.h"
|
||||
#include "_usart_internal.h"
|
||||
|
||||
static void UUSART_DMA_RxHandler(void *arg);
|
||||
static void UUSART_DMA_TxHandler(void *arg);
|
||||
@@ -6,7 +6,7 @@
|
||||
#include "unit_base.h"
|
||||
|
||||
#define UUSART_INTERNAL
|
||||
#include "_internal.h"
|
||||
#include "_usart_internal.h"
|
||||
|
||||
extern error_t UUSART_ClaimDMAs(Unit *unit);
|
||||
extern error_t UUSART_SetupDMAs(Unit *unit);
|
||||
@@ -4,10 +4,75 @@
|
||||
|
||||
#include "platform.h"
|
||||
#include "unit_base.h"
|
||||
#include "avrlibc.h"
|
||||
#include "unit_usart.h"
|
||||
|
||||
#define UUSART_INTERNAL
|
||||
#include "_internal.h"
|
||||
#include "_usart_internal.h"
|
||||
|
||||
/** Load from a binary buffer stored in Flash */
|
||||
void UUSART_loadBinary(Unit *unit, PayloadParser *pp)
|
||||
{
|
||||
struct priv *priv = unit->data;
|
||||
|
||||
uint8_t version = pp_u8(pp);
|
||||
(void)version;
|
||||
|
||||
priv->periph_num = pp_u8(pp);
|
||||
priv->remap = pp_u8(pp);
|
||||
|
||||
priv->baudrate = pp_u32(pp);
|
||||
priv->parity = pp_u8(pp);
|
||||
priv->stopbits = pp_u8(pp);
|
||||
priv->direction = pp_u8(pp);
|
||||
|
||||
priv->hw_flow_control = pp_u8(pp);
|
||||
priv->clock_output = pp_bool(pp);
|
||||
priv->cpol = pp_bool(pp);
|
||||
priv->cpha = pp_bool(pp);
|
||||
priv->lsb_first = pp_bool(pp);
|
||||
priv->width = pp_u8(pp);
|
||||
|
||||
priv->data_inv = pp_bool(pp);
|
||||
priv->rx_inv = pp_bool(pp);
|
||||
priv->tx_inv = pp_bool(pp);
|
||||
|
||||
priv->de_output = pp_bool(pp);
|
||||
priv->de_polarity = pp_bool(pp);
|
||||
priv->de_assert_time = pp_u8(pp);
|
||||
priv->de_clear_time = pp_u8(pp);
|
||||
}
|
||||
|
||||
/** Write to a binary buffer for storing in Flash */
|
||||
void UUSART_writeBinary(Unit *unit, PayloadBuilder *pb)
|
||||
{
|
||||
struct priv *priv = unit->data;
|
||||
|
||||
pb_u8(pb, 0); // version
|
||||
|
||||
pb_u8(pb, priv->periph_num);
|
||||
pb_u8(pb, priv->remap);
|
||||
|
||||
pb_u32(pb, priv->baudrate);
|
||||
pb_u8(pb, priv->parity);
|
||||
pb_u8(pb, priv->stopbits);
|
||||
pb_u8(pb, priv->direction);
|
||||
|
||||
pb_u8(pb, priv->hw_flow_control);
|
||||
pb_bool(pb, priv->clock_output);
|
||||
pb_bool(pb, priv->cpol);
|
||||
pb_bool(pb, priv->cpha);
|
||||
pb_bool(pb, priv->lsb_first);
|
||||
pb_u8(pb, priv->width);
|
||||
|
||||
pb_bool(pb, priv->data_inv);
|
||||
pb_bool(pb, priv->rx_inv);
|
||||
pb_bool(pb, priv->tx_inv);
|
||||
|
||||
pb_bool(pb, priv->de_output);
|
||||
pb_bool(pb, priv->de_polarity);
|
||||
pb_u8(pb, priv->de_assert_time);
|
||||
pb_u8(pb, priv->de_clear_time);
|
||||
}
|
||||
|
||||
/** Parse a key-value pair from the INI file */
|
||||
error_t UUSART_loadIni(Unit *unit, const char *key, const char *value)
|
||||
+16
-47
@@ -6,8 +6,18 @@
|
||||
#include "unit_usart.h"
|
||||
|
||||
#define UUSART_INTERNAL
|
||||
#include "_internal.h"
|
||||
#include "_usart_internal.h"
|
||||
|
||||
/**
|
||||
* Data RX handler, run on the jobs thread.
|
||||
*
|
||||
* unit - unit
|
||||
* timestamp - timestamp
|
||||
* data1 - read start position
|
||||
* data2 - nr of bytes to read
|
||||
*
|
||||
* @param job
|
||||
*/
|
||||
static void UUSART_SendReceivedDataToMaster(Job *job)
|
||||
{
|
||||
Unit *unit = job->unit;
|
||||
@@ -27,7 +37,9 @@ static void UUSART_SendReceivedDataToMaster(Job *job)
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle received data (we're inside the IRQ)
|
||||
* Handle received data (we're inside the IRQ).
|
||||
* This is called either from a DMA complete / half interrupot,
|
||||
* or form the timeout interrupt.
|
||||
*
|
||||
* @param unit - handled unit
|
||||
* @param endpos - end position in the buffer
|
||||
@@ -79,51 +91,6 @@ void UUSART_Tick(Unit *unit)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
error_t UU_USART_Write(Unit *unit, const uint8_t *buffer, uint32_t len)
|
||||
{
|
||||
CHECK_TYPE(unit, &UNIT_USART);
|
||||
struct priv *priv = unit->data;
|
||||
|
||||
uint32_t t_start = HAL_GetTick();
|
||||
while (len > 0) {
|
||||
// this should be long enough even for the slowest bitrates and 512 bytes
|
||||
if (HAL_GetTick() - t_start > 5000) {
|
||||
return E_HW_TIMEOUT;
|
||||
}
|
||||
|
||||
uint16_t chunk = UUSART_DMA_TxQueue(priv, buffer, (uint16_t) len);
|
||||
|
||||
buffer += chunk;
|
||||
len -= chunk;
|
||||
|
||||
// We give up control if there's another thread waiting and this isn't the last cycle
|
||||
if (len > 0) {
|
||||
osThreadYield();
|
||||
}
|
||||
}
|
||||
|
||||
return E_SUCCESS;
|
||||
}
|
||||
|
||||
error_t UU_USART_WriteSync(Unit *unit, const uint8_t *buffer, uint32_t len)
|
||||
{
|
||||
CHECK_TYPE(unit, &UNIT_USART);
|
||||
struct priv *priv = unit->data;
|
||||
|
||||
TRY(UU_USART_Write(unit, buffer, len));
|
||||
|
||||
// Now wait for the last DMA to complete
|
||||
uint32_t t_start = HAL_GetTick();
|
||||
while (priv->tx_dma_busy) {
|
||||
if (HAL_GetTick() - t_start > 1000) {
|
||||
return E_HW_TIMEOUT;
|
||||
}
|
||||
}
|
||||
|
||||
return E_SUCCESS;
|
||||
}
|
||||
|
||||
enum PinCmd_ {
|
||||
CMD_WRITE = 0,
|
||||
CMD_WRITE_SYNC = 1,
|
||||
@@ -135,11 +102,13 @@ static error_t UUSART_handleRequest(Unit *unit, TF_ID frame_id, uint8_t command,
|
||||
uint32_t len;
|
||||
const uint8_t *pld;
|
||||
switch (command) {
|
||||
/** Write bytes to the USART. Payload consists of the data to send. Waits for completion. */
|
||||
case CMD_WRITE:
|
||||
pld = pp_tail(pp, &len);
|
||||
TRY(UU_USART_Write(unit, pld, len));
|
||||
return E_SUCCESS;
|
||||
|
||||
/** Write bytes to the USART, without waiting for completion. */
|
||||
case CMD_WRITE_SYNC:
|
||||
pld = pp_tail(pp, &len);
|
||||
TRY(UU_USART_WriteSync(unit, pld, len));
|
||||
|
||||
Reference in New Issue
Block a user