Skip to content

Commit 91b41e0

Browse files
committed
[feat] add linear r/w setup done api, for dma use
1 parent 1ac330c commit 91b41e0

File tree

4 files changed

+151
-4
lines changed

4 files changed

+151
-4
lines changed

README.md

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,5 +178,29 @@ void thread_consumer(void* param)
178178
*/
179179
chry_ringbuffer_drop(&rb, 1);
180180

181-
181+
void *pdata;
182+
uint32_t size;
183+
184+
/**
185+
* For dma start, get read memory address and max linear read size
186+
*/
187+
pdata = chry_ringbuffer_linear_read_setup(&rb, &size);
188+
189+
/**
190+
* For dma done, add read pointer
191+
* Returns the length of the actual add
192+
*/
193+
size = chry_ringbuffer_linear_read_done(&rb, 512);
194+
195+
/**
196+
* For dma start, get write memory address and max linear write size
197+
*/
198+
pdata = chry_ringbuffer_linear_write_setup(&rb, &size);
199+
200+
/**
201+
* For dma done, add write pointer
202+
* Returns the length of the actual add
203+
*/
204+
size = chry_ringbuffer_linear_write_done(&rb, 512);
205+
182206
```

README_zh.md

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,5 +172,29 @@ void thread_consumer(void* param)
172172
*/
173173
chry_ringbuffer_drop(&rb, 1);
174174

175-
175+
void *pdata;
176+
uint32_t size;
177+
178+
/**
179+
* 用于启动DMA,获取读取起始内存地址和最大线性可读取长度
180+
*/
181+
pdata = chry_ringbuffer_linear_read_setup(&rb, &size);
182+
183+
/**
184+
* 用于DMA完成,增加读指针
185+
* 返回实际增加长度
186+
*/
187+
size = chry_ringbuffer_linear_read_done(&rb, 512);
188+
189+
/**
190+
* 用于启动DMA,获取写入起始内存地址和最大线性可写入长度
191+
*/
192+
pdata = chry_ringbuffer_linear_write_setup(&rb, &size);
193+
194+
/**
195+
* 用于DMA完成,增加写指针
196+
* 返回实际增加长度
197+
*/
198+
size = chry_ringbuffer_linear_write_done(&rb, 512);
199+
176200
```

chry_ringbuffer.c

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
}

chry_ringbuffer.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,13 @@ extern uint32_t chry_ringbuffer_peek(chry_ringbuffer_t *rb, void *data, uint32_t
4444
extern uint32_t chry_ringbuffer_read(chry_ringbuffer_t *rb, void *data, uint32_t size);
4545
extern uint32_t chry_ringbuffer_drop(chry_ringbuffer_t *rb, uint32_t size);
4646

47+
extern void *chry_ringbuffer_linear_write_setup(chry_ringbuffer_t *rb, uint32_t *size);
48+
extern void *chry_ringbuffer_linear_read_setup(chry_ringbuffer_t *rb, uint32_t *size);
49+
extern uint32_t chry_ringbuffer_linear_write_done(chry_ringbuffer_t *rb, uint32_t size);
50+
extern uint32_t chry_ringbuffer_linear_read_done(chry_ringbuffer_t *rb, uint32_t size);
51+
4752
#ifdef __cplusplus
4853
}
4954
#endif
5055

51-
#endif
56+
#endif

0 commit comments

Comments
 (0)