diff options
author | Vencislav Atanasov <user890104@freemyipod.org> | 2024-06-23 22:58:26 +0300 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2024-06-24 21:00:25 -0400 |
commit | 4691152f9219c5ae8d1fce7c7f7840fe709e5040 (patch) | |
tree | 8cc78462881f69674b6fb2f02166f0ae66f439be | |
parent | c2c8fcb561fef6346f880e3c76a723e9b2d86c7b (diff) | |
download | rockbox-4691152f9219c5ae8d1fce7c7f7840fe709e5040.tar.gz rockbox-4691152f9219c5ae8d1fce7c7f7840fe709e5040.zip |
Add SysCfg viewer for iPod 6G in the debug menu
Change-Id: I4e142f40777c7f8ae58f2b46fc6a3ec4f12aa530
-rw-r--r-- | apps/debug_menu.c | 96 | ||||
-rw-r--r-- | firmware/SOURCES | 7 | ||||
-rw-r--r-- | firmware/target/arm/s5l8702/nor-target.h | 28 |
3 files changed, 127 insertions, 4 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c index 2b14de8714..c5f79a075f 100644 --- a/apps/debug_menu.c +++ b/apps/debug_menu.c | |||
@@ -132,6 +132,10 @@ | |||
132 | #include "rb-loader.h" | 132 | #include "rb-loader.h" |
133 | #endif | 133 | #endif |
134 | 134 | ||
135 | #if defined(IPOD_6G) | ||
136 | #include "nor-target.h" | ||
137 | #endif | ||
138 | |||
135 | #define SCREEN_MAX_CHARS (LCD_WIDTH / SYSFONT_WIDTH) | 139 | #define SCREEN_MAX_CHARS (LCD_WIDTH / SYSFONT_WIDTH) |
136 | 140 | ||
137 | static const char* threads_getname(int selected_item, void *data, | 141 | static const char* threads_getname(int selected_item, void *data, |
@@ -2581,6 +2585,95 @@ static bool dbg_boot_data(void) | |||
2581 | } | 2585 | } |
2582 | #endif /* defined(HAVE_BOOTDATA) && !defined(SIMULATOR) */ | 2586 | #endif /* defined(HAVE_BOOTDATA) && !defined(SIMULATOR) */ |
2583 | 2587 | ||
2588 | #if defined(IPOD_6G) | ||
2589 | #define SYSCFG_MAX_ENTRIES 10 // 9 on iPod Classic/6G | ||
2590 | |||
2591 | static bool dbg_syscfg(void) { | ||
2592 | struct simplelist_info info; | ||
2593 | struct SysCfgHeader syscfg_hdr; | ||
2594 | size_t syscfg_hdr_size = sizeof(struct SysCfgHeader); | ||
2595 | size_t syscfg_entry_size = sizeof(struct SysCfgEntry); | ||
2596 | struct SysCfgEntry syscfg_entries[SYSCFG_MAX_ENTRIES]; | ||
2597 | |||
2598 | simplelist_info_init(&info, "SysCfg NOR contents", 1, NULL); | ||
2599 | simplelist_set_line_count(0); | ||
2600 | |||
2601 | bootflash_init(SPI_PORT); | ||
2602 | bootflash_read(SPI_PORT, 0, syscfg_hdr_size, &syscfg_hdr); | ||
2603 | |||
2604 | if (syscfg_hdr.magic != SYSCFG_MAGIC) { | ||
2605 | simplelist_addline("SCfg magic not found"); | ||
2606 | bootflash_close(SPI_PORT); | ||
2607 | return simplelist_show_list(&info); | ||
2608 | } | ||
2609 | |||
2610 | simplelist_addline("Total size: %u bytes", syscfg_hdr.size); | ||
2611 | simplelist_addline("Entries: %u", syscfg_hdr.num_entries); | ||
2612 | |||
2613 | size_t calculated_syscfg_size = syscfg_hdr_size + syscfg_entry_size * syscfg_hdr.num_entries; | ||
2614 | |||
2615 | if (syscfg_hdr.size != calculated_syscfg_size) { | ||
2616 | simplelist_addline("Wrong size: expected %u, got %u", calculated_syscfg_size, syscfg_hdr.size); | ||
2617 | bootflash_close(SPI_PORT); | ||
2618 | return simplelist_show_list(&info); | ||
2619 | } | ||
2620 | |||
2621 | if (syscfg_hdr.num_entries > SYSCFG_MAX_ENTRIES) { | ||
2622 | simplelist_addline("Too many entries, showing first %u", syscfg_hdr.num_entries); | ||
2623 | } | ||
2624 | |||
2625 | size_t syscfg_num_entries = MIN(syscfg_hdr.num_entries, SYSCFG_MAX_ENTRIES); | ||
2626 | size_t syscfg_entries_size = syscfg_entry_size * syscfg_num_entries; | ||
2627 | |||
2628 | bootflash_read(SPI_PORT, syscfg_hdr_size, syscfg_entries_size, &syscfg_entries); | ||
2629 | bootflash_close(SPI_PORT); | ||
2630 | |||
2631 | for (size_t i = 0; i < syscfg_num_entries; i++) { | ||
2632 | struct SysCfgEntry* entry = &syscfg_entries[i]; | ||
2633 | char* tag = (char *)&entry->tag; | ||
2634 | uint32_t* data32 = (uint32_t *)entry->data; | ||
2635 | |||
2636 | switch (entry->tag) { | ||
2637 | case SYSCFG_TAG_SRNM: | ||
2638 | simplelist_addline("Serial number (SrNm): %s", entry->data); | ||
2639 | break; | ||
2640 | case SYSCFG_TAG_FWID: | ||
2641 | simplelist_addline("Firmware ID (FwId): %07X", data32[1] & 0x0FFFFFFF); | ||
2642 | break; | ||
2643 | case SYSCFG_TAG_HWID: | ||
2644 | simplelist_addline("Hardware ID (HwId): %08X", data32[0]); | ||
2645 | break; | ||
2646 | case SYSCFG_TAG_HWVR: | ||
2647 | simplelist_addline("Hardware version (HwVr): %06X", data32[1]); | ||
2648 | break; | ||
2649 | case SYSCFG_TAG_CODC: | ||
2650 | simplelist_addline("Codec (Codc): %s", entry->data); | ||
2651 | break; | ||
2652 | case SYSCFG_TAG_SWVR: | ||
2653 | simplelist_addline("Software version (SwVr): %s", entry->data); | ||
2654 | break; | ||
2655 | case SYSCFG_TAG_MLBN: | ||
2656 | simplelist_addline("Logic board serial number (MLBN): %s", entry->data); | ||
2657 | break; | ||
2658 | case SYSCFG_TAG_MODN: | ||
2659 | simplelist_addline("Model number (Mod#): %s", entry->data); | ||
2660 | break; | ||
2661 | case SYSCFG_TAG_REGN: | ||
2662 | simplelist_addline("Sales region (Regn): %08X %08X", data32[0], data32[1]); | ||
2663 | break; | ||
2664 | default: | ||
2665 | simplelist_addline("%c%c%c%c: %08X %08X %08X %08X", | ||
2666 | tag[3], tag[2], tag[1], tag[0], | ||
2667 | data32[0], data32[1], data32[2], data32[3] | ||
2668 | ); | ||
2669 | break; | ||
2670 | } | ||
2671 | } | ||
2672 | |||
2673 | return simplelist_show_list(&info); | ||
2674 | } | ||
2675 | #endif | ||
2676 | |||
2584 | /****** The menu *********/ | 2677 | /****** The menu *********/ |
2585 | static const struct { | 2678 | static const struct { |
2586 | unsigned char *desc; /* string or ID */ | 2679 | unsigned char *desc; /* string or ID */ |
@@ -2691,6 +2784,9 @@ static const struct { | |||
2691 | #if defined(HAVE_BOOTDATA) && !defined(SIMULATOR) | 2784 | #if defined(HAVE_BOOTDATA) && !defined(SIMULATOR) |
2692 | {"Boot data", dbg_boot_data }, | 2785 | {"Boot data", dbg_boot_data }, |
2693 | #endif | 2786 | #endif |
2787 | #if defined(IPOD_6G) | ||
2788 | {"View SysCfg", dbg_syscfg }, | ||
2789 | #endif | ||
2694 | }; | 2790 | }; |
2695 | 2791 | ||
2696 | static int menu_action_callback(int btn, struct gui_synclist *lists) | 2792 | static int menu_action_callback(int btn, struct gui_synclist *lists) |
diff --git a/firmware/SOURCES b/firmware/SOURCES index e827f964f5..b836601ed3 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES | |||
@@ -1568,6 +1568,9 @@ target/arm/s5l8702/clocking-s5l8702.c | |||
1568 | target/arm/s5l8702/ipod6g/lcd-6g.c | 1568 | target/arm/s5l8702/ipod6g/lcd-6g.c |
1569 | target/arm/s5l8702/ipod6g/lcd-asm-6g.S | 1569 | target/arm/s5l8702/ipod6g/lcd-asm-6g.S |
1570 | target/arm/s5l8702/ipod6g/piezo-6g.c | 1570 | target/arm/s5l8702/ipod6g/piezo-6g.c |
1571 | target/arm/s5l8702/spi-s5l8702.c | ||
1572 | target/arm/s5l8702/crypto-s5l8702.c | ||
1573 | target/arm/s5l8702/nor-s5l8702.c | ||
1571 | #if 0 //TODO | 1574 | #if 0 //TODO |
1572 | target/arm/s5l8702/postmortemstub.S | 1575 | target/arm/s5l8702/postmortemstub.S |
1573 | #endif | 1576 | #endif |
@@ -1587,10 +1590,6 @@ target/arm/s5l8702/debug-s5l8702.c | |||
1587 | target/arm/s5l8702/pcm-s5l8702.c | 1590 | target/arm/s5l8702/pcm-s5l8702.c |
1588 | target/arm/s5l8702/ipod6g/audio-6g.c | 1591 | target/arm/s5l8702/ipod6g/audio-6g.c |
1589 | target/arm/s5l8702/ipod6g/cscodec-6g.c | 1592 | target/arm/s5l8702/ipod6g/cscodec-6g.c |
1590 | #else | ||
1591 | target/arm/s5l8702/spi-s5l8702.c | ||
1592 | target/arm/s5l8702/crypto-s5l8702.c | ||
1593 | target/arm/s5l8702/nor-s5l8702.c | ||
1594 | #endif /* BOOTLOADER */ | 1593 | #endif /* BOOTLOADER */ |
1595 | #endif /* IPOD_6G */ | 1594 | #endif /* IPOD_6G */ |
1596 | 1595 | ||
diff --git a/firmware/target/arm/s5l8702/nor-target.h b/firmware/target/arm/s5l8702/nor-target.h index 4ebe1d58d4..3d2790d123 100644 --- a/firmware/target/arm/s5l8702/nor-target.h +++ b/firmware/target/arm/s5l8702/nor-target.h | |||
@@ -87,6 +87,34 @@ int bootflash_compare(int port, int offset, void* addr, int size); | |||
87 | void bootflash_erase_blocks(int port, int first, int n); | 87 | void bootflash_erase_blocks(int port, int first, int n); |
88 | void bootflash_close(int port); | 88 | void bootflash_close(int port); |
89 | 89 | ||
90 | /* | ||
91 | * SysCfg | ||
92 | */ | ||
93 | struct SysCfgHeader { | ||
94 | uint32_t magic; // always 'SCfg' | ||
95 | uint32_t size; | ||
96 | uint32_t unknown1; // 0x00000200 on iPod classic | ||
97 | uint32_t version; // maybe? 0x00010001 on iPod classic | ||
98 | uint32_t unknown2; // 0x00000000 on iPod classic | ||
99 | uint32_t num_entries; | ||
100 | }; // 0x18 | ||
101 | |||
102 | struct SysCfgEntry { | ||
103 | uint32_t tag; | ||
104 | uint8_t data[0x10]; | ||
105 | }; | ||
106 | |||
107 | #define SYSCFG_MAGIC 0x53436667 // SCfg | ||
108 | |||
109 | #define SYSCFG_TAG_SRNM 0x53724e6d // SrNm | ||
110 | #define SYSCFG_TAG_FWID 0x46774964 // FwId | ||
111 | #define SYSCFG_TAG_HWID 0x48774964 // HwId | ||
112 | #define SYSCFG_TAG_HWVR 0x48775672 // HwVr | ||
113 | #define SYSCFG_TAG_CODC 0x436f6463 // Codc | ||
114 | #define SYSCFG_TAG_SWVR 0x53775672 // SwVr | ||
115 | #define SYSCFG_TAG_MLBN 0x4d4c424e // MLBN | ||
116 | #define SYSCFG_TAG_MODN 0x4d6f6423 // Mod# | ||
117 | #define SYSCFG_TAG_REGN 0x5265676e // Regn | ||
90 | 118 | ||
91 | /* | 119 | /* |
92 | * IM3 | 120 | * IM3 |