Skip to content

Commit e2a07cf

Browse files
authored
Miscellaneous cleanup (#656)
* Fix error checks in bus scan (Read returns illegal address, not reserved) * Rename get_register in the ICM-20948 driver to get_reg for consistency * Remove redundant comptime size check: The size is verified because the packed struct has a size
1 parent a565f70 commit e2a07cf

4 files changed

Lines changed: 30 additions & 32 deletions

File tree

drivers/sensor/ICM-20948.zig

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ pub const ICM_20948 = struct {
401401
log.debug("Device health check passed", .{});
402402
}
403403

404-
pub inline fn read_register(self: *Self, reg: Self.Register, buf: []u8) Error!void {
404+
pub inline fn read_reg(self: *Self, reg: Self.Register, buf: []u8) Error!void {
405405
if (buf.len == 0) return Error.InvalidParameter;
406406

407407
try self.set_bank(reg.bank());
@@ -416,7 +416,7 @@ pub const ICM_20948 = struct {
416416

417417
pub inline fn read_byte(self: *Self, reg: Self.Register) Error!u8 {
418418
var buf: [1]u8 = undefined;
419-
try self.read_register(reg, &buf);
419+
try self.read_reg(reg, &buf);
420420
return buf[0];
421421
}
422422

@@ -432,15 +432,15 @@ pub const ICM_20948 = struct {
432432
}
433433

434434
/// Read the register and modify the matching fields as provided
435-
pub inline fn modify_register(self: *Self, reg: Self.Register, reg_t: type, fields: anytype) Error!void {
435+
pub inline fn modify_reg(self: *Self, reg: Self.Register, T: type, fields: anytype) Error!void {
436436
// Read the current value
437437
const current_val = self.read_byte(reg) catch |err| {
438438
log.err("Failed to read register 0x{X:02} for modification: {}", .{ reg.value(), err });
439439
return err;
440440
};
441441

442442
// Cast to the correct type and modify the named fields
443-
var val: reg_t = @bitCast(current_val);
443+
var val: T = @bitCast(current_val);
444444
inline for (@typeInfo(@TypeOf(fields)).@"struct".fields) |field| {
445445
@field(val, field.name) = @field(fields, field.name);
446446
}
@@ -476,7 +476,7 @@ pub const ICM_20948 = struct {
476476
// Reset the slave address as well
477477
self.slave_address = 0;
478478

479-
self.modify_register(.{ .bank0 = .pwr_mgmt_1 }, pwr_mgmt_1, .{ .DEVICE_RESET = true }) catch
479+
self.modify_reg(.{ .bank0 = .pwr_mgmt_1 }, pwr_mgmt_1, .{ .DEVICE_RESET = true }) catch
480480
return Error.ResetFailed;
481481

482482
// Sleep longer after reset to ensure device is ready
@@ -487,15 +487,15 @@ pub const ICM_20948 = struct {
487487
}
488488

489489
pub fn sleep(self: *Self, on: bool) Error!void {
490-
try self.modify_register(.{ .bank0 = .pwr_mgmt_1 }, pwr_mgmt_1, .{ .SLEEP = on });
490+
try self.modify_reg(.{ .bank0 = .pwr_mgmt_1 }, pwr_mgmt_1, .{ .SLEEP = on });
491491
}
492492

493493
pub fn low_power(self: *Self, on: bool) Error!void {
494-
try self.modify_register(.{ .bank0 = .pwr_mgmt_1 }, pwr_mgmt_1, .{ .LP_EN = on });
494+
try self.modify_reg(.{ .bank0 = .pwr_mgmt_1 }, pwr_mgmt_1, .{ .LP_EN = on });
495495
}
496496

497497
pub fn set_clocks(self: *Self) Error!void {
498-
try self.modify_register(.{ .bank0 = .pwr_mgmt_1 }, pwr_mgmt_1, .{
498+
try self.modify_reg(.{ .bank0 = .pwr_mgmt_1 }, pwr_mgmt_1, .{
499499
// 1 = Auto select
500500
.CLKSEL = 1,
501501
.SLEEP = false,
@@ -506,7 +506,7 @@ pub const ICM_20948 = struct {
506506
pub fn set_sample_mode(self: *Self) Error!void {
507507
// TODO: Support setting these individually. Could set based on if ODR fields are set (make
508508
// optional?)
509-
try self.modify_register(.{ .bank0 = .lp_config }, lp_config, .{
509+
try self.modify_reg(.{ .bank0 = .lp_config }, lp_config, .{
510510
// Use I2C_MST_ODR_CONFIG, unless gyro or accel set their own data rate
511511
.I2C_MST_CYCLE = 1,
512512
// NOTE: We seem to need this set to 0?
@@ -540,7 +540,7 @@ pub const ICM_20948 = struct {
540540
}
541541

542542
pub fn disable_accelerometer(self: *Self) Error!void {
543-
try self.modify_register(.{ .bank0 = .pwr_mgmt_2 }, pwr_mgmt_2, .{
543+
try self.modify_reg(.{ .bank0 = .pwr_mgmt_2 }, pwr_mgmt_2, .{
544544
.DISABLE_ACCEL = .disable,
545545
});
546546
}
@@ -554,7 +554,7 @@ pub const ICM_20948 = struct {
554554
pub fn get_accel_data_unscaled(self: *Self) Error!Accel_data_unscaled {
555555
var raw_data: Accel_data_unscaled = .{};
556556

557-
self.read_register(.{ .bank0 = .accel_xout_h }, std.mem.asBytes(&raw_data)) catch |err| {
557+
self.read_reg(.{ .bank0 = .accel_xout_h }, std.mem.asBytes(&raw_data)) catch |err| {
558558
log.err("Failed to read accelerometer data: {}", .{err});
559559
return err;
560560
};
@@ -604,7 +604,7 @@ pub const ICM_20948 = struct {
604604
}
605605

606606
pub fn disable_gyroscope(self: *Self) Error!void {
607-
try self.modify_register(.{ .bank0 = .pwr_mgmt_2 }, pwr_mgmt_2, .{
607+
try self.modify_reg(.{ .bank0 = .pwr_mgmt_2 }, pwr_mgmt_2, .{
608608
.DISABLE_GYRO = .disable,
609609
});
610610
}
@@ -618,7 +618,7 @@ pub const ICM_20948 = struct {
618618
pub fn get_gyro_data_unscaled(self: *Self) Error!Gyro_data_unscaled {
619619
var raw_data: Gyro_data_unscaled = .{};
620620

621-
self.read_register(.{ .bank0 = .gyro_xout_h }, std.mem.asBytes(&raw_data)) catch |err| {
621+
self.read_reg(.{ .bank0 = .gyro_xout_h }, std.mem.asBytes(&raw_data)) catch |err| {
622622
log.err("Failed to read gyroscope data: {}", .{err});
623623
return err;
624624
};
@@ -664,7 +664,7 @@ pub const ICM_20948 = struct {
664664
temp: i16 = 0,
665665
}{};
666666

667-
self.read_register(.{ .bank0 = .accel_xout_h }, std.mem.asBytes(&raw_data)) catch |err| {
667+
self.read_reg(.{ .bank0 = .accel_xout_h }, std.mem.asBytes(&raw_data)) catch |err| {
668668
log.err("Failed to read combined accel/gyro data: {}", .{err});
669669
return err;
670670
};
@@ -698,7 +698,7 @@ pub const ICM_20948 = struct {
698698
mag: Mag_data_unscaled = .{},
699699
}{};
700700

701-
self.read_register(.{ .bank0 = .accel_xout_h }, std.mem.asBytes(&raw_data)) catch |err| {
701+
self.read_reg(.{ .bank0 = .accel_xout_h }, std.mem.asBytes(&raw_data)) catch |err| {
702702
log.err("Failed to read combined accel/gyro/mag data: {}", .{err});
703703
return err;
704704
};
@@ -729,7 +729,7 @@ pub const ICM_20948 = struct {
729729
pub fn get_temp(self: *Self) Error!f32 {
730730
var raw_data: i16 = undefined;
731731

732-
self.read_register(.{ .bank0 = .temp_out_h }, std.mem.asBytes(&raw_data)) catch |err| {
732+
self.read_reg(.{ .bank0 = .temp_out_h }, std.mem.asBytes(&raw_data)) catch |err| {
733733
log.err("Failed to read temperature data: {}", .{err});
734734
return err;
735735
};
@@ -748,7 +748,7 @@ pub const ICM_20948 = struct {
748748
try self.write_byte(.{ .bank3 = .i2c_mst_odr_config }, config.mag_i2c_mst_odr_config);
749749

750750
// Enable I2C master on this device
751-
try self.modify_register(.{ .bank0 = .user_ctrl }, user_ctrl, .{ .I2C_MST_EN = 1 });
751+
try self.modify_reg(.{ .bank0 = .user_ctrl }, user_ctrl, .{ .I2C_MST_EN = 1 });
752752
// We need to sleep here
753753
self.clock.sleep_ms(10);
754754

@@ -806,7 +806,7 @@ pub const ICM_20948 = struct {
806806
// Give the device time to hit the magnetometer
807807
self.clock.sleep_us(MAG_READ_DELAY_US);
808808
// Read the data the master read in
809-
return try self.read_register(.{ .bank0 = .ext_slv_sens_data_00 }, buf);
809+
return try self.read_reg(.{ .bank0 = .ext_slv_sens_data_00 }, buf);
810810
}
811811

812812
pub inline fn mag_read_byte(self: *Self, reg: MagRegister) Error!u8 {
@@ -834,7 +834,7 @@ pub const ICM_20948 = struct {
834834
self.clock.sleep_us(MAG_RESET_DELAY_US);
835835

836836
// Reset I2C master on device
837-
try self.modify_register(.{ .bank0 = .user_ctrl }, user_ctrl, .{ .I2C_MST_RST = 1 });
837+
try self.modify_reg(.{ .bank0 = .user_ctrl }, user_ctrl, .{ .I2C_MST_RST = 1 });
838838
}
839839

840840
const Mag_data_unscaled = packed struct {
@@ -864,7 +864,7 @@ pub const ICM_20948 = struct {
864864
try self.mag_set_sensor_read();
865865
var raw_data: Mag_data_unscaled = .{};
866866

867-
self.read_register(.{ .bank0 = .ext_slv_sens_data_00 }, std.mem.asBytes(&raw_data)) catch |err| {
867+
self.read_reg(.{ .bank0 = .ext_slv_sens_data_00 }, std.mem.asBytes(&raw_data)) catch |err| {
868868
log.err("Failed to read magnetometer data: {}", .{err});
869869
return err;
870870
};

examples/nordic/nrf5x/src/i2c_bus_scan.zig

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ const time = microzig.drivers.time;
44
const board = microzig.board;
55
const nrf = microzig.hal;
66

7-
const I2CError = microzig.drivers.base.I2C_Device.Error;
8-
97
const gpio = nrf.gpio;
108
const i2c = nrf.i2c;
119
const i2cdma = nrf.i2cdma;
@@ -47,8 +45,8 @@ pub fn main() !void {
4745

4846
var rx_data: [1]u8 = undefined;
4947
_ = i2c0.read_blocking(a, &rx_data, null) catch |e| {
50-
if (e != I2CError.DeviceNotPresent and
51-
e != I2CError.TargetAddressReserved)
48+
if (e != i2c.Error.DeviceNotPresent and
49+
e != i2c.Error.IllegalAddress)
5250
std.log.info("Error {any}", .{e});
5351
continue;
5452
};
@@ -69,8 +67,8 @@ pub fn main() !void {
6967

7068
var rx_data: [1]u8 = undefined;
7169
_ = i2c0dma.read_blocking(a, &rx_data, null) catch |e| {
72-
if (e != I2CError.DeviceNotPresent and
73-
e != I2CError.TargetAddressReserved)
70+
if (e != i2c.Error.DeviceNotPresent and
71+
e != i2c.Error.IllegalAddress)
7472
std.log.info("Error {any}", .{e});
7573
continue;
7674
};

examples/raspberrypi/rp2xxx/src/i2c_bus_scan.zig

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ const time = microzig.drivers.time;
55
const rp2xxx = microzig.hal;
66
const i2c = rp2xxx.i2c;
77
const gpio = rp2xxx.gpio;
8-
const peripherals = microzig.chip.peripherals;
98

109
const uart = rp2xxx.uart.instance.num(0);
1110
const baud_rate = 115200;
@@ -43,7 +42,12 @@ pub fn main() !void {
4342
const a: i2c.Address = @enumFromInt(addr);
4443

4544
var rx_data: [1]u8 = undefined;
46-
_ = i2c0.read_blocking(a, &rx_data, time.Duration.from_ms(100)) catch continue;
45+
_ = i2c0.read_blocking(a, &rx_data, null) catch |e| {
46+
if (e != i2c.Error.DeviceNotPresent and
47+
e != i2c.Error.IllegalAddress)
48+
std.log.info("Error {any}", .{e});
49+
continue;
50+
};
4751

4852
std.log.info("I2C device found at address {X}.", .{addr});
4953
}

tools/uf2/src/uf2.zig

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,10 +201,6 @@ pub const Flags = packed struct(u32) {
201201
md5_checksum_present: bool,
202202
extension_tags_present: bool,
203203
padding: u16 = 0,
204-
205-
comptime {
206-
assert(@sizeOf(Flags) == @sizeOf(u32));
207-
}
208204
};
209205

210206
const first_magic = 0x0a324655;

0 commit comments

Comments
 (0)