From 063386dcd2dd92d86c9657dab832cca6c1ad9850 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Sat, 18 Sep 2021 16:04:57 +0200 Subject: [PATCH] discover and dump 8 MB RAM on fx-CG 50 --- assets-fx/img/opt_dump.png | Bin 2597 -> 3020 bytes src/gint/dump.c | 42 +++++++++++++++++++++++++++++++------ src/gint/ram.c | 33 ++++++++++++++++------------- 3 files changed, 54 insertions(+), 21 deletions(-) diff --git a/assets-fx/img/opt_dump.png b/assets-fx/img/opt_dump.png index 46a22122150565f143b90db86fd40c6ec703b3f5..7415b3f1e93921092a6661e4560216624030e326 100644 GIT binary patch delta 2987 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 delta 2533 zcmVro-%h zvRk!NhW<(Fvqku^3>R*yRNif!r|{Q!FYh^{Z?fV^HEKL@^E_#$oJzD*lZLdCrJI!F zNrxC~zF9ctd~$i`Mv*-8DY2wd{h2IFnMKPextx4UDK(V*9ZP!q&bQx5gPk>TX-+Jb zxaGe-!(UzScb;Y^QlpfAyqM`zE8@!8aY$aq;;&o=Aj!UPYp=jRp5Kq~3$O(Q+bi=R z!4>ysiQUpqZk0!X!gY<~hhIt5QOl1dmAxCmqyhx7r_xeSQF4})YRLnD7Ln&t^9F&` zT2_M0wUiDv10JzA_egrz=9WL_kqY><(u;u2EDNw|ZSY6xfJ3W)l~!A8y-6EwwiSBm zwYT28bl2RHB2}7n5g9UNjWX(JqYoKl%&}&k1xdEqr_3?uT#G$d4XZ8gUR<%(&b#co z+wNQT*mJJ~eNH{?^do1Sd6s4^TD56c(V*Sgr}g#Swte*)fYF)tVhS$1Ki_ zDq1GU=GbV8E2IvD^`_h`ePj0%xxbBDpw@qdTmC!91&8kcfLso@{0X<;pr-DG=OOk{ zq1QAP)OWYtT>F?S5dYvqF)XZ3ZAZO=<)|shWud2I$r`pq5Ggizh-KgBxS6b{Q zavD5JQG02o5lNVhD%-HXGpwv=yPYXw{TPAAv8|MuNZ{x?!q(F7)v*Xa*Z?NIQ*S!v z!NsI)x4wt%qT?hIE4SCZ(==`yEmeVJvz!^rNbTmdKp`kuLLZBxZ>%Ry510_NU!}Ho zPcc07t*%76iyv9W@^+E=#B>OTE4)jo-B*vceH}hI zrro0CrnaZ;9c+7bg$Q@KnZ@>!zMI91t#5%G`yTqlT>!Z)^C2FwUCV(RQLfOXXOb{s zb0#*@pW6A}GwrN{&|teq6nF9C`wm_C`LTOWHWi*1yorX7gGJdXLiIY2Gg+YY@dki%5Vjo5AO4{Y3IJ!UljJPd zv)4z!&9DGKn3Ux@Z&mmbp)dp~Cv7U0(nTl10k+{e=Zi!;^je1|zWTJYPo*J&%joV& za0wS9@1i@kBNs`3w3hX0Eg^Ol`)G{{K;l<_liWXQW6fSHGhYm~f{)(bq5EPCqNqv$ z>xNU>wt*x4uz_O>_Nj-3$P)6{a?YS=>&(47ahZ z2BSvmr4GHQl|+l&+tRt=p4%Ffgo!ei%bbRXT2_WE!)Ws7a(V-HSyTr5IJ+=)y>;=) z+)rf507sA|_D_hVZ1{mmqIfI@hLydXF!>DJ?0M5lNq4zeGX1RQVl!AE!!L!S=qQ{8SRn$ z8$5@tTW(0zBI=M+xdrI4z?-n&gWN*rHl}2?kwW%W&x^3)1xN2{tx)k$9jIL?yp~_RE zLL5>SH+{UxW9)7}?W@_vQ)a8|7ia|JIbK`?{*vFA(DEfri;T`Az2!Swy}iAr&}&sJ zhtPAxM(z@K$A~4?!}VUiVoTM3dz~P;YHkpBx(iFst~@eu_pe3;`AJa>{sjgYA_MNX z3PX{_%I=l!iEm;n>9r!}cnC`IO z=%T>VK4+REcSSDV2fFGVPBA80oP>)s|i*9%%p5F?}X`i85%pV4U|Tp+GdQm0gC9VTI5rrMp{~M;UI_Ph2pv)*aEY zlgIcW8>&+%quIW3VRa3l!sYMvU_^$a`CN?WG+}hyuDT=X(+??s7U1a3XpP{YK64`7 zp5|qT7VyTN^jac~J24BCx$L7yy3LyueSRIbcBge!^|5AUdME9H!AUw^&K_}PggYYK z@F_OaWtbD_L$q4>i{hC@>B9I5T}v?-8l?FAgu(3G=4;hsL+-QC;<^0l08gUgw>i^w zQy;%%SFK;GjS2gIggnD?i+QWLuTN%@b7>ef1O_6nO83#hh?SrDT(|BE?e*q1xD?xj z{T6U5#vCx=$BqYfJwtEL2-q^?tHZYZzb5#>Y7GAqLhTQ7!$*yCi9n*y9ytF0tOWV2V+UPmjD0& zvPnciR7l6wRzVKHAP5uV|G(@GBnv4r6_SY@mW^4Y6;bNFmr{tRxGV$wxHd4 #include #include +#include +#include #include #include @@ -25,7 +27,8 @@ static struct region const regs[] = { #ifdef FXCG50 { "ROM", 0x80000000, 0x81ffffff, 32 }, - { "RAM", 0x88000000, 0x881fffff, 2 }, + { "RAM_88", 0x88000000, 0x881fffff, 2 }, + { "RAM_8C", 0x8c000000, 0x8c7fffff, 8 }, { "RS", 0xfd800000, 0xfd8007ff, 1 }, #endif }; @@ -65,7 +68,7 @@ static void switch_dump(int region, int segment, char *filename, int *retcode) BFile_Close(fd); } -static int do_dump(int region, int segment) +static int do_dump_smem(int region, int segment) { char filename[30]; int retcode = 0; @@ -76,6 +79,29 @@ static int do_dump(int region, int segment) return retcode; } +static void do_dump_usb(int region) +{ + bool open = usb_is_open(); + if(!open) { + usb_interface_t const *interfaces[] = { &usb_ff_bulk, NULL }; + usb_open(interfaces, GINT_CALL_NULL); + usb_open_wait(); + } + + int size = regs[region].end - regs[region].start + 1; + + usb_fxlink_header_t header; + usb_fxlink_fill_header(&header, "gintctl", "dump", size); + + int pipe = usb_ff_bulk_output(); + usb_write_sync(pipe, &header, sizeof header, 4, false); + usb_write_sync(pipe, (void *)regs[region].start, size, 4, false); + usb_commit_sync(pipe); + + /* Close the USB link if it wasn't open before */ + if(!open) usb_close(); +} + /* gintctl_gint_dump(): Dump memory to filesystem */ void gintctl_gint_dump(void) { @@ -121,9 +147,11 @@ void gintctl_gint_dump(void) if(retcode < 0) row_print(5, 1, "Error %d", retcode); fkey_button(1, "ROM"); - fkey_button(2, "RAM"); - fkey_button(3, "RS"); - fkey_action(6, "DUMP"); + fkey_button(2, "RAM_88"); + fkey_button(3, "RAM_8C"); + fkey_button(4, "RS"); + fkey_action(5, "USB"); + fkey_action(6, "SMEM"); #endif dupdate(); @@ -134,6 +162,7 @@ void gintctl_gint_dump(void) if(key == KEY_F1) select = 0; if(key == KEY_F2) select = 1; if(key == KEY_F3) select = 2; + if(key == KEY_F4 && _(0,1)) select = 3; if(select >= 0 && select == region) { @@ -146,6 +175,7 @@ void gintctl_gint_dump(void) } retcode = 0; - if(key == KEY_F6) retcode = do_dump(region, segment); + if(key == KEY_F5) do_dump_usb(region); + if(key == KEY_F6) retcode = do_dump_smem(region, segment); } } diff --git a/src/gint/ram.c b/src/gint/ram.c index ade99a5..a09aa61 100644 --- a/src/gint/ram.c +++ b/src/gint/ram.c @@ -86,6 +86,8 @@ struct region { uint32_t mem; /* Whether region supports only 32-bit access [input] */ bool use_lword; + /* How often to probe memory (1 in step_size bytes will be tested) */ + int step_size; /* Size of region [output] */ uint32_t size; /* Reason why region is not larger [output] */ @@ -97,7 +99,7 @@ static void explore_region(struct region *r) uint8_t volatile *mem = (void *)r->mem; r->size = 0; - while(r->size < (1 << 20)) + while(r->size < (16 << 20)) { int x = r->use_lword ? writable_lword(mem + r->size) @@ -115,8 +117,7 @@ static void explore_region(struct region *r) if(y) return; } - /* In PXYRAM, skip some longwords to go faster */ - r->size += r->use_lword ? 32 : 4; + r->size += r->step_size; } r->reason = 3; @@ -200,7 +201,7 @@ static void show_region(int y, struct region *r) row_print(y, 2, "%s", r->name); row_print(y, 9, "%08X", r->mem); row_print(y, 18, "%d", r->use_lword ? 32 : 8); - row_print(y, 22, "%d bytes", r->size); + row_print(y, 22, "%d %s", r->size, r->size >= (1000000) ? "B" : "bytes"); row_print(y, 35, reasons[r->reason]); } #endif @@ -209,17 +210,18 @@ static void show_region(int y, struct region *r) void gintctl_gint_ram(void) { struct region r[] = { - { "ILRAM", 0xe5200000, false, 0, 0 }, - { "XRAM", 0xe5007000, false, 0, 0 }, - { "YRAM", 0xe5017000, false, 0, 0 }, - { "PRAM0", 0xfe200000, true, 0, 0 }, - { "XRAM0", 0xfe240000, true, 0, 0 }, - { "YRAM0", 0xfe280000, true, 0, 0 }, - { "PRAM1", 0xfe300000, true, 0, 0 }, - { "XRAM1", 0xfe340000, true, 0, 0 }, - { "YRAM1", 0xfe380000, true, 0, 0 }, - { "X_P2", 0xa5007000, false, 0, 0 }, - { "URAM", 0xa55f0000, false, 0, 0 }, + { "ILRAM", 0xe5200000, false, 4, /**/ 0, 0 }, + { "XRAM", 0xe5007000, false, 4, /**/ 0, 0 }, + { "YRAM", 0xe5017000, false, 4, /**/ 0, 0 }, + { "PRAM0", 0xfe200000, true, 32, /**/ 0, 0 }, + { "XRAM0", 0xfe240000, true, 32, /**/ 0, 0 }, + { "YRAM0", 0xfe280000, true, 32, /**/ 0, 0 }, + { "PRAM1", 0xfe300000, true, 32, /**/ 0, 0 }, + { "XRAM1", 0xfe340000, true, 32, /**/ 0, 0 }, + { "YRAM1", 0xfe380000, true, 32, /**/ 0, 0 }, + { "X_P2", 0xa5007000, false, 4, /**/ 0, 0 }, + { "URAM", 0xa55f0000, false, 4, /**/ 0, 0 }, + { "RAM", 0xac000000, false, 1024, /**/ 0, 0 }, { NULL }, }; @@ -307,6 +309,7 @@ void gintctl_gint_ram(void) { explore_region(&r[9]); explore_region(&r[10]); + explore_region(&r[11]); } #ifdef FX9860G