forked from auracaster/openocd
Add a bit-level transfer queue
Interface drivers regularly need to keep track of where each part of a long read buffer should be copied, once that data arrives. Both source and destination are often at an arbitrary bit offset. This queued bit-level copy can help with that, by allowing the driver to perform postponed reads from the receive buffer already when building the transmit buffer, and have those reads executed at a later time when data is available. For simplicity, it uses the linked list implementation list.h imported from the Linux kernel. Change-Id: I06862a0a6f057cbbcacfb021f17a795195faded2 Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com> Reviewed-on: http://openocd.zylin.com/450 Tested-by: jenkins Reviewed-by: Xiaofan <xiaofanc@gmail.com> Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com> Reviewed-by: Peter Stuge <peter@stuge.se>
This commit is contained in:
committed by
Peter Stuge
parent
edf0c3376d
commit
6d639b09f0
@@ -24,6 +24,8 @@
|
||||
#ifndef BINARYBUFFER_H
|
||||
#define BINARYBUFFER_H
|
||||
|
||||
#include "list.h"
|
||||
|
||||
/** @file
|
||||
* Support functions to access arbitrary bits in a byte array
|
||||
*/
|
||||
@@ -129,4 +131,29 @@ static inline uint32_t fast_target_buffer_get_u32(const void *p, bool le)
|
||||
return le ? le_to_h_u32(p) : be_to_h_u32(p);
|
||||
}
|
||||
|
||||
#endif /* BINARYBUFFER_H */
|
||||
static inline void bit_copy(uint8_t *dst, unsigned dst_offset, const uint8_t *src,
|
||||
unsigned src_offset, unsigned bit_count)
|
||||
{
|
||||
buf_set_buf(src, src_offset, dst, dst_offset, bit_count);
|
||||
}
|
||||
|
||||
struct bit_copy_queue {
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
struct bit_copy_queue_entry {
|
||||
uint8_t *dst;
|
||||
unsigned dst_offset;
|
||||
const uint8_t *src;
|
||||
unsigned src_offset;
|
||||
unsigned bit_count;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
void bit_copy_queue_init(struct bit_copy_queue *q);
|
||||
int bit_copy_queued(struct bit_copy_queue *q, uint8_t *dst, unsigned dst_offset, const uint8_t *src,
|
||||
unsigned src_offset, unsigned bit_count);
|
||||
void bit_copy_execute(struct bit_copy_queue *q);
|
||||
void bit_copy_discard(struct bit_copy_queue *q);
|
||||
|
||||
#endif /* BINARYBUFFER_H */
|
||||
|
||||
Reference in New Issue
Block a user