@@ -162,36 +162,40 @@ namespace pimoroni {
162
162
// Write an 8-bit register
163
163
void VL53L1X::writeReg (uint16_t reg, uint8_t value)
164
164
{
165
- alignas (2 ) struct u16_u32_buffer {
165
+ #pragma pack(push, 1)
166
+ struct u16_u8_buffer {
166
167
uint16_t reg;
167
168
uint8_t value;
168
- } buffer{reg, value};
169
+ } buffer{__builtin_bswap16 (reg), value};
170
+ #pragma pack(pop)
169
171
i2c->write_blocking (address, (uint8_t *)&buffer, 3 , false );
170
172
}
171
173
172
174
// Write a 16-bit register
173
175
void VL53L1X::writeReg16Bit (uint16_t reg, uint16_t value)
174
176
{
175
- uint16_t buffer[2 ] = {reg, value};
177
+ uint16_t buffer[2 ] = {__builtin_bswap16 ( reg), __builtin_bswap16 ( value) };
176
178
i2c->write_blocking (address, (uint8_t *)buffer, 4 , false );
177
179
}
178
180
179
181
// Write a 32-bit register
180
182
void VL53L1X::writeReg32Bit (uint16_t reg, uint32_t value)
181
183
{
182
- alignas (2 ) struct u16_u32_buffer {
184
+ #pragma pack(push, 1)
185
+ struct u16_u32_buffer {
183
186
uint16_t reg;
184
187
uint32_t value;
185
- } buffer{reg, value};
188
+ } buffer{__builtin_bswap16 (reg), __builtin_bswap32 (value)};
189
+ #pragma pack(pop)
186
190
i2c->write_blocking (address, (uint8_t *)&buffer, 6 , false );
187
191
}
188
192
189
193
// Read an 8-bit register
190
194
uint8_t VL53L1X::readReg (regAddr reg)
191
195
{
192
196
uint8_t value;
193
- // TODO do we need to bswap reg?
194
- i2c->write_blocking (address, (uint8_t *)® , 2 , true );
197
+ uint16_t _reg = __builtin_bswap16 ( reg);
198
+ i2c->write_blocking (address, (uint8_t *)&_reg , 2 , true );
195
199
i2c->read_blocking (address, &value, 1 , false );
196
200
return value;
197
201
}
@@ -200,23 +204,19 @@ namespace pimoroni {
200
204
uint16_t VL53L1X::readReg16Bit (uint16_t reg)
201
205
{
202
206
uint16_t value;
203
- // TODO do we need to bswap reg?
204
- i2c->write_blocking (address, (uint8_t *)® , 2 , true );
207
+ uint16_t _reg = __builtin_bswap16 ( reg);
208
+ i2c->write_blocking (address, (uint8_t *)&_reg , 2 , true );
205
209
i2c->read_blocking (address, (uint8_t *)&value, 2 , false );
206
-
207
- // TODO do we need to bswap this return value?
208
210
return __builtin_bswap16 (value);
209
211
}
210
212
211
213
// Read a 32-bit register
212
214
uint32_t VL53L1X::readReg32Bit (uint16_t reg)
213
215
{
214
216
uint32_t value;
215
- reg= (reg << 8 ) + (reg >> 8 );
216
- i2c->write_blocking (address, (uint8_t *)® , 2 , true );
217
+ uint16_t _reg = __builtin_bswap16 (reg);
218
+ i2c->write_blocking (address, (uint8_t *)&_reg , 2 , true );
217
219
i2c->read_blocking (address, (uint8_t *)&value, 4 , false );
218
-
219
- // TODO do we need to bswap this return value?
220
220
return __builtin_bswap32 (value);
221
221
}
222
222
@@ -572,8 +572,7 @@ namespace pimoroni {
572
572
// read measurement results into buffer
573
573
void VL53L1X::readResults ()
574
574
{
575
- uint16_t reg = RESULT__RANGE_STATUS;
576
- // TODO do we need to bswap reg?
575
+ uint16_t reg = __builtin_bswap16 (RESULT__RANGE_STATUS);
577
576
uint8_t buffer[17 ];
578
577
i2c->write_blocking (address, (uint8_t *)®, 2 , true );
579
578
i2c->read_blocking (address, buffer, 17 , false );
0 commit comments