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