author | Darron Broad <darron@kewl.org> |
Wed, 28 Dec 2016 07:21:08 +0000 | |
changeset 31 | 52a43d0efa19 |
parent 30 | 137d69ef3280 |
child 32 | aa727cd084e9 |
module/src/gpio-bb.c | file | annotate | diff | comparison | revisions | |
module/src/gpio-bb.h | file | annotate | diff | comparison | revisions |
--- a/module/src/gpio-bb.c Wed Dec 28 06:42:02 2016 +0000 +++ b/module/src/gpio-bb.c Wed Dec 28 07:21:08 2016 +0000 @@ -106,7 +106,7 @@ static inline uint64_t gpio_bb_first(uint8_t nbits) { - return (config->msb_first) ? (1 << (nbits - 1)) : (1 << 0); + return (config->msb_first) ? ((uint64_t)(1) << (nbits - 1)) : (1 << 0); } static inline uint64_t gpio_bb_next(uint64_t mask) @@ -118,16 +118,14 @@ static int gpio_bb_shift_out(uint64_t bits, uint8_t nbits) { int err = 0; - uint64_t mask; + uint64_t mask = gpio_bb_first(nbits); uint8_t bit; unsigned long flags = 0; if (config->lock) spin_lock_irqsave(&gpio_bb_lock, flags); - mask = gpio_bb_first(nbits); bit = (bits & mask) != 0; - err = gpio_bb_io(0, config->data_pin_output, &bit); if (err) goto error; @@ -135,7 +133,8 @@ while (--nbits) { mask = gpio_bb_next(mask); - gpio_set_value(config->data_pin_output, (bits & mask) != 0); + bit = (bits & mask) != 0; + gpio_set_value(config->data_pin_output, bit); gpio_bb_clock(); } error: @@ -148,7 +147,7 @@ static int gpio_bb_shift_in_falling(uint64_t *bits, uint8_t nbits) { int err = 0; - uint64_t mask; + uint64_t mask = gpio_bb_first(nbits); uint8_t bit; unsigned long flags = 0; @@ -160,8 +159,6 @@ err = gpio_bb_io(1, config->data_pin_input, &bit); if (err) goto error; - - mask = gpio_bb_first(nbits); if (bit) *bits |= mask; gpio_bb_clock(); @@ -182,7 +179,7 @@ static int gpio_bb_shift_in_rising(uint64_t *bits, uint8_t nbits) { int err = 0; - uint64_t mask; + uint64_t mask = gpio_bb_first(nbits); uint8_t bit; unsigned long flags = 0; @@ -195,8 +192,6 @@ err = gpio_bb_io(1, config->data_pin_input, &bit); if (err) goto error; - - mask = gpio_bb_first(nbits); if (bit) *bits |= mask;
--- a/module/src/gpio-bb.h Wed Dec 28 06:42:02 2016 +0000 +++ b/module/src/gpio-bb.h Wed Dec 28 07:21:08 2016 +0000 @@ -29,7 +29,7 @@ uint16_t pin; uint8_t dir; uint8_t bit; -}; +} __attribute__((packed)); struct gpio_bb_config { uint16_t clock_pin; @@ -40,13 +40,13 @@ uint8_t clock_delay_low; uint8_t clock_delay_high; uint8_t lock; -}; +} __attribute__((packed)); struct gpio_bb_shift { uint8_t dir; uint8_t nbits; uint64_t bits; -}; +} __attribute__((packed)); #ifdef GPIO_BB_AFSK struct gpio_bb_tone { @@ -56,12 +56,12 @@ uint32_t delay_space; uint32_t duration_mark; uint32_t duration_space; -}; +} __attribute__((packed)); struct gpio_bb_tx { uint8_t nbits; uint64_t bits; -}; +} __attribute__((packed)); #endif /* GPIO_BB_AFSK */ #define GPIO_BB_MAX (512)