diff options
author | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2012-02-12 22:29:50 +0100 |
---|---|---|
committer | Peter Stuge <peter@stuge.se> | 2012-07-06 14:58:25 +0000 |
commit | 6d639b09f0e3ef0c1cc38606a851e6ae9a4f4e30 (patch) | |
tree | aa7993fc4fdd0a470721138883654606fa83ab47 /src/helper/binarybuffer.h | |
parent | edf0c3376d5394bc05b1028c5a17c19e17657dcb (diff) | |
download | riscv-openocd-6d639b09f0e3ef0c1cc38606a851e6ae9a4f4e30.zip riscv-openocd-6d639b09f0e3ef0c1cc38606a851e6ae9a4f4e30.tar.gz riscv-openocd-6d639b09f0e3ef0c1cc38606a851e6ae9a4f4e30.tar.bz2 |
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>
Diffstat (limited to 'src/helper/binarybuffer.h')
-rw-r--r-- | src/helper/binarybuffer.h | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/src/helper/binarybuffer.h b/src/helper/binarybuffer.h index 6b142dd..cc0be57 100644 --- a/src/helper/binarybuffer.h +++ b/src/helper/binarybuffer.h @@ -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 */ |