@@ -377,4 +377,98 @@ uint32_t chry_ringbuffer_drop(chry_ringbuffer_t *rb, uint32_t size)
377377
378378 rb -> out += size ;
379379 return size ;
380- }
380+ }
381+
382+ /*****************************************************************************
383+ * @brief linear write setup, get write pointer and max linear size.
384+ *
385+ * @param[in] rb ringbuffer instance
386+ * @param[in] size pointer to store max linear size in byte
387+ *
388+ * @retval void* write memory pointer
389+ *****************************************************************************/
390+ void * chry_ringbuffer_linear_write_setup (chry_ringbuffer_t * rb , uint32_t * size )
391+ {
392+ uint32_t unused ;
393+ uint32_t offset ;
394+ uint32_t remain ;
395+
396+ unused = (rb -> mask + 1 ) - (rb -> in - rb -> out );
397+
398+ offset = rb -> in & rb -> mask ;
399+
400+ remain = rb -> mask + 1 - offset ;
401+ remain = remain > unused ? unused : remain ;
402+
403+ if (remain ) {
404+ * size = remain ;
405+ return ((uint8_t * )(rb -> pool )) + offset ;
406+ } else {
407+ * size = unused - remain ;
408+ return rb -> pool ;
409+ }
410+ }
411+
412+ /*****************************************************************************
413+ * @brief linear read setup, get read pointer and max linear size.
414+ *
415+ * @param[in] rb ringbuffer instance
416+ * @param[in] size pointer to store max linear size in byte
417+ *
418+ * @retval void*
419+ *****************************************************************************/
420+ void * chry_ringbuffer_linear_read_setup (chry_ringbuffer_t * rb , uint32_t * size )
421+ {
422+ uint32_t used ;
423+ uint32_t offset ;
424+ uint32_t remain ;
425+
426+ used = rb -> in - rb -> out ;
427+
428+ offset = rb -> out & rb -> mask ;
429+
430+ remain = rb -> mask + 1 - offset ;
431+ remain = remain > used ? used : remain ;
432+
433+ if (remain ) {
434+ * size = remain ;
435+ return ((uint8_t * )(rb -> pool )) + offset ;
436+ } else {
437+ * size = used - remain ;
438+ return rb -> pool ;
439+ }
440+ }
441+
442+ /*****************************************************************************
443+ * @brief linear write done, add write pointer only
444+ *
445+ * @param[in] rb ringbuffer instance
446+ * @param[in] size write size in byte
447+ *
448+ * @retval uint32_t actual write size in byte
449+ *****************************************************************************/
450+ uint32_t chry_ringbuffer_linear_write_done (chry_ringbuffer_t * rb , uint32_t size )
451+ {
452+ uint32_t unused ;
453+
454+ unused = (rb -> mask + 1 ) - (rb -> in - rb -> out );
455+ if (size > unused ) {
456+ size = unused ;
457+ }
458+ rb -> in += size ;
459+
460+ return size ;
461+ }
462+
463+ /*****************************************************************************
464+ * @brief linear read done, add read pointer only
465+ *
466+ * @param[in] rb ringbuffer instance
467+ * @param[in] size read size in byte
468+ *
469+ * @retval uint32_t actual read size in byte
470+ *****************************************************************************/
471+ uint32_t chry_ringbuffer_linear_read_done (chry_ringbuffer_t * rb , uint32_t size )
472+ {
473+ return chry_ringbuffer_drop (rb , size );
474+ }
0 commit comments