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"
|
2024-06-30 16:29:24 +08:00
|
|
|
|
|
2023-12-11 21:45:06 +08:00
|
|
|
|
#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)
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
zf_assert(NULL != fifo);
|
|
|
|
|
|
fifo_state_enum return_state = FIFO_SUCCESS; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
do
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
// if(FIFO_IDLE != fifo->execution) // <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>ǰ FIFO <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// {
|
|
|
|
|
|
// return_state = FIFO_RESET_UNDO; // <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
|
|
|
|
|
|
// break;
|
|
|
|
|
|
// }
|
|
|
|
|
|
fifo->execution |= FIFO_RESET; // <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>λ
|
|
|
|
|
|
fifo->head = 0; // <20><><EFBFBD><EFBFBD> FIFO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>λ
|
|
|
|
|
|
fifo->end = 0; // <20><><EFBFBD><EFBFBD> FIFO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>λ
|
|
|
|
|
|
fifo->size = fifo->max; // <20><><EFBFBD><EFBFBD> FIFO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
switch(fifo->type)
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
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;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo->execution = FIFO_IDLE; // <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}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);
|
2024-06-30 16:29:24 +08:00
|
|
|
|
return (fifo->max - fifo->size); // <20><><EFBFBD>ص<EFBFBD>ǰ FIFO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <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)
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
zf_assert(NULL != fifo);
|
|
|
|
|
|
fifo_state_enum return_state = FIFO_SUCCESS; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
if((FIFO_RESET | FIFO_WRITE) & fifo->execution) // <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ <20><><EFBFBD><EFBFBD>д<EFBFBD>뾺<EFBFBD><EBBEBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
return_state = FIFO_WRITE_UNDO; // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo->execution |= FIFO_WRITE; // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
|
|
|
|
|
|
if(1 <= fifo->size) // ʣ<><CAA3><EFBFBD>ռ<EFBFBD><D5BC>㹻װ<E3B9BB>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
switch(fifo->type)
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
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;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
fifo_head_offset(fifo, 1); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
|
|
|
|
|
|
fifo->size -= 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD>ȼ<EFBFBD>С
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
return_state = FIFO_SPACE_NO_ENOUGH; // <20><>ǰ FIFO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ؿռ䲻<D5BC><E4B2BB>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo->execution &= ~FIFO_WRITE; // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}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)
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
zf_assert(NULL != fifo);
|
|
|
|
|
|
fifo_state_enum return_state = FIFO_SUCCESS; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
uint32 temp_length = 0;
|
|
|
|
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
{
|
|
|
|
|
|
if(NULL == dat)
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
return_state = FIFO_BUFFER_NULL; // <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
2023-12-11 21:45:06 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
if((FIFO_RESET | FIFO_WRITE) & fifo->execution) // <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ <20><><EFBFBD><EFBFBD>д<EFBFBD>뾺<EFBFBD><EBBEBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
return_state = FIFO_WRITE_UNDO; // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo->execution |= FIFO_WRITE; // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
|
2024-06-30 16:29:24 +08:00
|
|
|
|
if(length <= fifo->size) // ʣ<><CAA3><EFBFBD>ռ<EFBFBD><D5BC>㹻װ<E3B9BB>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
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:
|
2024-06-30 16:29:24 +08:00
|
|
|
|
{
|
2023-12-11 21:45:06 +08:00
|
|
|
|
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>
|
2024-06-30 16:29:24 +08:00
|
|
|
|
}break;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
case FIFO_DATA_16BIT:
|
2024-06-30 16:29:24 +08:00
|
|
|
|
{
|
2023-12-11 21:45:06 +08:00
|
|
|
|
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>
|
2024-06-30 16:29:24 +08:00
|
|
|
|
}break;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
case FIFO_DATA_32BIT:
|
2024-06-30 16:29:24 +08:00
|
|
|
|
{
|
2023-12-11 21:45:06 +08:00
|
|
|
|
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>
|
2024-06-30 16:29:24 +08:00
|
|
|
|
}break;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
switch(fifo->type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case FIFO_DATA_8BIT:
|
2024-06-30 16:29:24 +08:00
|
|
|
|
{
|
2023-12-11 21:45:06 +08:00
|
|
|
|
memcpy(
|
|
|
|
|
|
&(((uint8 *)fifo->buffer)[fifo->head]),
|
|
|
|
|
|
dat, length); // һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
|
|
|
|
|
|
fifo_head_offset(fifo, length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
|
2024-06-30 16:29:24 +08:00
|
|
|
|
}break;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
case FIFO_DATA_16BIT:
|
2024-06-30 16:29:24 +08:00
|
|
|
|
{
|
2023-12-11 21:45:06 +08:00
|
|
|
|
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>
|
2024-06-30 16:29:24 +08:00
|
|
|
|
}break;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
case FIFO_DATA_32BIT:
|
2024-06-30 16:29:24 +08:00
|
|
|
|
{
|
2023-12-11 21:45:06 +08:00
|
|
|
|
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>
|
2024-06-30 16:29:24 +08:00
|
|
|
|
}break;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fifo->size -= length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD>ȼ<EFBFBD>С
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
return_state = FIFO_SPACE_NO_ENOUGH; // <20><>ǰ FIFO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ؿռ䲻<D5BC><E4B2BB>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo->execution &= ~FIFO_WRITE; // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}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)
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
zf_assert(NULL != fifo);
|
|
|
|
|
|
fifo_state_enum return_state = FIFO_SUCCESS; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
{
|
|
|
|
|
|
if(NULL == dat)
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
return_state = FIFO_BUFFER_NULL; // <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
else
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
if((FIFO_RESET | FIFO_CLEAR) & fifo->execution) // <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>ǰ FIFO <20>Ƿ<EFBFBD><C7B7><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
return_state = FIFO_READ_UNDO; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
break;
|
2024-06-30 16:29:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(1 > fifo_used(fifo))
|
|
|
|
|
|
{
|
|
|
|
|
|
return_state = FIFO_DATA_NO_ENOUGH; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>Ȳ<EFBFBD><C8B2><EFBFBD>
|
|
|
|
|
|
break; // ֱ<><D6B1><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fifo->execution |= FIFO_READ; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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;
|
|
|
|
|
|
}
|
|
|
|
|
|
fifo->execution &= ~FIFO_READ; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-30 16:29:24 +08:00
|
|
|
|
if(FIFO_READ_AND_CLEAN == flag) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
if((FIFO_RESET | FIFO_CLEAR | FIFO_READ) == fifo->execution) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȡ ״̬ <20><><EFBFBD><EFBFBD><EFBFBD>쳣
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
return_state = FIFO_CLEAR_UNDO; // <20><><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo->execution |= FIFO_CLEAR; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
fifo_end_offset(fifo, 1); // <20>ƶ<EFBFBD> FIFO ͷָ<CDB7><D6B8>
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo->size += 1; // <20>ͷŶ<CDB7>Ӧ<EFBFBD><D3A6><EFBFBD>ȿռ<C8BF>
|
|
|
|
|
|
fifo->execution &= ~FIFO_CLEAR; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
}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> *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)
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
zf_assert(NULL != fifo);
|
|
|
|
|
|
zf_assert(NULL != length);
|
|
|
|
|
|
fifo_state_enum return_state = FIFO_SUCCESS; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
|
uint32 temp_length = 0;
|
|
|
|
|
|
uint32 fifo_data_length = 0;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
{
|
|
|
|
|
|
if(NULL == dat)
|
|
|
|
|
|
{
|
|
|
|
|
|
return_state = FIFO_BUFFER_NULL;
|
|
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
else
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
if((FIFO_RESET | FIFO_CLEAR) & fifo->execution) // <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>ǰ FIFO <20>Ƿ<EFBFBD><C7B7><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
*length = fifo_data_length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
|
|
|
|
|
|
return_state = FIFO_READ_UNDO; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2023-12-11 21:45:06 +08:00
|
|
|
|
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo_data_length = fifo_used(fifo); // <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
|
|
|
|
|
|
if(*length > fifo_data_length) // <20>жϳ<D0B6><CFB3><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>㹻
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
*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(0 == fifo_data_length) // <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
fifo->execution &= ~FIFO_READ; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
break;
|
2024-06-30 16:29:24 +08:00
|
|
|
|
}
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
|
|
|
|
|
|
fifo->execution |= FIFO_READ; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo->execution &= ~FIFO_READ; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-30 16:29:24 +08:00
|
|
|
|
if(FIFO_READ_AND_CLEAN == flag) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
if((FIFO_RESET | FIFO_CLEAR | FIFO_READ) == fifo->execution) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȡ ״̬ <20><><EFBFBD><EFBFBD><EFBFBD>쳣
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
return_state = FIFO_CLEAR_UNDO; // <20><><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo->execution |= FIFO_CLEAR; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
fifo_end_offset(fifo, *length); // <20>ƶ<EFBFBD> FIFO ͷָ<CDB7><D6B8>
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo->size += *length; // <20>ͷŶ<CDB7>Ӧ<EFBFBD><D3A6><EFBFBD>ȿռ<C8BF>
|
|
|
|
|
|
fifo->execution &= ~FIFO_CLEAR; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
}while(0);
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
zf_assert(NULL != fifo);
|
|
|
|
|
|
zf_assert(NULL != length);
|
|
|
|
|
|
fifo_state_enum return_state = FIFO_SUCCESS; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
|
uint32 temp_length = 0;
|
|
|
|
|
|
uint32 fifo_data_length = 0;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
{
|
|
|
|
|
|
if(NULL == dat)
|
|
|
|
|
|
{
|
|
|
|
|
|
return_state = FIFO_BUFFER_NULL;
|
|
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
else
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
if((FIFO_RESET | FIFO_CLEAR | FIFO_WRITE) & fifo->execution) // <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>ǰ FIFO <20>Ƿ<EFBFBD><C7B7><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
*length = fifo_data_length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
|
|
|
|
|
|
return_state = FIFO_READ_UNDO; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2023-12-11 21:45:06 +08:00
|
|
|
|
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo_data_length = fifo_used(fifo); // <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
|
|
|
|
|
|
if(*length > fifo_data_length) // <20>жϳ<D0B6><CFB3><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>㹻
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
*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(0 == fifo_data_length) // <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
fifo->execution &= ~FIFO_READ; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
break;
|
2024-06-30 16:29:24 +08:00
|
|
|
|
}
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
|
|
|
|
|
|
fifo->execution |= FIFO_READ; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
|
|
|
|
|
if((fifo->head > fifo->end) || (fifo->head >= *length))
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo->execution &= ~FIFO_READ; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-30 16:29:24 +08:00
|
|
|
|
if(FIFO_READ_AND_CLEAN == flag) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
if((FIFO_RESET | FIFO_CLEAR | FIFO_READ) == fifo->execution) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȡ ״̬ <20><><EFBFBD><EFBFBD><EFBFBD>쳣
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
return_state = FIFO_CLEAR_UNDO; // <20><><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo_clear(fifo);
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
}while(0);
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
zf_assert(NULL != fifo);
|
|
|
|
|
|
fifo_state_enum return_state = FIFO_SUCCESS;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
do
|
|
|
|
|
|
{
|
2024-06-30 16:29:24 +08:00
|
|
|
|
fifo->buffer = buffer_addr;
|
|
|
|
|
|
fifo->execution = FIFO_IDLE;
|
|
|
|
|
|
fifo->type = type;
|
|
|
|
|
|
fifo->head = 0;
|
|
|
|
|
|
fifo->end = 0;
|
|
|
|
|
|
fifo->size = size;
|
|
|
|
|
|
fifo->max = size;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}while(0);
|
2024-06-30 16:29:24 +08:00
|
|
|
|
return return_state;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|