RT-4D: реверс прошивки, русификация, кастомный UI, флешеры
- Полный RE стока V3.25 (Cortex-M4F) + FM100B: карта памяти, протокол, codeplug, UI-архитектура - Русификация: свой CP1251-шрифт + патч рендера, перевод меню и надписей, ребренд Ru-4D V3.25 - Блюпринт переделки UI + C-тулчейн (clang thumbv7em), доказан инъекцией - Готовые флешеры: WebSerial .html и Windows .exe со вшитой прошивкой - Дамп SPI рации, стоковая прошивка, инструменты сборки Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Этот коммит содержится в:
@@ -0,0 +1,47 @@
|
||||
/* RT-4D custom UI layer (Phase 1: custom standby/home screen).
|
||||
* Compiled with clang --target=thumbv7em, linked at 0x08029000, injected over
|
||||
* the russified stock image. Calls stock SDK functions by absolute address.
|
||||
* Reads only RAM caches + calls display/ADC primitives -> codeplug & CPS untouched.
|
||||
*/
|
||||
typedef unsigned char u8;
|
||||
typedef unsigned short u16;
|
||||
typedef unsigned int u32;
|
||||
|
||||
/* --- stock SDK (thumb entry = addr|1) --- */
|
||||
#define DRAW_STRING ((void (*)(u8 pg, u8 x, const void *s, u16 n, u8 mode))0x08008A51)
|
||||
#define STOCK_DRAW ((void (*)(void))0x0801E1BD) /* ui_draw_dispatch */
|
||||
|
||||
/* --- RAM state --- */
|
||||
#define GSCR (*(volatile u8 *)0x200008B3) /* current screen id */
|
||||
#define GDISP ((volatile u8 *)0x200009C3) /* home display struct */
|
||||
|
||||
/* draw one full-width (18-char) space-padded line from a source field.
|
||||
* Full-coverage fixed-width paint => no clear needed, no flicker. */
|
||||
static void line_field(u8 pg, const volatile u8 *src, int n)
|
||||
{
|
||||
char b[18];
|
||||
int i;
|
||||
for (i = 0; i < 18; i++) {
|
||||
u8 c = (i < n) ? src[i] : 0x20;
|
||||
if (c == 0 || c == 0xFF) c = 0x20; /* pad -> space */
|
||||
b[i] = (char)c;
|
||||
}
|
||||
DRAW_STRING(pg, 0, b, 18, 0);
|
||||
}
|
||||
|
||||
static void my_home(void)
|
||||
{
|
||||
line_field(0, GDISP + 0x00, 16); /* line 0: name / mode tag */
|
||||
line_field(2, GDISP + 0x20, 16); /* line 1: Area A freq/chan */
|
||||
line_field(4, GDISP + 0x32, 16); /* line 2: Area B */
|
||||
line_field(6, GDISP + 0x15, 7); /* line 3: CH-/A-/D- prefix */
|
||||
}
|
||||
|
||||
/* hooked in at the ui_tick_normal draw dispatch (bl @0x080207E6). */
|
||||
void my_draw_router(void)
|
||||
{
|
||||
if (GSCR == 0)
|
||||
my_home(); /* our custom home screen */
|
||||
else
|
||||
STOCK_DRAW(); /* stock draws all other screens */
|
||||
}
|
||||
Ссылка в новой задаче
Block a user