@@ -2,7 +2,7 @@ use std::{collections::HashMap, ops::Range};
2
2
3
3
use esp_idf_part:: PartitionTable ;
4
4
5
- use super :: { Chip , Esp32Params , ReadEFuse , SpiRegisters , Target } ;
5
+ use super :: { bytes_to_mac_addr , Chip , Esp32Params , ReadEFuse , SpiRegisters , Target } ;
6
6
use crate :: {
7
7
connection:: Connection ,
8
8
elf:: FirmwareImage ,
@@ -50,18 +50,15 @@ impl Target for Esp32c2 {
50
50
}
51
51
52
52
fn chip_features ( & self , _connection : & mut Connection ) -> Result < Vec < & str > , Error > {
53
- Ok ( vec ! [ "WiFi" ] )
53
+ Ok ( vec ! [ "WiFi" , "BLE" ] )
54
54
}
55
55
56
- fn chip_revision ( & self , connection : & mut Connection ) -> Result < Option < u32 > , Error > {
57
- let block1_addr = self . efuse_reg ( ) + 0x44 ;
58
- let num_word = 3 ;
59
- let pos = 18 ;
60
-
61
- let value = connection. read_reg ( block1_addr + ( num_word * 0x4 ) ) ?;
62
- let value = ( value & ( 0x7 << pos) ) >> pos;
56
+ fn major_chip_version ( & self , connection : & mut Connection ) -> Result < u32 , Error > {
57
+ Ok ( self . read_efuse ( connection, 17 ) ? >> 20 & 0x3 )
58
+ }
63
59
64
- Ok ( Some ( value) )
60
+ fn minor_chip_version ( & self , connection : & mut Connection ) -> Result < u32 , Error > {
61
+ Ok ( self . read_efuse ( connection, 17 ) ? >> 16 & 0xf )
65
62
}
66
63
67
64
fn crystal_freq ( & self , _connection : & mut Connection ) -> Result < u32 , Error > {
@@ -88,7 +85,7 @@ impl Target for Esp32c2 {
88
85
bootloader : Option < Vec < u8 > > ,
89
86
partition_table : Option < PartitionTable > ,
90
87
image_format : Option < ImageFormatKind > ,
91
- _chip_revision : Option < u32 > ,
88
+ _chip_revision : Option < ( u32 , u32 ) > ,
92
89
flash_mode : Option < FlashMode > ,
93
90
flash_size : Option < FlashSize > ,
94
91
flash_freq : Option < FlashFrequency > ,
@@ -110,6 +107,18 @@ impl Target for Esp32c2 {
110
107
}
111
108
}
112
109
110
+ /// What is the MAC address?
111
+ fn mac_address ( & self , connection : & mut Connection ) -> Result < String , Error > {
112
+ let word5 = self . read_efuse ( connection, 16 ) ?;
113
+ let word6 = self . read_efuse ( connection, 17 ) ?;
114
+
115
+ let bytes = ( ( word6 as u64 ) << 32 ) | word5 as u64 ;
116
+ let bytes = bytes. to_be_bytes ( ) ;
117
+ let bytes = & bytes[ 2 ..] ;
118
+
119
+ Ok ( bytes_to_mac_addr ( bytes) )
120
+ }
121
+
113
122
fn spi_registers ( & self ) -> SpiRegisters {
114
123
SpiRegisters {
115
124
base : 0x6000_2000 ,
0 commit comments