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