1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use esp8266::EFUSE;

pub trait DPortExt {
    fn read_chip_id(&self) -> u32;
    fn read_mac_addr(&self) -> [u8; 6];
}

impl DPortExt for EFUSE {
    fn read_chip_id(&self) -> u32 {
        let (id0, id1) = (
            self.efuse_data0.read().bits(),
            self.efuse_data1.read().bits(),
        );
        (id0 >> 24) | (id1 << 8)
    }

    fn read_mac_addr(&self) -> [u8; 6] {
        let (mac0, mac1, mac2) = (
            self.efuse_data0.read().bits(),
            self.efuse_data1.read().bits(),
            self.efuse_data3.read().bits(),
        );
        let oui = if mac2 != 0 {
            ((mac2 >> 16) as u8, (mac2 >> 8) as u8, mac2 as u8)
        } else if ((mac1 >> 16) & 0xff) == 0 {
            (0x18, 0xfe, 0x34)
        } else if ((mac1 >> 16) & 0xff) == 1 {
            (0xac, 0xd0, 0x74)
        } else {
            return [0; 6];
        };
        [
            oui.0,
            oui.1,
            oui.2,
            (mac1 >> 8) as u8,
            mac1 as u8,
            (mac0 >> 24) as u8,
        ]
    }
}