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