Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorあく <alleteam@gmail.com>2021-10-15 14:05:14 +0300
committerGitHub <noreply@github.com>2021-10-15 14:05:14 +0300
commit0e14545d48048a0926e48f3ff4ba9525f125d437 (patch)
treed1356b0b4010b2681d19b819f619442ccd97ddb8 /firmware
parent63428609b786962a3d857c89b40fd87d3db051a3 (diff)
[FL-1945] Firmware, Scripts, Cli: add OTPv2, alternative displays support and 2-step OTP programming. #764
Diffstat (limited to 'firmware')
-rw-r--r--firmware/targets/f6/furi-hal/furi-hal-version.c112
-rw-r--r--firmware/targets/f7/furi-hal/furi-hal-version.c112
-rw-r--r--firmware/targets/furi-hal-include/furi-hal-version.h28
3 files changed, 196 insertions, 56 deletions
diff --git a/firmware/targets/f6/furi-hal/furi-hal-version.c b/firmware/targets/f6/furi-hal/furi-hal-version.c
index 93166b16..7ee67c2a 100644
--- a/firmware/targets/f6/furi-hal/furi-hal-version.c
+++ b/firmware/targets/f6/furi-hal/furi-hal-version.c
@@ -10,13 +10,6 @@
#define FURI_HAL_VERSION_OTP_HEADER_MAGIC 0xBABE
#define FURI_HAL_VERSION_OTP_ADDRESS OTP_AREA_BASE
-/** OTP Versions enum */
-typedef enum {
- FuriHalVersionOtpVersion0=0x00,
- FuriHalVersionOtpVersion1=0x01,
- FuriHalVersionOtpVersionEmpty=0xFFFFFFFE,
- FuriHalVersionOtpVersionUnknown=0xFFFFFFFF,
-} FuriHalVersionOtpVersion;
/** OTP V0 Structure: prototypes and early EVT */
typedef struct {
@@ -28,7 +21,7 @@ typedef struct {
char name[FURI_HAL_VERSION_NAME_LENGTH];
} FuriHalVersionOTPv0;
-/** OTP V1 Structure: late EVT, DVT, PVT, Production */
+/** OTP V1 Structure: late EVT, DVT */
typedef struct {
/* First 64 bits: header */
uint16_t header_magic;
@@ -49,10 +42,35 @@ typedef struct {
char name[FURI_HAL_VERSION_NAME_LENGTH]; /** Unique Device Name */
} FuriHalVersionOTPv1;
-/** Represenation Model: */
+/** OTP V2 Structure: DVT2, PVT, Production */
typedef struct {
- FuriHalVersionOtpVersion otp_version;
+ /* Early First 64 bits: header */
+ uint16_t header_magic;
+ uint8_t header_version;
+ uint8_t header_reserved;
+ uint32_t header_timestamp;
+
+ /* Early Second 64 bits: board info */
+ uint8_t board_version; /** Board version */
+ uint8_t board_target; /** Board target firmware */
+ uint8_t board_body; /** Board body */
+ uint8_t board_connect; /** Board interconnect */
+ uint8_t board_display; /** Board display */
+ uint8_t board_reserved2_0; /** Reserved for future use, 0x00 */
+ uint16_t board_reserved2_1; /** Reserved for future use, 0x0000 */
+
+ /* Late Third 64 bits: device info */
+ uint8_t board_color; /** Board color */
+ uint8_t board_region; /** Board region */
+ uint16_t board_reserved3_0; /** Reserved for future use, 0x0000 */
+ uint32_t board_reserved3_1; /** Reserved for future use, 0x00000000 */
+
+ /* Late Fourth 64 bits: Unique Device Name */
+ char name[FURI_HAL_VERSION_NAME_LENGTH]; /** Unique Device Name */
+} FuriHalVersionOTPv2;
+/** Represenation Model: */
+typedef struct {
uint32_t timestamp;
uint8_t board_version; /** Board version */
@@ -61,6 +79,7 @@ typedef struct {
uint8_t board_connect; /** Board interconnect */
uint8_t board_color; /** Board color */
uint8_t board_region; /** Board region */
+ uint8_t board_display; /** Board display */
char name[FURI_HAL_VERSION_ARRAY_NAME_LENGTH]; /** \0 terminated name */
char device_name[FURI_HAL_VERSION_DEVICE_NAME_LENGTH]; /** device name for special needs */
@@ -69,20 +88,6 @@ typedef struct {
static FuriHalVersion furi_hal_version = {0};
-static FuriHalVersionOtpVersion furi_hal_version_get_otp_version() {
- if (*(uint64_t*)FURI_HAL_VERSION_OTP_ADDRESS == 0xFFFFFFFF) {
- return FuriHalVersionOtpVersionEmpty;
- } else {
- if (((FuriHalVersionOTPv1*)FURI_HAL_VERSION_OTP_ADDRESS)->header_magic == FURI_HAL_VERSION_OTP_HEADER_MAGIC) {
- return FuriHalVersionOtpVersion1;
- } else if (((FuriHalVersionOTPv0*)FURI_HAL_VERSION_OTP_ADDRESS)->board_version <= 10) {
- return FuriHalVersionOtpVersion0;
- } else {
- return FuriHalVersionOtpVersionUnknown;
- }
- }
-}
-
static void furi_hal_version_set_name(const char* name) {
if(name != NULL) {
strlcpy(furi_hal_version.name, name, FURI_HAL_VERSION_ARRAY_NAME_LENGTH);
@@ -124,8 +129,6 @@ static void furi_hal_version_load_otp_v0() {
furi_hal_version.board_target = otp->board_target;
furi_hal_version.board_body = otp->board_body;
furi_hal_version.board_connect = otp->board_connect;
- furi_hal_version.board_color = 0;
- furi_hal_version.board_region = 0;
furi_hal_version_set_name(otp->name);
}
@@ -144,9 +147,33 @@ static void furi_hal_version_load_otp_v1() {
furi_hal_version_set_name(otp->name);
}
+static void furi_hal_version_load_otp_v2() {
+ const FuriHalVersionOTPv2* otp = (FuriHalVersionOTPv2*)FURI_HAL_VERSION_OTP_ADDRESS;
+
+ // 1st block, programmed afer baking
+ furi_hal_version.timestamp = otp->header_timestamp;
+
+ // 2nd block, programmed afer baking
+ furi_hal_version.board_version = otp->board_version;
+ furi_hal_version.board_target = otp->board_target;
+ furi_hal_version.board_body = otp->board_body;
+ furi_hal_version.board_connect = otp->board_connect;
+ furi_hal_version.board_display = otp->board_display;
+
+ // 3rd and 4th blocks, programmed on FATP stage
+ if (otp->board_color != 0xFF) {
+ furi_hal_version.board_color = otp->board_color;
+ furi_hal_version.board_region = otp->board_region;
+ furi_hal_version_set_name(otp->name);
+ } else {
+ furi_hal_version.board_color = 0;
+ furi_hal_version.board_region = 0;
+ furi_hal_version_set_name(NULL);
+ }
+}
+
void furi_hal_version_init() {
- furi_hal_version.otp_version = furi_hal_version_get_otp_version();
- switch(furi_hal_version.otp_version) {
+ switch(furi_hal_version_get_otp_version()) {
case FuriHalVersionOtpVersionUnknown:
furi_hal_version_load_otp_default();
break;
@@ -159,6 +186,9 @@ void furi_hal_version_init() {
case FuriHalVersionOtpVersion1:
furi_hal_version_load_otp_v1();
break;
+ case FuriHalVersionOtpVersion2:
+ furi_hal_version_load_otp_v2();
+ break;
default: furi_crash(NULL);
}
FURI_LOG_I("FuriHalVersion", "Init OK");
@@ -172,6 +202,28 @@ const char* furi_hal_version_get_model_name() {
return "Flipper Zero";
}
+const FuriHalVersionOtpVersion furi_hal_version_get_otp_version() {
+ if (*(uint64_t*)FURI_HAL_VERSION_OTP_ADDRESS == 0xFFFFFFFF) {
+ return FuriHalVersionOtpVersionEmpty;
+ } else {
+ if (((FuriHalVersionOTPv1*)FURI_HAL_VERSION_OTP_ADDRESS)->header_magic == FURI_HAL_VERSION_OTP_HEADER_MAGIC) {
+ // Version 1+
+ uint8_t version = ((FuriHalVersionOTPv1*)FURI_HAL_VERSION_OTP_ADDRESS)->header_version;
+ if (version >= FuriHalVersionOtpVersion1 && version <= FuriHalVersionOtpVersion2) {
+ return version;
+ } else {
+ return FuriHalVersionOtpVersionUnknown;
+ }
+ } else if (((FuriHalVersionOTPv0*)FURI_HAL_VERSION_OTP_ADDRESS)->board_version <= 10) {
+ // Version 0
+ return FuriHalVersionOtpVersion0;
+ } else {
+ // Version Unknown
+ return FuriHalVersionOtpVersionUnknown;
+ }
+ }
+}
+
const uint8_t furi_hal_version_get_hw_version() {
return furi_hal_version.board_version;
}
@@ -196,6 +248,10 @@ const FuriHalVersionRegion furi_hal_version_get_hw_region() {
return furi_hal_version.board_region;
}
+const FuriHalVersionDisplay furi_hal_version_get_hw_display() {
+ return furi_hal_version.board_display;
+}
+
const uint32_t furi_hal_version_get_hw_timestamp() {
return furi_hal_version.timestamp;
}
diff --git a/firmware/targets/f7/furi-hal/furi-hal-version.c b/firmware/targets/f7/furi-hal/furi-hal-version.c
index 5a98ab5e..64641fc6 100644
--- a/firmware/targets/f7/furi-hal/furi-hal-version.c
+++ b/firmware/targets/f7/furi-hal/furi-hal-version.c
@@ -10,13 +10,6 @@
#define FURI_HAL_VERSION_OTP_HEADER_MAGIC 0xBABE
#define FURI_HAL_VERSION_OTP_ADDRESS OTP_AREA_BASE
-/** OTP Versions enum */
-typedef enum {
- FuriHalVersionOtpVersion0=0x00,
- FuriHalVersionOtpVersion1=0x01,
- FuriHalVersionOtpVersionEmpty=0xFFFFFFFE,
- FuriHalVersionOtpVersionUnknown=0xFFFFFFFF,
-} FuriHalVersionOtpVersion;
/** OTP V0 Structure: prototypes and early EVT */
typedef struct {
@@ -28,7 +21,7 @@ typedef struct {
char name[FURI_HAL_VERSION_NAME_LENGTH];
} FuriHalVersionOTPv0;
-/** OTP V1 Structure: late EVT, DVT, PVT, Production */
+/** OTP V1 Structure: late EVT, DVT */
typedef struct {
/* First 64 bits: header */
uint16_t header_magic;
@@ -49,10 +42,35 @@ typedef struct {
char name[FURI_HAL_VERSION_NAME_LENGTH]; /** Unique Device Name */
} FuriHalVersionOTPv1;
-/** Represenation Model: */
+/** OTP V2 Structure: DVT2, PVT, Production */
typedef struct {
- FuriHalVersionOtpVersion otp_version;
+ /* Early First 64 bits: header */
+ uint16_t header_magic;
+ uint8_t header_version;
+ uint8_t header_reserved;
+ uint32_t header_timestamp;
+
+ /* Early Second 64 bits: board info */
+ uint8_t board_version; /** Board version */
+ uint8_t board_target; /** Board target firmware */
+ uint8_t board_body; /** Board body */
+ uint8_t board_connect; /** Board interconnect */
+ uint8_t board_display; /** Board display */
+ uint8_t board_reserved2_0; /** Reserved for future use, 0x00 */
+ uint16_t board_reserved2_1; /** Reserved for future use, 0x0000 */
+
+ /* Late Third 64 bits: device info */
+ uint8_t board_color; /** Board color */
+ uint8_t board_region; /** Board region */
+ uint16_t board_reserved3_0; /** Reserved for future use, 0x0000 */
+ uint32_t board_reserved3_1; /** Reserved for future use, 0x00000000 */
+
+ /* Late Fourth 64 bits: Unique Device Name */
+ char name[FURI_HAL_VERSION_NAME_LENGTH]; /** Unique Device Name */
+} FuriHalVersionOTPv2;
+/** Represenation Model: */
+typedef struct {
uint32_t timestamp;
uint8_t board_version; /** Board version */
@@ -61,6 +79,7 @@ typedef struct {
uint8_t board_connect; /** Board interconnect */
uint8_t board_color; /** Board color */
uint8_t board_region; /** Board region */
+ uint8_t board_display; /** Board display */
char name[FURI_HAL_VERSION_ARRAY_NAME_LENGTH]; /** \0 terminated name */
char device_name[FURI_HAL_VERSION_DEVICE_NAME_LENGTH]; /** device name for special needs */
@@ -69,20 +88,6 @@ typedef struct {
static FuriHalVersion furi_hal_version = {0};
-static FuriHalVersionOtpVersion furi_hal_version_get_otp_version() {
- if (*(uint64_t*)FURI_HAL_VERSION_OTP_ADDRESS == 0xFFFFFFFF) {
- return FuriHalVersionOtpVersionEmpty;
- } else {
- if (((FuriHalVersionOTPv1*)FURI_HAL_VERSION_OTP_ADDRESS)->header_magic == FURI_HAL_VERSION_OTP_HEADER_MAGIC) {
- return FuriHalVersionOtpVersion1;
- } else if (((FuriHalVersionOTPv0*)FURI_HAL_VERSION_OTP_ADDRESS)->board_version <= 10) {
- return FuriHalVersionOtpVersion0;
- } else {
- return FuriHalVersionOtpVersionUnknown;
- }
- }
-}
-
static void furi_hal_version_set_name(const char* name) {
if(name != NULL) {
strlcpy(furi_hal_version.name, name, FURI_HAL_VERSION_ARRAY_NAME_LENGTH);
@@ -124,8 +129,6 @@ static void furi_hal_version_load_otp_v0() {
furi_hal_version.board_target = otp->board_target;
furi_hal_version.board_body = otp->board_body;
furi_hal_version.board_connect = otp->board_connect;
- furi_hal_version.board_color = 0;
- furi_hal_version.board_region = 0;
furi_hal_version_set_name(otp->name);
}
@@ -144,9 +147,33 @@ static void furi_hal_version_load_otp_v1() {
furi_hal_version_set_name(otp->name);
}
+static void furi_hal_version_load_otp_v2() {
+ const FuriHalVersionOTPv2* otp = (FuriHalVersionOTPv2*)FURI_HAL_VERSION_OTP_ADDRESS;
+
+ // 1st block, programmed afer baking
+ furi_hal_version.timestamp = otp->header_timestamp;
+
+ // 2nd block, programmed afer baking
+ furi_hal_version.board_version = otp->board_version;
+ furi_hal_version.board_target = otp->board_target;
+ furi_hal_version.board_body = otp->board_body;
+ furi_hal_version.board_connect = otp->board_connect;
+ furi_hal_version.board_display = otp->board_display;
+
+ // 3rd and 4th blocks, programmed on FATP stage
+ if (otp->board_color != 0xFF) {
+ furi_hal_version.board_color = otp->board_color;
+ furi_hal_version.board_region = otp->board_region;
+ furi_hal_version_set_name(otp->name);
+ } else {
+ furi_hal_version.board_color = 0;
+ furi_hal_version.board_region = 0;
+ furi_hal_version_set_name(NULL);
+ }
+}
+
void furi_hal_version_init() {
- furi_hal_version.otp_version = furi_hal_version_get_otp_version();
- switch(furi_hal_version.otp_version) {
+ switch(furi_hal_version_get_otp_version()) {
case FuriHalVersionOtpVersionUnknown:
furi_hal_version_load_otp_default();
break;
@@ -159,6 +186,9 @@ void furi_hal_version_init() {
case FuriHalVersionOtpVersion1:
furi_hal_version_load_otp_v1();
break;
+ case FuriHalVersionOtpVersion2:
+ furi_hal_version_load_otp_v2();
+ break;
default: furi_crash(NULL);
}
FURI_LOG_I("FuriHalVersion", "Init OK");
@@ -172,6 +202,28 @@ const char* furi_hal_version_get_model_name() {
return "Flipper Zero";
}
+const FuriHalVersionOtpVersion furi_hal_version_get_otp_version() {
+ if (*(uint64_t*)FURI_HAL_VERSION_OTP_ADDRESS == 0xFFFFFFFF) {
+ return FuriHalVersionOtpVersionEmpty;
+ } else {
+ if (((FuriHalVersionOTPv1*)FURI_HAL_VERSION_OTP_ADDRESS)->header_magic == FURI_HAL_VERSION_OTP_HEADER_MAGIC) {
+ // Version 1+
+ uint8_t version = ((FuriHalVersionOTPv1*)FURI_HAL_VERSION_OTP_ADDRESS)->header_version;
+ if (version >= FuriHalVersionOtpVersion1 && version <= FuriHalVersionOtpVersion2) {
+ return version;
+ } else {
+ return FuriHalVersionOtpVersionUnknown;
+ }
+ } else if (((FuriHalVersionOTPv0*)FURI_HAL_VERSION_OTP_ADDRESS)->board_version <= 10) {
+ // Version 0
+ return FuriHalVersionOtpVersion0;
+ } else {
+ // Version Unknown
+ return FuriHalVersionOtpVersionUnknown;
+ }
+ }
+}
+
const uint8_t furi_hal_version_get_hw_version() {
return furi_hal_version.board_version;
}
@@ -196,6 +248,10 @@ const FuriHalVersionRegion furi_hal_version_get_hw_region() {
return furi_hal_version.board_region;
}
+const FuriHalVersionDisplay furi_hal_version_get_hw_display() {
+ return furi_hal_version.board_display;
+}
+
const uint32_t furi_hal_version_get_hw_timestamp() {
return furi_hal_version.timestamp;
}
diff --git a/firmware/targets/furi-hal-include/furi-hal-version.h b/firmware/targets/furi-hal-include/furi-hal-version.h
index ac28188e..00dc5cba 100644
--- a/firmware/targets/furi-hal-include/furi-hal-version.h
+++ b/firmware/targets/furi-hal-include/furi-hal-version.h
@@ -19,6 +19,15 @@ extern "C" {
/** BLE symbol + "Flipper " + name */
#define FURI_HAL_VERSION_DEVICE_NAME_LENGTH (1 + 8 + FURI_HAL_VERSION_ARRAY_NAME_LENGTH)
+/** OTP Versions enum */
+typedef enum {
+ FuriHalVersionOtpVersion0=0x00,
+ FuriHalVersionOtpVersion1=0x01,
+ FuriHalVersionOtpVersion2=0x02,
+ FuriHalVersionOtpVersionEmpty=0xFFFFFFFE,
+ FuriHalVersionOtpVersionUnknown=0xFFFFFFFF,
+} FuriHalVersionOtpVersion;
+
/** Device Colors */
typedef enum {
FuriHalVersionColorUnknown=0x00,
@@ -34,6 +43,13 @@ typedef enum {
FuriHalVersionRegionJp=0x03,
} FuriHalVersionRegion;
+/** Device Display */
+typedef enum {
+ FuriHalVersionDisplayUnknown=0x00,
+ FuriHalVersionDisplayErc=0x01,
+ FuriHalVersionDisplayMgg=0x02,
+} FuriHalVersionDisplay;
+
/** Init flipper version
*/
void furi_hal_version_init();
@@ -50,6 +66,12 @@ bool furi_hal_version_do_i_belong_here();
*/
const char* furi_hal_version_get_model_name();
+/** Get OTP version
+ *
+ * @return OTP Version
+ */
+const FuriHalVersionOtpVersion furi_hal_version_get_otp_version();
+
/** Get hardware version
*
* @return Hardware Version
@@ -86,6 +108,12 @@ const uint8_t furi_hal_version_get_hw_connect();
*/
const FuriHalVersionRegion furi_hal_version_get_hw_region();
+/** Get hardware display id
+ *
+ * @return Display id
+ */
+const FuriHalVersionDisplay furi_hal_version_get_hw_display();
+
/** Get hardware timestamp
*
* @return Hardware Manufacture timestamp