source: svn/newcon3bcm2_21bu/BSEAV/lib/utils/bfifo.c

Last change on this file was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 3.4 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2005, 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.c $
11 * $brcm_Revision: 1 $
12 * $brcm_Date: 2/18/05 7:25p $
13 *
14 * Module Description:
15 *
16 * Utility to manage circular FIFO
17 *
18 * Revision History:
19 *
20 * $brcm_Log: /BSEAV/lib/utils/bfifo.c $
21 *
22 * 1   2/18/05 7:25p vsilyaev
23 * PR13158: Generic FIFO library
24 *
25 *******************************************************************************/
26
27#include "bstd.h"
28#include "bfifo.h"
29
30BDBG_MODULE(bfifo);
31
32void
33bfifo_init(bfifo *fifo, void *base, size_t size)
34{
35        fifo->base = base;
36        fifo->last= (uint8_t*)base + size;
37        fifo->read_ptr = fifo->write_ptr = base;
38        fifo->read_cnt = fifo->write_cnt = 0;
39        return;
40}
41
42void *
43bfifo_write_peek(bfifo *fifo, size_t *size)
44{
45        if (fifo->write_cnt > fifo->read_cnt && fifo->read_ptr == fifo->write_ptr) {
46                *size = 0;
47                BDBG_MSG(("write_peek W:%#x R:%#x %u",  (unsigned)fifo->write_ptr, (unsigned)fifo->read_ptr, *size));
48                return NULL; /* no space avaliable */
49        }
50        /* |====W---R===| */
51        if (fifo->write_ptr < fifo->read_ptr) {
52                *size = (uint8_t *)fifo->read_ptr - (uint8_t *)fifo->write_ptr;
53                BDBG_MSG(("write_peek W:%#x R:%#x %u",  (unsigned)fifo->write_ptr, (unsigned)fifo->read_ptr, *size));
54                return fifo->write_ptr;
55        } else {
56        /* |---R===W---| */
57                *size = (uint8_t *)fifo->last - (uint8_t *)fifo->write_ptr;
58                BDBG_MSG(("write_peek R:%#x W:%#x L:%#x %u",  (unsigned)fifo->read_ptr, (unsigned)fifo->write_ptr, (unsigned)fifo->last, *size));
59                return fifo->write_ptr;
60        }
61}
62
63void
64bfifo_write_commit(bfifo *fifo, size_t size)
65{
66        size_t test_size;
67        BSTD_UNUSED(test_size);
68
69        BDBG_MSG(("write_commit %u", size));
70        BDBG_ASSERT(bfifo_write_peek(fifo, &test_size)!=NULL);
71        BDBG_ASSERT(test_size >= size);
72
73        fifo->write_ptr = (uint8_t *)fifo->write_ptr + size;
74        if ((uint8_t *)fifo->write_ptr == fifo->last) {
75                fifo->write_ptr = fifo->base;
76                fifo->write_cnt ++;
77        }
78        return;
79}
80
81void *
82bfifo_read_peek(bfifo *fifo, size_t *size)
83{
84        if (fifo->write_cnt == fifo->read_cnt && fifo->read_ptr == fifo->write_ptr) {
85                *size = 0;
86                BDBG_MSG(("read_peek R:%#x W:%#x %u", (unsigned)fifo->read_ptr,  (unsigned)fifo->write_ptr, *size));
87                return NULL; /* no data avaliable */
88        }
89        /* |====W---R===| */
90        if (fifo->write_ptr <= fifo->read_ptr) {
91                *size = (uint8_t *)fifo->last - (uint8_t *)fifo->read_ptr;
92                BDBG_MSG(("read_peek W:%#x R:%#x L:%x %u",  (unsigned)fifo->write_ptr, (unsigned)fifo->read_ptr, (unsigned)fifo->last, *size));
93                return fifo->write_ptr;
94        } else {
95        /* |---R===W---| */
96                *size =  (uint8_t *)fifo->write_ptr - (uint8_t *)fifo->read_ptr;
97                BDBG_MSG(("read_peek R:%#x W:%#x %u", (unsigned)fifo->read_ptr,  (unsigned)fifo->write_ptr, *size));
98                return fifo->write_ptr;
99        }
100}
101
102void
103bfifo_read_commit(bfifo *fifo, size_t size)
104{
105        size_t test_size;
106        BSTD_UNUSED(test_size);
107
108        BDBG_MSG(("read_commit %u", size));
109
110        BDBG_ASSERT(bfifo_read_peek(fifo, &test_size)!=NULL);
111        BDBG_ASSERT(test_size >= size);
112
113        fifo->read_ptr = (uint8_t *)fifo->read_ptr + size;
114        if (fifo->read_ptr == fifo->last) {
115                fifo->read_ptr = fifo->base;
116                fifo->read_cnt ++;
117        }
118        return;
119}
120
121
Note: See TracBrowser for help on using the repository browser.