summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVencislav Atanasov <user890104@freemyipod.org>2024-12-17 23:22:01 +0200
committerSolomon Peachy <pizza@shaftnet.org>2024-12-17 23:08:10 -0500
commitcf4bf5439e1bb2b1bc87cebc8b192718c27b638e (patch)
tree87f39dcbd4464dd78ec5488b42f16e0b8290eec1
parente27f778fb694ce5d9b52572a2d24be5b02e65d9b (diff)
downloadrockbox-cf4bf5439e.tar.gz
rockbox-cf4bf5439e.zip
S5L8702: Introduce syscfg_read() and use it in the debug menu
This makes it possible to reuse the SysCfg reading logic in other places. Tested on ipod6g (normal + bootloader). Change-Id: Iae6de2ee671bce4edb0153d26c57579ad47d0335
-rw-r--r--apps/debug_menu.c36
-rw-r--r--firmware/target/arm/s5l8702/norboot-s5l8702.c31
-rw-r--r--firmware/target/arm/s5l8702/norboot-target.h10
3 files changed, 52 insertions, 25 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index a0587528d3..11f0193279 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -2642,51 +2642,37 @@ static bool dbg_device_data(void)
#if defined(IPOD_6G) && !defined(SIMULATOR)
-#define SYSCFG_MAX_ENTRIES 9 // 9 on iPod Classic/6G
-
static bool dbg_syscfg(void) {
struct simplelist_info info;
- struct SysCfgHeader syscfg_hdr;
- size_t syscfg_hdr_size = sizeof(struct SysCfgHeader);
- size_t syscfg_entry_size = sizeof(struct SysCfgEntry);
- struct SysCfgEntry syscfg_entries[SYSCFG_MAX_ENTRIES];
+ struct SysCfg syscfg;
simplelist_info_init(&info, "SysCfg NOR contents", 0, NULL);
simplelist_reset_lines();
- bootflash_init(SPI_PORT);
- bootflash_read(SPI_PORT, 0, syscfg_hdr_size, &syscfg_hdr);
+ const ssize_t result = syscfg_read(&syscfg);
- if (syscfg_hdr.magic != SYSCFG_MAGIC) {
+ if (result == -1) {
simplelist_setline("SCfg magic not found");
- bootflash_close(SPI_PORT);
return simplelist_show_list(&info);
}
- simplelist_addline("Total size: %lu bytes, %lu entries", syscfg_hdr.size, syscfg_hdr.num_entries);
-
- size_t calculated_syscfg_size = syscfg_hdr_size + syscfg_entry_size * syscfg_hdr.num_entries;
+ simplelist_addline("Total size: %lu bytes, %lu entries", syscfg.header.size, syscfg.header.num_entries);
- if (syscfg_hdr.size != calculated_syscfg_size) {
- simplelist_addline("Wrong size: expected %zu, got %lu", calculated_syscfg_size, syscfg_hdr.size);
- bootflash_close(SPI_PORT);
+ if (result > 0) {
+ simplelist_addline("Wrong size: expected %ld, got %lu", result, syscfg.header.size);
return simplelist_show_list(&info);
}
- if (syscfg_hdr.num_entries > SYSCFG_MAX_ENTRIES) {
+ if (syscfg.header.num_entries > SYSCFG_MAX_ENTRIES) {
simplelist_addline("Too many entries, showing only first %u", SYSCFG_MAX_ENTRIES);
}
- size_t syscfg_num_entries = MIN(syscfg_hdr.num_entries, SYSCFG_MAX_ENTRIES);
- size_t syscfg_entries_size = syscfg_entry_size * syscfg_num_entries;
-
- bootflash_read(SPI_PORT, syscfg_hdr_size, syscfg_entries_size, &syscfg_entries);
- bootflash_close(SPI_PORT);
+ const size_t syscfg_num_entries = MIN(syscfg.header.num_entries, SYSCFG_MAX_ENTRIES);
for (size_t i = 0; i < syscfg_num_entries; i++) {
- struct SysCfgEntry* entry = &syscfg_entries[i];
- char* tag = (char *)&entry->tag;
- uint32_t* data32 = (uint32_t *)entry->data;
+ const struct SysCfgEntry* entry = &syscfg.entries[i];
+ const char* tag = (char *)&entry->tag;
+ const uint32_t* data32 = (uint32_t *)entry->data;
switch (entry->tag) {
case SYSCFG_TAG_SRNM:
diff --git a/firmware/target/arm/s5l8702/norboot-s5l8702.c b/firmware/target/arm/s5l8702/norboot-s5l8702.c
index 21dc178995..ebca2058e2 100644
--- a/firmware/target/arm/s5l8702/norboot-s5l8702.c
+++ b/firmware/target/arm/s5l8702/norboot-s5l8702.c
@@ -202,6 +202,37 @@ void bootflash_write(int port, int offset, void* addr, int size)
}
}
+/*
+ * SysCfg
+ */
+ssize_t syscfg_read(struct SysCfg* syscfg)
+{
+ const size_t syscfg_hdr_size = sizeof(struct SysCfgHeader);
+ const size_t syscfg_entry_size = sizeof(struct SysCfgEntry);
+
+ bootflash_init(SPI_PORT);
+ bootflash_read(SPI_PORT, 0, syscfg_hdr_size, &syscfg->header);
+
+ if (syscfg->header.magic != SYSCFG_MAGIC) {
+ bootflash_close(SPI_PORT);
+ return -1;
+ }
+
+ const size_t calculated_syscfg_size = syscfg_hdr_size + syscfg_entry_size * syscfg->header.num_entries;
+
+ if (syscfg->header.size != calculated_syscfg_size) {
+ bootflash_close(SPI_PORT);
+ return calculated_syscfg_size;
+ }
+
+ const size_t syscfg_num_entries = MIN(syscfg->header.num_entries, SYSCFG_MAX_ENTRIES);
+ const size_t syscfg_entries_size = syscfg_entry_size * syscfg_num_entries;
+
+ bootflash_read(SPI_PORT, syscfg_hdr_size, syscfg_entries_size, &syscfg->entries);
+ bootflash_close(SPI_PORT);
+
+ return 0;
+}
/*
* IM3
diff --git a/firmware/target/arm/s5l8702/norboot-target.h b/firmware/target/arm/s5l8702/norboot-target.h
index 36b8643d0f..b4688de8e3 100644
--- a/firmware/target/arm/s5l8702/norboot-target.h
+++ b/firmware/target/arm/s5l8702/norboot-target.h
@@ -23,6 +23,7 @@
#include <stdint.h>
#include <stdbool.h>
+#include <sys/types.h>
#include "config.h"
#include "crypto-s5l8702.h"
@@ -90,6 +91,8 @@ void bootflash_close(int port);
/*
* SysCfg
*/
+#define SYSCFG_MAX_ENTRIES 9 // 9 on iPod Classic/6G
+
struct SysCfgHeader {
uint32_t magic; // always 'SCfg'
uint32_t size;
@@ -104,6 +107,11 @@ struct SysCfgEntry {
uint8_t data[0x10];
};
+struct SysCfg {
+ struct SysCfgHeader header;
+ struct SysCfgEntry entries[SYSCFG_MAX_ENTRIES];
+};
+
#define SYSCFG_MAGIC 0x53436667 // SCfg
#define SYSCFG_TAG_SRNM 0x53724e6d // SrNm
@@ -116,6 +124,8 @@ struct SysCfgEntry {
#define SYSCFG_TAG_MODN 0x4d6f6423 // Mod#
#define SYSCFG_TAG_REGN 0x5265676e // Regn
+ssize_t syscfg_read(struct SysCfg* syscfg);
+
/*
* IM3
*/