diff options
author | Mathias K <kesmtp@freenet.de> | 2011-02-02 17:38:38 +0100 |
---|---|---|
committer | Øyvind Harboe <oyvind.harboe@zylin.com> | 2011-02-03 12:23:55 +0100 |
commit | b0bdc4e2f2b4fd31ae3b0ebf47765e88c4c37556 (patch) | |
tree | f0d7ba0d2d7fd04707ef3d06b6b3ffbe97fb8e81 | |
parent | aaf145c42201496007e0fc9168d9738cb0237717 (diff) | |
download | openocd_libswd-b0bdc4e2f2b4fd31ae3b0ebf47765e88c4c37556.tar.gz openocd_libswd-b0bdc4e2f2b4fd31ae3b0ebf47765e88c4c37556.tar.bz2 openocd_libswd-b0bdc4e2f2b4fd31ae3b0ebf47765e88c4c37556.tar.xz openocd_libswd-b0bdc4e2f2b4fd31ae3b0ebf47765e88c4c37556.zip |
24bit buffer support
Hello,
this patch add 24bit support to the target buffer functions and little/big endian functions.
Regards,
Mathias
-rw-r--r-- | src/helper/types.h | 24 | ||||
-rw-r--r-- | src/target/target.c | 18 | ||||
-rw-r--r-- | src/target/target.h | 2 |
3 files changed, 44 insertions, 0 deletions
diff --git a/src/helper/types.h b/src/helper/types.h index 04b00594..12b95150 100644 --- a/src/helper/types.h +++ b/src/helper/types.h @@ -116,6 +116,11 @@ static inline uint32_t le_to_h_u32(const uint8_t* buf) return (uint32_t)(buf[0] | buf[1] << 8 | buf[2] << 16 | buf[3] << 24); } +static inline uint32_t le_to_h_u24(const uint8_t* buf) +{ + return (uint32_t)(buf[0] | buf[1] << 8 | buf[2] << 16); +} + static inline uint16_t le_to_h_u16(const uint8_t* buf) { return (uint16_t)(buf[0] | buf[1] << 8); @@ -126,6 +131,11 @@ static inline uint32_t be_to_h_u32(const uint8_t* buf) return (uint32_t)(buf[3] | buf[2] << 8 | buf[1] << 16 | buf[0] << 24); } +static inline uint32_t be_to_h_u24(const uint8_t* buf) +{ + return (uint32_t)(buf[2] | buf[1] << 8 | buf[0] << 16); +} + static inline uint16_t be_to_h_u16(const uint8_t* buf) { return (uint16_t)(buf[1] | buf[0] << 8); @@ -147,6 +157,20 @@ static inline void h_u32_to_be(uint8_t* buf, int val) buf[3] = (uint8_t) (val >> 0); } +static inline void h_u24_to_le(uint8_t* buf, int val) +{ + buf[2] = (uint8_t) (val >> 16); + buf[1] = (uint8_t) (val >> 8); + buf[0] = (uint8_t) (val >> 0); +} + +static inline void h_u24_to_be(uint8_t* buf, int val) +{ + buf[0] = (uint8_t) (val >> 16); + buf[1] = (uint8_t) (val >> 8); + buf[2] = (uint8_t) (val >> 0); +} + static inline void h_u16_to_le(uint8_t* buf, int val) { buf[1] = (uint8_t) (val >> 8); diff --git a/src/target/target.c b/src/target/target.c index 66aa6bf7..3a6c6bb4 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -280,6 +280,15 @@ uint32_t target_buffer_get_u32(struct target *target, const uint8_t *buffer) return be_to_h_u32(buffer); } +/* read a uint24_t from a buffer in target memory endianness */ +uint32_t target_buffer_get_u24(struct target *target, const uint8_t *buffer) +{ + if (target->endianness == TARGET_LITTLE_ENDIAN) + return le_to_h_u24(buffer); + else + return be_to_h_u24(buffer); +} + /* read a uint16_t from a buffer in target memory endianness */ uint16_t target_buffer_get_u16(struct target *target, const uint8_t *buffer) { @@ -304,6 +313,15 @@ void target_buffer_set_u32(struct target *target, uint8_t *buffer, uint32_t valu h_u32_to_be(buffer, value); } +/* write a uint24_t to a buffer in target memory endianness */ +void target_buffer_set_u24(struct target *target, uint8_t *buffer, uint32_t value) +{ + if (target->endianness == TARGET_LITTLE_ENDIAN) + h_u24_to_le(buffer, value); + else + h_u24_to_be(buffer, value); +} + /* write a uint16_t to a buffer in target memory endianness */ void target_buffer_set_u16(struct target *target, uint8_t *buffer, uint16_t value) { diff --git a/src/target/target.h b/src/target/target.h index 2c6f4cd5..2bf96689 100644 --- a/src/target/target.h +++ b/src/target/target.h @@ -479,8 +479,10 @@ void target_free_all_working_areas(struct target *target); extern struct target *all_targets; uint32_t target_buffer_get_u32(struct target *target, const uint8_t *buffer); +uint32_t target_buffer_get_u24(struct target *target, const uint8_t *buffer); uint16_t target_buffer_get_u16(struct target *target, const uint8_t *buffer); void target_buffer_set_u32(struct target *target, uint8_t *buffer, uint32_t value); +void target_buffer_set_u24(struct target *target, uint8_t *buffer, uint32_t value); void target_buffer_set_u16(struct target *target, uint8_t *buffer, uint16_t value); int target_read_u32(struct target *target, uint32_t address, uint32_t *value); |