source: svn/newcon3bcm2_21bu/BSEAV/lib/utils/bfifo.h @ 46

Last change on this file since 46 was 46, checked in by megakiss, 11 years ago

459Mhz로 OTC 주파수 변경

  • Property svn:executable set to *
File size: 4.8 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2005-2007, Broadcom Corporation
3 *     All Rights Reserved
4 *     Confidential Property of Broadcom Corporation
5 *
6 *  THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE
7 *  AGREEMENT  BETWEEN THE USER AND BROADCOM.  YOU HAVE NO RIGHT TO USE OR
8 *  EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT.
9 *
10 * $brcm_Workfile: bfifo.h $
11 * $brcm_Revision: 4 $
12 * $brcm_Date: 6/4/07 12:34p $
13 *
14 * Module Description:
15 *
16 * Utility to manage circular FIFO
17 *
18 * Revision History:
19 *
20 * $brcm_Log: /BSEAV/lib/utils/bfifo.h $
21 *
22 * 4   6/4/07 12:34p jjordan
23 * PR30200: fix warning
24 *
25 * 3   3/29/06 2:49p vsilyaev
26 * PR 20308: Added type safe FIFO module
27 *
28 * 2   3/31/05 10:33p vsilyaev
29 * PR 14673: Added field description.
30 *
31 * 1   2/18/05 7:25p vsilyaev
32 * PR13158: Generic FIFO library
33 *
34 *******************************************************************************/
35#ifndef BFIFO_H__
36#define BFIFO_H__
37
38typedef struct bfifo bfifo;
39
40/* this function initialized FIFO */
41void bfifo_init(bfifo *fifo, void *base, size_t size);
42
43/* this function returns size of continous space aliable for write operation */
44void *bfifo_write_peek(bfifo *fifo, size_t *size);
45
46/* this function advances write pointer */
47void bfifo_write_commit(bfifo *fifo, size_t size);
48
49/* this function returns size of continous space aliable for read operation */
50void *bfifo_read_peek(bfifo *fifo, size_t *size);
51
52/* this function advances read pointer */
53void bfifo_read_commit(bfifo *fifo, size_t size);
54
55/* this structure shall not be ever used directly, all access to the FIFO's should go thru the function above */
56struct bfifo {
57        void *base; /* FIFO's start address */
58        void *last; /* FIFO's end address */
59        void *read_ptr; 
60        void *write_ptr;
61        unsigned read_cnt; /* wraparound counter for the read pointer */
62        unsigned write_cnt; /* wraparound counter for the write pointer */
63};
64
65#define BFIFO_HEAD(name, type) struct name { type *bf_base; type *bf_last; type *bf_read; type *bf_write; int bf_wrap; }
66
67#define BFIFO_INIT(fifo, base, size) do {(fifo)->bf_wrap=0; \
68        (fifo)->bf_base=(fifo)->bf_read=(fifo)->bf_write=(base);\
69        (fifo)->bf_last=(fifo)->bf_base+(size);}while(0)
70
71#define BFIFO_WRITE(fifo) (fifo)->bf_write
72#define BFIFO_READ(fifo) (fifo)->bf_read
73
74#define BFIFO_WRITE_PEEK(fifo) \
75        /* |====W---R===| */ ((unsigned)(((fifo)->bf_write < (fifo)->bf_read) ? (fifo)->bf_read - (fifo)->bf_write : ( \
76        /* |---R===W---| */ ((fifo)->bf_write > (fifo)->bf_read) ? (fifo)->bf_last - (fifo)->bf_write  : ( \
77        /* |---RW---| */ (fifo)->bf_wrap ? 0 : (fifo)->bf_last - (fifo)->bf_write))))
78
79#define BFIFO_READ_PEEK(fifo) \
80        /* |====W---R===| */ ((unsigned)(((fifo)->bf_write < (fifo)->bf_read) ? (fifo)->bf_last - (fifo)->bf_read : ( \
81        /* |---R===W---| */ ((fifo)->bf_write > (fifo)->bf_read) ? (fifo)->bf_write - (fifo)->bf_read : ( \
82        /* |---RW---| */ (fifo)->bf_wrap ? (fifo)->bf_last - (fifo)->bf_read:0))))
83
84#define BFIFO_WRITE_COMMIT(fifo, size) do { \
85        BDBG_ASSERT((size)>0 && BFIFO_WRITE_PEEK(fifo) >= (size));  \
86        (fifo)->bf_write += (size); \
87        if ((fifo)->bf_write >= (fifo)->bf_last) {(fifo)->bf_write = (fifo)->bf_base;(fifo)->bf_wrap++;}  \
88        } while(0)
89
90#define BFIFO_READ_COMMIT(fifo, size) do { \
91        BDBG_ASSERT(BFIFO_READ_PEEK(fifo) >= (unsigned)(size)); \
92        (fifo)->bf_read += (size); \
93        if ((fifo)->bf_read >= (fifo)->bf_last) {(fifo)->bf_read = (fifo)->bf_base;(fifo)->bf_wrap--;}  \
94        } while(0)
95
96#define BFIFO_WRITE_LEFT(fifo)  \
97        /* |====W---R===| */ (((fifo)->bf_write < (fifo)->bf_read) ? (fifo)->bf_read - (fifo)->bf_write : ( \
98        /* |---R===W---| */ ((fifo)->bf_write > (fifo)->bf_read) ? ((fifo)->bf_read - (fifo)->bf_base) + ((fifo)->bf_last - (fifo)->bf_write)  : ( \
99        /* |---RW---| */ (fifo)->bf_wrap ? 0 : (fifo)->bf_last - (fifo)->bf_base)))
100
101#define BFIFO_READ_LEFT(fifo) \
102        /* |====W---R===| */ (((fifo)->bf_write < (fifo)->bf_read) ? ((fifo)->bf_write - (fifo)->bf_base) + (fifo)->bf_last - (fifo)->bf_read : ( \
103        /* |---R===W---| */ ((fifo)->bf_write > (fifo)->bf_read) ? (fifo)->bf_write - (fifo)->bf_read : ( \
104        /* |---RW---| */ (fifo)->bf_wrap ? (fifo)->bf_last - (fifo)->bf_base:0)))
105
106#define BFIFO_VALIDATE(fifo) do { \
107                BDBG_ASSERT((fifo)->bf_wrap==0 || (fifo)->bf_wrap==1); \
108                BDBG_ASSERT((fifo)->bf_read>=(fifo)->bf_base && (fifo)->bf_read<(fifo)->bf_last); \
109                BDBG_ASSERT((fifo)->bf_write>=(fifo)->bf_base && (fifo)->bf_write<(fifo)->bf_last); \
110        } while(0)
111
112#define BFIFO_STATUS(DBG, header,fifo)  DBG((header ":(%#lx:%#lx) write (%u/%u/%#lx), read (%u/%u/%#lx)", (unsigned long)(fifo)->bf_base, (unsigned long)(fifo)->bf_last, BFIFO_WRITE_PEEK(fifo), BFIFO_WRITE_LEFT(fifo), (unsigned long)BFIFO_WRITE(fifo), BFIFO_READ_PEEK(fifo), BFIFO_READ_LEFT(fifo), (unsigned long)BFIFO_READ(fifo)))
113
114
115#endif /* BFIFO_H__ */
116
117
Note: See TracBrowser for help on using the repository browser.