Skip to content

Commit 153f14c

Browse files
committed
VL53L1X: bswap registers and values for #1069.
Fix a regression introduced in 3e56dfb.
1 parent 8a66376 commit 153f14c

File tree

1 file changed

+16
-17
lines changed

1 file changed

+16
-17
lines changed

drivers/vl53l1x/vl53l1x.cpp

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -162,36 +162,40 @@ namespace pimoroni {
162162
// Write an 8-bit register
163163
void VL53L1X::writeReg(uint16_t reg, uint8_t value)
164164
{
165-
alignas(2) struct u16_u32_buffer {
165+
#pragma pack(push, 1)
166+
struct u16_u8_buffer {
166167
uint16_t reg;
167168
uint8_t value;
168-
} buffer{reg, value};
169+
} buffer{__builtin_bswap16(reg), value};
170+
#pragma pack(pop)
169171
i2c->write_blocking(address, (uint8_t *)&buffer, 3, false);
170172
}
171173

172174
// Write a 16-bit register
173175
void VL53L1X::writeReg16Bit(uint16_t reg, uint16_t value)
174176
{
175-
uint16_t buffer[2] = {reg, value};
177+
uint16_t buffer[2] = {__builtin_bswap16(reg), __builtin_bswap16(value)};
176178
i2c->write_blocking(address, (uint8_t *)buffer, 4, false);
177179
}
178180

179181
// Write a 32-bit register
180182
void VL53L1X::writeReg32Bit(uint16_t reg, uint32_t value)
181183
{
182-
alignas(2) struct u16_u32_buffer {
184+
#pragma pack(push, 1)
185+
struct u16_u32_buffer {
183186
uint16_t reg;
184187
uint32_t value;
185-
} buffer{reg, value};
188+
} buffer{__builtin_bswap16(reg), __builtin_bswap32(value)};
189+
#pragma pack(pop)
186190
i2c->write_blocking(address, (uint8_t *)&buffer, 6, false);
187191
}
188192

189193
// Read an 8-bit register
190194
uint8_t VL53L1X::readReg(regAddr reg)
191195
{
192196
uint8_t value;
193-
// TODO do we need to bswap reg?
194-
i2c->write_blocking(address, (uint8_t *)&reg, 2, true);
197+
uint16_t _reg = __builtin_bswap16(reg);
198+
i2c->write_blocking(address, (uint8_t *)&_reg, 2, true);
195199
i2c->read_blocking(address, &value, 1, false);
196200
return value;
197201
}
@@ -200,23 +204,19 @@ namespace pimoroni {
200204
uint16_t VL53L1X::readReg16Bit(uint16_t reg)
201205
{
202206
uint16_t value;
203-
// TODO do we need to bswap reg?
204-
i2c->write_blocking(address, (uint8_t *)&reg, 2, true);
207+
uint16_t _reg = __builtin_bswap16(reg);
208+
i2c->write_blocking(address, (uint8_t *)&_reg, 2, true);
205209
i2c->read_blocking(address, (uint8_t *)&value, 2, false);
206-
207-
// TODO do we need to bswap this return value?
208210
return __builtin_bswap16(value);
209211
}
210212

211213
// Read a 32-bit register
212214
uint32_t VL53L1X::readReg32Bit(uint16_t reg)
213215
{
214216
uint32_t value;
215-
reg= (reg << 8) + (reg >> 8);
216-
i2c->write_blocking(address, (uint8_t *)&reg, 2, true);
217+
uint16_t _reg = __builtin_bswap16(reg);
218+
i2c->write_blocking(address, (uint8_t *)&_reg, 2, true);
217219
i2c->read_blocking(address, (uint8_t *)&value, 4, false);
218-
219-
// TODO do we need to bswap this return value?
220220
return __builtin_bswap32(value);
221221
}
222222

@@ -572,8 +572,7 @@ namespace pimoroni {
572572
// read measurement results into buffer
573573
void VL53L1X::readResults()
574574
{
575-
uint16_t reg = RESULT__RANGE_STATUS;
576-
// TODO do we need to bswap reg?
575+
uint16_t reg = __builtin_bswap16(RESULT__RANGE_STATUS);
577576
uint8_t buffer[17];
578577
i2c->write_blocking(address, (uint8_t *)&reg, 2, true);
579578
i2c->read_blocking(address, buffer, 17, false);

0 commit comments

Comments
 (0)