eeprom24x/
serial_number.rs1use crate::{
2 addr_size::{OneByte, TwoBytes},
3 unique_serial, Eeprom24x, Error,
4};
5use embedded_hal::i2c::I2c;
6
7fn secure_region_addr(address_bits: u8, base_addr: u8) -> u8 {
10 match address_bits {
11 7 | 8 | 12 | 13 => 0b101_1000 | (base_addr & 0b111), 9 => 0b101_1000 | (base_addr & 0b110), 10 => 0b101_1000 | (base_addr & 0b100), 11 => 0b101_1000, _ => unreachable!(),
16 }
17}
18
19impl<I2C, PS, E> Eeprom24x<I2C, PS, OneByte, unique_serial::Yes>
23where
24 I2C: I2c<Error = E>,
25{
26 pub fn read_unique_serial(&mut self) -> Result<[u8; 16], Error<E>> {
28 let addr = secure_region_addr(self.address_bits, self.address.addr());
29 let mut serial_bytes = [0u8; 16];
30 self.i2c
31 .write_read(addr, &[0x80], &mut serial_bytes)
32 .map_err(Error::I2C)?;
33 Ok(serial_bytes)
34 }
35}
36
37impl<I2C, PS, E> Eeprom24x<I2C, PS, TwoBytes, unique_serial::Yes>
40where
41 I2C: I2c<Error = E>,
42{
43 pub fn read_unique_serial(&mut self) -> Result<[u8; 16], Error<E>> {
45 let secure_region_addr = 0b101_1000 | (self.address.addr() & 0b111);
46 let mut serial_bytes = [0u8; 16];
47 self.i2c
48 .write_read(secure_region_addr, &[0x08, 0x0], &mut serial_bytes)
49 .map_err(Error::I2C)?;
50 Ok(serial_bytes)
51 }
52}