eeprom24x/
serial_number.rs

1use crate::{
2    addr_size::{OneByte, TwoBytes},
3    unique_serial, Eeprom24x, Error,
4};
5use embedded_hal::i2c::I2c;
6
7/// Determine the peripheral address for accessing the secure region
8/// of 24CS devices.
9fn secure_region_addr(address_bits: u8, base_addr: u8) -> u8 {
10    match address_bits {
11        7 | 8 | 12 | 13 => 0b101_1000 | (base_addr & 0b111), // CS01,CS02, CS32, CS64
12        9 => 0b101_1000 | (base_addr & 0b110),               // CS04
13        10 => 0b101_1000 | (base_addr & 0b100),              // CS08
14        11 => 0b101_1000,                                    // CS16
15        _ => unreachable!(),
16    }
17}
18
19/// Methods for interacting with the factory-programmed unique serial number
20/// for devices with one byte addresses. e.g. 24CSx01, 24CSx02,24CSx04, 24CSx08,
21/// and 24CSx16.
22impl<I2C, PS, E> Eeprom24x<I2C, PS, OneByte, unique_serial::Yes>
23where
24    I2C: I2c<Error = E>,
25{
26    /// Read the 128-bit unique serial number.
27    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
37/// Methods for interacting with the factory-programmed unique serial number
38/// for devices with two byte addresses. e.g. 24CSx32 and 24CSx64
39impl<I2C, PS, E> Eeprom24x<I2C, PS, TwoBytes, unique_serial::Yes>
40where
41    I2C: I2c<Error = E>,
42{
43    /// Read the 128-bit unique serial number.
44    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}