Skip to content

Commit

Permalink
change the path of com files
Browse files Browse the repository at this point in the history
none
  • Loading branch information
Dyyt587 committed Nov 29, 2023
1 parent 6988e79 commit df76e16
Show file tree
Hide file tree
Showing 27 changed files with 4,826 additions and 5,914 deletions.
93 changes: 42 additions & 51 deletions com/src/com_component.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,23 +114,23 @@ void com_queue_free(com_queue_t *queue)
int8_t com_queue_put(com_queue_t *queue, uint32_t mode, uint32_t addr, uint8_t *pdata, uint32_t length)
{
com_task_t task = {
.magic_word = COMMAGIC_WORD,
// .magic_word = COMMAGIC_WORD,
.pdata = pdata,
.len = length,
.pdata_1 = pdata,
// .pdata_1 = pdata,
.mode = mode,
.addr = addr};

if (kfifo_get_free(queue->datefifo) < length)
{
log_e("no memory of data fifo\n");
printf("no memory of data fifo\n");

return -1;
// while(1);
}
if (kfifo_get_free(queue->taskfifo) < sizeof(task))
{
log_e("no memory task fifo\n");
printf("no memory task fifo\n");

return -2;
// while(1);
Expand Down Expand Up @@ -175,23 +175,23 @@ int8_t com_queue_put(com_queue_t *queue, uint32_t mode, uint32_t addr, uint8_t *
int8_t com_queue_put_rx(com_queue_t *queue, uint32_t mode, uint32_t addr, uint32_t length)
{
com_task_t task = {
.magic_word = COMMAGIC_WORD,
// .magic_word = COMMAGIC_WORD,
.pdata = queue->datefifo->buffer + (queue->datefifo->out & (queue->datefifo->size - 1)),
.len = length,
.pdata_1 = queue->datefifo->buffer + (queue->datefifo->out & (queue->datefifo->size - 1)),
// .pdata_1 = queue->datefifo->buffer + (queue->datefifo->out & (queue->datefifo->size - 1)),
.mode = mode,
.addr = addr};

if (kfifo_get_free(queue->datefifo) < length)
{
log_e("no memory of data fifo\n");
printf("no memory of data fifo\n");

return -1;
// while(1);
}
if (kfifo_get_free(queue->taskfifo) < sizeof(task))
{
log_e("no memory task fifo\n");
printf("no memory task fifo\n");

return -2;
// while(1);
Expand All @@ -207,26 +207,8 @@ int8_t com_queue_get(com_queue_t *queue, uint8_t *pdata, uint32_t *length)

bool com_check_task_right(com_t *com, com_queue_t *queue, com_task_t *task)
{
if ((task->magic_word == COMMAGIC_WORD) && (task->pdata == task->pdata_1))
{
// if (kfifo_get_used(queue->datefifo) < com->task.len)
// {
// // 数据有问题,退出
// // TODO:待完善解决方案
// log_e("iic date error!!!!!!!!!!!\n");
// COM_TX_UNLOCK(com);
// COM_RX_UNLOCK(com);
//
// return false;
// }
return true;
}
else
{
log_e("task date error!!!!!!!!!!!\n");

return false;
}
return true;
}

bool com_check_task(com_t *com, com_queue_t *queue, com_task_t *task)
Expand Down Expand Up @@ -298,39 +280,32 @@ void com_init(com_t *com, com_device_e type, com_init_t* init)
{
memset(com, 0, sizeof(com_init_t));
com->type = type;
//
// com->tx_queue.taskfifo = kfifo_alloc(init->tx_task_size, 0);
// com->tx_queue.datefifo = kfifo_alloc(init->tx_buf_size, 0);
// com->rx_queue.taskfifo = kfifo_alloc(init->rx_task_size, 0);
// com->rx_queue.datefifo = kfifo_alloc(init->rx_buf_size, 0);

com->tx_queue.taskfifo = kfifo_alloc(init->tx_task_size, 0);
com->tx_queue.datefifo = kfifo_alloc(init->tx_buf_size, 0);
com->rx_queue.taskfifo = kfifo_alloc(init->rx_task_size, 0);
com->rx_queue.datefifo = kfifo_alloc(init->rx_buf_size, 0);

if (com->tx_queue.taskfifo == NULL)
{
log_e("tx task fifo init error\n");
}
if (com->tx_queue.datefifo == NULL)
{
log_e("tx data fifo init error\n");
}
if (com->rx_queue.taskfifo == NULL)
{
log_e("rx task fifo init error\n");
}
if (com->rx_queue.datefifo == NULL)
{
log_e("rx data fifo init error\n");
}
COM_TX_UNLOCK(com);
COM_RX_UNLOCK(com);
switch(type)
{
case com_type_uart:
com->com_tx = com_uart_tx;
com->com_rx_start = com_uart_rx_start;
com->com_tx_cplt = com_uart_tx_cplt;
com->com_rx_pack_cplt = com_uart_rx_pack_cplt;
com->tx_queue.taskfifo = kfifo_alloc(init->tx_task_size, 0);
com->tx_queue.datefifo = kfifo_alloc(init->tx_buf_size, 0);
com->rx_queue.taskfifo = kfifo_alloc(init->rx_task_size, 0);
com->rx_queue.datefifo = kfifo_alloc(init->rx_buf_size, 0);
com->com_tx = com_uart_tx;
com->com_rx_start = com_uart_rx_start;
com->com_tx_cplt = com_uart_tx_cplt;
com->com_rx_pack_cplt = com_uart_rx_pack_cplt;
break;
case com_type_spi:
com->tx_queue.taskfifo = kfifo_alloc(init->tx_task_size, 0);
com->tx_queue.datefifo = kfifo_alloc(init->tx_buf_size, 0);
com->rx_queue.taskfifo = com->tx_queue.taskfifo;
com->rx_queue.datefifo = kfifo_alloc(init->rx_buf_size, 0);
//TODO:
break;
case com_type_i2c:
Expand All @@ -343,6 +318,22 @@ void com_init(com_t *com, com_device_e type, com_init_t* init)

default:
break;
}
if (com->tx_queue.taskfifo == NULL)
{
log_e("tx task fifo init error\n");
}
if (com->tx_queue.datefifo == NULL)
{
log_e("tx data fifo init error\n");
}
if (com->rx_queue.taskfifo == NULL)
{
log_e("rx task fifo init error\n");
}
if (com->rx_queue.datefifo == NULL)
{
log_e("rx data fifo init error\n");
}
}
void com_register_driver(com_t *com, com_driver_t* driver)
Expand Down
11 changes: 8 additions & 3 deletions com/src/com_component_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
#define COM_TX_UNLOCK(com) (ClrBit(com->lock, TX))

#define COM_RX_LOCK(com) (SetBit(com->lock, RX))
#define COM_RX_UNLOCK(com) (ClrBit(com->lock, TX))
#define COM_RX_UNLOCK(com) (ClrBit(com->lock, RX))

#define COM_IS_TX_LOCK(com) GET_BIT(com->lock, TX)
#define COM_IS_RX_LOCK(com) GET_BIT(com->lock, RX)
Expand Down Expand Up @@ -58,14 +58,18 @@ enum
COM_SPI_QUEUE_TX_STAGE1 = (COM_SPI_QUEUE_TX + 1), // 用于环形缓冲区的调转
COM_SPI_QUEUE_TX_STAGE2 = (COM_SPI_QUEUE_TX + 2), // 用于环形缓冲区的调转
COM_SPI_QUEUE_RX,
COM_SPI_QUEUE_RX_STAGE1 = (COM_SPI_QUEUE_RX + 1), // 用于环形缓冲区的调转
COM_SPI_QUEUE_RX_STAGE2 = (COM_SPI_QUEUE_RX + 2), // 用于环形缓冲区的调转

COM_SPI_QUEUE_TXRX,
};
typedef struct
{
uint32_t magic_word;
//uint32_t magic_word;
uint32_t addr;
uint8_t *pdata;
uint32_t len;
uint8_t *pdata_1;
//uint8_t *pdata_1;
uint32_t mode;
} com_task_t;

Expand All @@ -82,6 +86,7 @@ typedef struct com_t
uint8_t lock;

void (*ll_tx)(struct com_t *com);
void (*ll_txrx)(struct com_t *com);
com_task_t task_1;
com_task_cnt_t tx_cnt;

Expand Down
136 changes: 135 additions & 1 deletion com/src/com_component_spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

#define DEBUG_COM 1
////////////////////////com_iic_part_start////////////////////////

void com_spi_try_communite(com_t *com);
// 针对spi全双工同步通讯设计,减少一个fifo的初始化
void com_queue_init_spi(com_queue_t *queue, uint32_t tx_fifo_size, kfifo_t *taskfifo)
{
Expand All @@ -33,3 +33,137 @@ void com_queue_init_spi(com_queue_t *queue, uint32_t tx_fifo_size, kfifo_t *task
}
#endif
}

void com_spi_tx_rx(com_t *com, uint32_t addr, uint8_t *pdata_tx, uint32_t length, uint32_t delaytime)
{
uint8_t error = 0;
// uint64_t cnt = ++com->tx_cnt.total_cnt;
com->addr = addr;
error = com_queue_put(&com->tx_queue, COM_SPI_QUEUE_TXRX, com->addr, pdata_tx, length);

if (error == 0) // 将数据放入队列成功
{
com->tx_cnt.total_cnt++;
if (COM_IS_TX_LOCK(com) == 0)
{
com_spi_try_communite(com);
}
else
{
log_v("com_spi_tx bus busy but put data in queue\n");
}
com_tx_wait(com, delaytime);
}
else
{
log_e("com_spi_tx error\n");
}
}
uint8_t com_spi_tx(com_t *com, uint32_t addr, uint8_t *pdata_tx, uint32_t length, uint32_t delaytime)
{
uint8_t error = 0;
// uint64_t cnt = ++com->tx_cnt.total_cnt;
com->addr = addr;
error = com_queue_put(&com->tx_queue, COM_SPI_QUEUE_TX, com->addr, pdata_tx, length);

if (error == 0) // 将数据放入队列成功
{
com->tx_cnt.total_cnt++;
if (COM_IS_TX_LOCK(com) == 0)
{
com_spi_try_communite(com);
}
else
{
log_v("com_spi_tx bus busy but put data in queue\n");
}
com_tx_wait(com, delaytime);
}
else
{
log_e("com_spi_tx error\n");
}

return error;
}

void com_spi_try_communite(com_t *com)
{

COM_TX_LOCK(com);
COM_RX_LOCK(com);
// 检查任务
if (com_check_task(com, &com->tx_queue, &com->task_1) == false)
{
COM_TX_UNLOCK(com);
COM_RX_UNLOCK(com);
return;
}
if(com->task_1.mode == COM_SPI_QUEUE_RX || com->task_1.mode == COM_SPI_QUEUE_RX_STAGE1 || com->task_1.mode == COM_SPI_QUEUE_RX_STAGE2){
com->task_1.pdata = (uint8_t *)kfifo_get_out_pointer(com->rx_queue.datefifo);
com->ll_rx(com);
}else if(com->task_1.mode == COM_SPI_QUEUE_TX || com->task_1.mode == COM_SPI_QUEUE_TX_STAGE1 || com->task_1.mode == COM_SPI_QUEUE_TX_STAGE2){
com->task_1.pdata = (uint8_t *)kfifo_get_out_pointer(com->tx_queue.datefifo);
com->ll_tx(com);
}
else{
com->task_1.pdata = (uint8_t *)kfifo_get_out_pointer(com->tx_queue.datefifo);
com->rx_task.pdata = (uint8_t *)kfifo_get_out_pointer(com->rx_queue.datefifo);
com->ll_txrx(com);
}

// 调用用户数据发送或接收函数完成实际发送接收

}

uint8_t com_spi_tx_cplt(com_t *com)
{
// 调用用户回调
// TODO:用户任务回调
// 开启下一个可能的任务
kfifo_get_index(com->tx_queue.datefifo, com->task_1.len);
com->tx_cnt.cnt++;

com_spi_try_communite(com);
return 0;
}

uint8_t com_spi_start_rx(com_t *com, uint32_t addr, uint32_t length, uint32_t delaytime)
{
uint8_t error = 0;
// uint64_t cnt = ++com->tx_cnt.total_cnt;
com->addr = addr;
error = com_queue_put_rx(&com->rx_queue, COM_SPI_QUEUE_RX, com->addr, length);

if (error == 0) // 将数据放入队列成功
{
com->rx_cnt.total_cnt++;
if (COM_IS_RX_LOCK(com) == 0)
{
com_spi_try_communite(com);
}
else
{
log_v("com_spi_tx bus busy but put data in queue\n");
}
com_rx_wait(com, delaytime);
}
else
{
log_e("com_spi_tx error\n");
}

return error;
}

uint8_t com_spi_rx_cplt(com_t *com,uint32_t len)
{
kfifo_put_index(com->rx_queue.datefifo, com->task_1.len);
com->rx_cnt.cnt++;

//尝试开始下一个任务
com_spi_try_communite(com);
return 0;

}

5 changes: 4 additions & 1 deletion com/src/com_component_spi.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,8 @@
#include "com_component.h"
#include "com_component_def.h"


uint8_t com_spi_tx_cplt(com_t *com);
uint8_t com_spi_rx_cplt(com_t *com,uint32_t len);
uint8_t com_spi_tx(com_t *com, uint32_t addr, uint8_t *pdata_tx, uint32_t length, uint32_t delaytime);
uint8_t com_spi_start_rx(com_t *com, uint32_t addr, uint32_t length, uint32_t delaytime);
#endif
13 changes: 2 additions & 11 deletions com/src/com_component_uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,20 +132,11 @@ uint8_t com_uart_rx(struct com_t *com, uint32_t addr, uint8_t *pdata, uint32_t l

uint8_t com_uart_rx_pack_cplt(com_t *com, uint32_t len)
{
// 将接受的数据放入fifo
com_task_t rx_task = {
.magic_word = COMMAGIC_WORD,
.pdata = 0,
.len = len,
.pdata_1 = 0,
.mode = COM_UART_QUEUE_RX,
};

kfifo_put_index(com->rx_queue.datefifo, len);
com->rx_cnt.total_cnt++;
if (kfifo_get_free(com->rx_queue.taskfifo) < sizeof(rx_task))
return 255;
kfifo_put(com->rx_queue.taskfifo, (uint8_t *)&rx_task, sizeof(rx_task));

com_queue_put_rx(&com->rx_queue,COM_UART_QUEUE_RX,0,len);
// 查看是否要重新启动任务
return 0;
}
Expand Down
File renamed without changes.
File renamed without changes.
Loading

0 comments on commit df76e16

Please sign in to comment.