Files
QD4C-firmware/libraries/zf_common/zf_common_fifo.c

555 lines
22 KiB
C
Raw Normal View History

2023-12-11 21:45:06 +08:00
/*********************************************************************************************************************
* CH32V307VCT6 Opensourec Library <EFBFBD><EFBFBD><EFBFBD><EFBFBD>CH32V307VCT6 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڹٷ<EFBFBD> SDK <EFBFBD>ӿڵĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>
* Copyright (c) 2022 SEEKFREE <EFBFBD><EFBFBD><EFBFBD>ɿƼ<EFBFBD>
*
* <EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>CH32V307VCT6 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* CH32V307VCT6 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GPL<EFBFBD><EFBFBD>GNU General Public License<EFBFBD><EFBFBD><EFBFBD><EFBFBD> GNUͨ<EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> GPL <EFBFBD>ĵ<EFBFBD>3<EFBFBD><EFBFBD><EFBFBD> GPL3.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>κκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD>
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κεı<EFBFBD>֤
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><EFBFBD>ʺ<EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD>;<EFBFBD>ı<EFBFBD>֤
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> GPL
*
* <EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<EFBFBD>յ<EFBFBD>һ<EFBFBD><EFBFBD> GPL <EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><https://www.gnu.org/licenses/>
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD> GPL3.0 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤Э<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>İ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD>İ<EFBFBD><EFBFBD><EFBFBD> libraries/doc <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> GPL3_permission_statement.txt <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> libraries <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> LICENSE <EFBFBD>ļ<EFBFBD>
* <EFBFBD><EFBFBD>ӭ<EFBFBD><EFBFBD>λʹ<EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<EFBFBD><EFBFBD>İ<EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> zf_common_fifo
* <EFBFBD><EFBFBD>˾<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ɶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>޹<EFBFBD>˾
* <EFBFBD><EFBFBD><EFBFBD>Ϣ <EFBFBD> libraries/doc <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> version <EFBFBD>ļ<EFBFBD> <EFBFBD>˵<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MounRiver Studio V1.8.1
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ̨ CH32V307VCT6
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> https://seekfree.taobao.com/
*
* <EFBFBD>޸ļ<EFBFBD>¼
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ע
* 2022-09-15 <EFBFBD><EFBFBD>W first version
********************************************************************************************************************/
#include "zf_common_debug.h"
#include "zf_common_fifo.h"
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ͷָ<CDB7><D6B8>λ<EFBFBD><CEBB>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> offset ƫ<><C6AB><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> fifo_head_offset(fifo, 1);
// <20><>ע<EFBFBD><D7A2>Ϣ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD> <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ù<EFBFBD>ע Ҳ<><D2B2><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static void fifo_head_offset (fifo_struct *fifo, uint32 offset)
{
fifo->head += offset;
while(fifo->max <= fifo->head) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
fifo->head -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO βָ<CEB2><D6B8>λ<EFBFBD><CEBB>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> offset ƫ<><C6AB><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> fifo_end_offset(fifo, 1);
// <20><>ע<EFBFBD><D7A2>Ϣ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD> <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ù<EFBFBD>ע Ҳ<><D2B2><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static void fifo_end_offset (fifo_struct *fifo, uint32 offset)
{
fifo->end += offset;
while(fifo->max <= fifo->end) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
fifo->end -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> fifo_clear(fifo);
// <20><>ע<EFBFBD><D7A2>Ϣ <20><><EFBFBD>յ<EFBFBD>ǰ FIFO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_clear (fifo_struct *fifo)
{
zf_assert(fifo != NULL);
fifo_state_enum return_state = FIFO_SUCCESS;
do
{
if(FIFO_CLEAR & fifo->execution)
{
return_state = FIFO_CLEAR_UNDO;
break;
}
fifo->execution |= FIFO_CLEAR;
fifo->head = 0;
fifo->end = 0;
fifo->size = fifo->max;
switch(fifo->type)
{
case FIFO_DATA_8BIT:
memset(fifo->buffer, 0, fifo->max);
break;
case FIFO_DATA_16BIT:
memset(fifo->buffer, 0, fifo->max * 2);
break;
case FIFO_DATA_32BIT:
memset(fifo->buffer, 0, fifo->max * 4);
break;
}
// memset(fifo->buffer, 0, fifo->max);
fifo->execution &= ~FIFO_CLEAR;
}while(0);
return return_state;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO <20><>ѯ<EFBFBD><D1AF>ǰ<EFBFBD><C7B0><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint32 <20><>ʹ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD>
// ʹ<><CAB9>ʾ<EFBFBD><CABE> uint32 len = fifo_used(fifo);
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
uint32 fifo_used (fifo_struct *fifo)
{
zf_assert(fifo != NULL);
return (fifo->max - fifo->size);
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> FIFO <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> dat <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// ʹ<><CAB9>ʾ<EFBFBD><CABE> zf_log(fifo_write_element(&fifo, data) == FIFO_SUCCESS, "fifo_write_byte error");
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_write_element (fifo_struct *fifo, uint32 dat)
{
zf_assert(fifo != NULL);
fifo_state_enum return_state = FIFO_SUCCESS;
do
{
if(FIFO_WRITE & fifo->execution)
{
return_state = FIFO_WRITE_UNDO;
break;
}
fifo->execution |= FIFO_WRITE;
if(1 <= fifo->size) // ʣ<><CAA3><EFBFBD>ռ<EFBFBD><D5BC>㹻װ<E3B9BB>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
switch(fifo->type)
{
case FIFO_DATA_8BIT:
((uint8 *)fifo->buffer)[fifo->head] = dat;
break;
case FIFO_DATA_16BIT:
((uint16 *)fifo->buffer)[fifo->head] = dat;
break;
case FIFO_DATA_32BIT:
((uint32 *)fifo->buffer)[fifo->head] = dat;
break;
}
fifo_head_offset(fifo, 1); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
fifo->size -= 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD>ȼ<EFBFBD>С
}
else
{
return_state = FIFO_SPACE_NO_ENOUGH;
}
fifo->execution &= ~FIFO_WRITE;
}while(0);
return return_state;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> FIFO <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *dat <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> length <20><>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// ʹ<><CAB9>ʾ<EFBFBD><CABE> zf_log(fifo_write_buffer(&fifo, data, 32) == FIFO_SUCCESS, "fifo_write_buffer error");
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, void *dat, uint32 length)
{
zf_assert(fifo != NULL);
fifo_state_enum return_state = FIFO_SUCCESS;
uint32 temp_length = 0;
do
{
if(NULL == dat)
{
return_state = FIFO_BUFFER_NULL;
break;
}
if(FIFO_WRITE & fifo->execution)
{
return_state = FIFO_WRITE_UNDO;
break;
}
fifo->execution |= FIFO_WRITE;
if(length <= fifo->size) // ʣ<><CAA3><EFBFBD>ռ<EFBFBD><D5BC>㹻װ<E3B9BB>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
temp_length = fifo->max - fifo->head; // <20><><EFBFBD><EFBFBD>ͷָ<CDB7><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(length > temp_length) // <20><><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶβ<D6B6><CEB2><EFBFBD>
{
switch(fifo->type)
{
case FIFO_DATA_8BIT:
memcpy(
&(((uint8 *)fifo->buffer)[fifo->head]),
dat, temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
memcpy(
&(((uint8 *)fifo->buffer)[fifo->head]),
&(((uint8 *)dat)[temp_length]),
length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, length - temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
break;
case FIFO_DATA_16BIT:
memcpy(
&(((uint16 *)fifo->buffer)[fifo->head]),
dat, temp_length * 2); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
memcpy(
&(((uint16 *)fifo->buffer)[fifo->head]),
&(((uint16 *)dat)[temp_length]),
(length - temp_length) * 2); // <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, length - temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
break;
case FIFO_DATA_32BIT:
memcpy(
&(((uint32 *)fifo->buffer)[fifo->head]),
dat, temp_length * 4); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
memcpy(
&(((uint32 *)fifo->buffer)[fifo->head]),
&(((uint32 *)dat)[temp_length]),
(length - temp_length) * 4); // <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, length - temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
break;
}
}
else
{
switch(fifo->type)
{
case FIFO_DATA_8BIT:
memcpy(
&(((uint8 *)fifo->buffer)[fifo->head]),
dat, length); // һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
fifo_head_offset(fifo, length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
break;
case FIFO_DATA_16BIT:
memcpy(
&(((uint16 *)fifo->buffer)[fifo->head]),
dat, length * 2); // һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
fifo_head_offset(fifo, length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
break;
case FIFO_DATA_32BIT:
memcpy(
&(((uint32 *)fifo->buffer)[fifo->head]),
dat, length * 4); // һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
fifo_head_offset(fifo, length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
break;
}
// memcpy(&fifo->buffer[fifo->head], dat, length); // һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
// fifo_head_offset(fifo, length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
}
fifo->size -= length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD>ȼ<EFBFBD>С
}
else
{
return_state = FIFO_SPACE_NO_ENOUGH;
}
fifo->execution &= ~FIFO_WRITE;
}while(0);
return return_state;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> FIFO <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *dat Ŀ<><EFBFBD><EABBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> flag <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬ <20><>ѡ<EFBFBD><D1A1><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ն<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// ʹ<><CAB9>ʾ<EFBFBD><CABE> zf_log(fifo_read_element(&fifo, data, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_byte error");
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_read_element (fifo_struct *fifo, void *dat, fifo_operation_enum flag)
{
zf_assert(fifo != NULL);
fifo_state_enum return_state = FIFO_SUCCESS;
do
{
if(NULL == dat)
{
return_state = FIFO_BUFFER_NULL;
break;
}
fifo->execution |= FIFO_READ;
if(1 > fifo_used(fifo))
{
return_state = FIFO_DATA_NO_ENOUGH; // <20><>־<EFBFBD><D6BE><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
}
switch(fifo->type)
{
case FIFO_DATA_8BIT:
*((uint8 *)dat) = ((uint8 *)fifo->buffer)[fifo->end];
break;
case FIFO_DATA_16BIT:
*((uint16 *)dat) = ((uint16 *)fifo->buffer)[fifo->end];
break;
case FIFO_DATA_32BIT:
*((uint32 *)dat) = ((uint32 *)fifo->buffer)[fifo->end];
break;
}
if(flag == FIFO_READ_AND_CLEAN) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
{
if(FIFO_CLEAR & fifo->execution)
{
return_state = FIFO_CLEAR_UNDO;
break;
}
fifo->execution |= FIFO_CLEAR;
fifo_end_offset(fifo, 1); // <20>ƶ<EFBFBD> FIFO ͷָ<CDB7><D6B8>
fifo->size += 1;
fifo->execution &= ~FIFO_CLEAR;
}
}while(0);
fifo->execution &= FIFO_READ;
return return_state;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> FIFO <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *dat Ŀ<><EFBFBD><EABBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *length <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> flag <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬ <20><>ѡ<EFBFBD><D1A1><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ն<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// ʹ<><CAB9>ʾ<EFBFBD><CABE> zf_log(fifo_read_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error");
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag)
{
zf_assert(fifo != NULL);
zf_assert(length != NULL);
fifo_state_enum return_state = FIFO_SUCCESS;
uint32 temp_length;
uint32 fifo_data_length;
do
{
if(NULL == dat)
{
return_state = FIFO_BUFFER_NULL;
break;
}
fifo->execution |= FIFO_READ;
fifo_data_length = fifo_used(fifo);
if(*length > fifo_data_length)
{
*length = fifo_data_length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
return_state = FIFO_DATA_NO_ENOUGH; // <20><>־<EFBFBD><D6BE><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
}
temp_length = fifo->max - fifo->end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(*length <= temp_length) // <20>һ<E3B9BB><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
{
switch(fifo->type)
{
case FIFO_DATA_8BIT:
memcpy(dat, &(((uint8 *)fifo->buffer)[fifo->end]), *length);
break;
case FIFO_DATA_16BIT:
memcpy(dat, &(((uint16 *)fifo->buffer)[fifo->end]), *length * 2);
break;
case FIFO_DATA_32BIT:
memcpy(dat, &(((uint32 *)fifo->buffer)[fifo->end]), *length * 4);
break;
}
}
else
{
switch(fifo->type)
{
case FIFO_DATA_8BIT:
memcpy(dat, &(((uint8 *)fifo->buffer)[fifo->end]), temp_length);
memcpy(&(((uint8 *)dat)[temp_length]), fifo->buffer, *length - temp_length);
break;
case FIFO_DATA_16BIT:
memcpy(dat, &(((uint16 *)fifo->buffer)[fifo->end]), temp_length * 2);
memcpy(&(((uint16 *)dat)[temp_length]), fifo->buffer, (*length - temp_length) * 2);
break;
case FIFO_DATA_32BIT:
memcpy(dat, &(((uint32 *)fifo->buffer)[fifo->end]), temp_length * 4);
memcpy(&(((uint32 *)dat)[temp_length]), fifo->buffer, (*length - temp_length) * 4);
break;
}
}
if(flag == FIFO_READ_AND_CLEAN) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
{
if(FIFO_CLEAR & fifo->execution)
{
return_state = FIFO_CLEAR_UNDO;
break;
}
fifo->execution |= FIFO_CLEAR;
fifo_end_offset(fifo, *length); // <20>ƶ<EFBFBD> FIFO ͷָ<CDB7><D6B8>
fifo->size += *length;
fifo->execution &= ~FIFO_CLEAR;
}
}while(0);
fifo->execution &= FIFO_READ;
return return_state;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> FIFO β<><CEB2><EFBFBD><EFBFBD>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> buffer
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *dat Ŀ<><EFBFBD><EABBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *length <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> flag <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬ <20><>ѡ<EFBFBD><D1A1><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ն<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// ʹ<><CAB9>ʾ<EFBFBD><CABE> zf_log(fifo_read_tail_buffer(&fifo, data, &length, FIFO_READ_ONLY) == FIFO_SUCCESS, "fifo_read_buffer error");
// <20><>ע<EFBFBD><D7A2>Ϣ <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> FIFO_READ_AND_CLEAN <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E1B6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> FIFO_READ_AND_CLEAN <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E1B6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> FIFO_READ_AND_CLEAN <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E1B6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_read_tail_buffer (fifo_struct *fifo, void *dat, uint32 *length, fifo_operation_enum flag)
{
zf_assert(fifo != NULL);
zf_assert(length != NULL);
fifo_state_enum return_state = FIFO_SUCCESS;
uint32 temp_length;
uint32 fifo_data_length;
do
{
if(NULL == dat)
{
return_state = FIFO_BUFFER_NULL;
break;
}
fifo->execution |= FIFO_READ;
fifo_data_length = fifo_used(fifo);
if(*length > fifo_data_length)
{
*length = fifo_data_length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
return_state = FIFO_DATA_NO_ENOUGH; // <20><>־<EFBFBD><D6BE><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
}
if((fifo->head > fifo->end) || (fifo->head >= *length))
{
switch(fifo->type)
{
case FIFO_DATA_8BIT:
memcpy(dat, &(((uint8 *)fifo->buffer)[fifo->head - *length]), *length);
break;
case FIFO_DATA_16BIT:
memcpy(dat, &(((uint16 *)fifo->buffer)[fifo->head - *length]), *length * 2);
break;
case FIFO_DATA_32BIT:
memcpy(dat, &(((uint32 *)fifo->buffer)[fifo->head - *length]), *length * 4);
break;
}
}
else
{
temp_length = *length - fifo->head; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
switch(fifo->type)
{
case FIFO_DATA_8BIT:
memcpy(dat, &(((uint8 *)fifo->buffer)[fifo->max - temp_length]), temp_length);
memcpy(&(((uint8 *)dat)[temp_length]), &(((uint8 *)fifo->buffer)[fifo->head - *length]), (*length - temp_length));
break;
case FIFO_DATA_16BIT:
memcpy(dat, &(((uint16 *)fifo->buffer)[fifo->max - temp_length]), temp_length * 2);
memcpy(&(((uint16 *)dat)[temp_length]), &(((uint16 *)fifo->buffer)[fifo->head - *length]), (*length - temp_length) * 2);
break;
case FIFO_DATA_32BIT:
memcpy(dat, &(((uint32 *)fifo->buffer)[fifo->max - temp_length]), temp_length * 4);
memcpy(&(((uint32 *)dat)[temp_length]), &(((uint32 *)fifo->buffer)[fifo->head - *length]), (*length - temp_length) * 4);
break;
}
}
if(flag == FIFO_READ_AND_CLEAN) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
{
if(FIFO_CLEAR & fifo->execution)
{
return_state = FIFO_CLEAR_UNDO;
break;
}
fifo->execution |= FIFO_CLEAR;
fifo_end_offset(fifo, (fifo->max - fifo->size));
fifo->size = fifo->max;
fifo->execution &= ~FIFO_CLEAR;
}
}while(0);
fifo->execution &= FIFO_READ;
return return_state;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO <20><>ʼ<EFBFBD><CABC> <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> type FIFO <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *buffer_addr Ҫ<><D2AA><EFBFBD>صĻ<D8B5><C4BB><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// ʹ<><CAB9>ʾ<EFBFBD><CABE> fifo_init(&user_fifo, user_buffer, 64);
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_init (fifo_struct *fifo, fifo_data_type_enum type, void *buffer_addr, uint32 size)
{
zf_assert(fifo != NULL);
fifo_state_enum return_value = FIFO_SUCCESS;
do
{
if(NULL == buffer_addr)
{
return_value = FIFO_BUFFER_NULL;
break;
}
fifo->buffer = buffer_addr;
fifo->execution = FIFO_IDLE;
fifo->type = type;
fifo->head = 0;
fifo->end = 0;
fifo->size = size;
fifo->max = size;
}while(0);
return return_value;
}