xref: /nrf52832-nimble/rt-thread/components/drivers/include/ipc/ringblk_buf.h (revision 104654410c56c573564690304ae786df310c91fc)
1 /*
2  * Copyright (c) 2006-2018, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2018-08-25     armink       the first version
9  */
10 
11 #ifndef _RINGBLK_BUF_H_
12 #define _RINGBLK_BUF_H_
13 
14 /*
15  * Introduction:
16  * The rbb is the ring buffer which is composed with many blocks. It is different from the ring buffer.
17  * The ring buffer is only composed with chars. The rbb put and get supported zero copies. So the rbb
18  * is very suitable for put block and get block by a certain order. Such as DMA block transmit,
19  * communicate frame send/recv, and so on.
20  */
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25 
26 enum rt_rbb_status
27 {
28     /* unused status when first initialize or after blk_free() */
29     RT_RBB_BLK_UNUSED,
30     /* initialized status after blk_alloc() */
31     RT_RBB_BLK_INITED,
32     /* put status after blk_put() */
33     RT_RBB_BLK_PUT,
34     /* get status after blk_get() */
35     RT_RBB_BLK_GET,
36 };
37 typedef enum rt_rbb_status rt_rbb_status_t;
38 
39 /**
40  * the block of rbb
41  */
42 struct rt_rbb_blk
43 {
44     rt_rbb_status_t status :8;
45     /* less then 2^24 */
46     rt_size_t size :24;
47     rt_uint8_t *buf;
48     rt_slist_t list;
49 };
50 typedef struct rt_rbb_blk *rt_rbb_blk_t;
51 
52 /**
53  * Rbb block queue: the blocks (from block1->buf to blockn->buf) memory which on this queue is continuous.
54  */
55 struct rt_rbb_blk_queue
56 {
57     rt_rbb_blk_t blocks;
58     rt_size_t blk_num;
59 };
60 typedef struct rt_rbb_blk_queue *rt_rbb_blk_queue_t;
61 
62 /**
63  * ring block buffer
64  */
65 struct rt_rbb
66 {
67     rt_uint8_t *buf;
68     rt_size_t buf_size;
69     /* all of blocks */
70     rt_rbb_blk_t blk_set;
71     rt_size_t blk_max_num;
72     /* saved the initialized and put status blocks */
73     rt_slist_t blk_list;
74 };
75 typedef struct rt_rbb *rt_rbb_t;
76 
77 /* rbb (ring block buffer) API */
78 void rt_rbb_init(rt_rbb_t rbb, rt_uint8_t *buf, rt_size_t buf_size, rt_rbb_blk_t block_set, rt_size_t blk_max_num);
79 rt_rbb_t rt_rbb_create(rt_size_t buf_size, rt_size_t blk_max_num);
80 void rt_rbb_destroy(rt_rbb_t rbb);
81 rt_size_t rt_rbb_get_buf_size(rt_rbb_t rbb);
82 
83 /* rbb block API */
84 rt_rbb_blk_t rt_rbb_blk_alloc(rt_rbb_t rbb, rt_size_t blk_size);
85 void rt_rbb_blk_put(rt_rbb_blk_t block);
86 rt_rbb_blk_t rt_rbb_blk_get(rt_rbb_t rbb);
87 rt_size_t rt_rbb_blk_size(rt_rbb_blk_t block);
88 rt_uint8_t *rt_rbb_blk_buf(rt_rbb_blk_t block);
89 void rt_rbb_blk_free(rt_rbb_t rbb, rt_rbb_blk_t block);
90 
91 /* rbb block queue API */
92 rt_size_t rt_rbb_blk_queue_get(rt_rbb_t rbb, rt_size_t queue_data_len, rt_rbb_blk_queue_t blk_queue);
93 rt_size_t rt_rbb_blk_queue_len(rt_rbb_blk_queue_t blk_queue);
94 rt_uint8_t *rt_rbb_blk_queue_buf(rt_rbb_blk_queue_t blk_queue);
95 void rt_rbb_blk_queue_free(rt_rbb_t rbb, rt_rbb_blk_queue_t blk_queue);
96 rt_size_t rt_rbb_next_blk_queue_len(rt_rbb_t rbb);
97 
98 
99 #ifdef __cplusplus
100 }
101 #endif
102 
103 #endif /* _RINGBLK_BUF_H_ */
104