Also I'm sure you've already mapped this, but the boot logo is at offset 0x24D1C
No, I don't. Another different format... Interesting. But how did You find this logo picture, without knowledge how it is decoded?!
Process, tools, goals
I've started from this topic:
https://reverseengineering.stackexchange.com/questions/14596/c-sky-cpu-reverse-engineering. And don't remember details - I made a lot of attempts and finally got a little confused. I think, it was the "objdump -D -b binary -m csky file.bin" line, with image1 input file, that worked. After getting the listing I focused on it. I think my listing is not ideal - sometime it looks very strange (worse, I couldn't find the full c-sky ISA manual, and the document I've found doesn't have all the commands which I see in the listing). But for the most part the text is understandable - enough for me, I didn't mean to get too deep into it.
A great help in disassembling is the fact that many subroutines contain a commands to load constants from program memory (lrw) - and these constants are most often located immediately after corresponding subroutine (since lrw command have pc relative form). So, code looks like this (from your listing):
801b3c8: 1050 lrw r2, 0x2001dca8 // 0x801b408 - load const 0x2001dca8 from address 0x801b408
...
801b3d2: 102f lrw r1, 0x2001a124 // 0x801b40c - load const 0x2001a124 from address 0x801b40c
...
801b404: 783c jmp r15 // subroutines returns with "jmp r15". And "pop" instruction (I didn't read the manual carefully :-[ )
801b406: 0000 bkpt // padding word - not a command actually, aligns constant block to dword address margin
801b408: dca82001 st.w r5, (r8, 0x4) // not a code, it is referenced at address 801b3c8 as a const. Least word first.
801b40c: a124 st.b r1, (r1, 0x4) // next two lines are not a code again, actually it is dword constant
801b40e: 2001 addi r0, 2 // referenced from 801b3d2
----------------------------
next_func:
801b410: 14d2 push r4-r5, r15 // subroutines often begins with push, but not always.
Sometimes large subroutine contains such a block of constants in the middle, but you can always check for the presence of a corresponding call to the subroutine with the bsr command to this address. This makes it easier to separate the listing into parts.
Also, keep in mind, that most of code jumps relative to PC, but constants are referenced by absolute address. Our fls file consists of two images, the larger one (I didn't look at the smaller one at all) - Image1, our point of interest - loads in the controller at base address 0x8010400, so, for example, if some image located at offset 0x100 from image1 beginning, in code it is referenced by address 0x100 + 0x8010400 = 0x8010500. The last constant is what we should look for (so, offsets from beginning of fls file is not very convenient - you have to constantly recalculate).(Your listing is not affected by this problem) Well, and if You are interested, I can make a short list of functions whose purpose I was able to determine - this also significantly simplifies navigation in the text.
Goals... Initially I wanted to find a way to fix the graphics. But after it became clear that without recompilation it would not be possible to achieve much, and the program was written poorly and chaotically and picking at it became not so fun... I simply continued looking for graphics that had not yet been found - like the generator menu. I think I'll make an editor for this menu, anyway, and then it will probably time to stop. It's a very labor-intensive and time-consuming task, and there's no particular goal in sight, yes, You're right.
Also a few notes for wishlist features - if nothing else, to send to Zeeweii in case there's a non-zero chance that they'll keep working on the firmware:
- Serial data interface - there's no native USB like the DSO2512G but I've been flashing through the USB/serial chip at 2Mbit/s reliably so UART may be quick enough for some realtime data. If the number of UARTs is a constraint, may be possible to reallocate (choose UART between external or the voice chip, etc).
- DMM graphing - seeing DMM values over time would be useful, I'm a little surprised this isn't a more common feature on the 3-in-1 type scope meters.
- CH2 initial position - should be zeroed like CH1 but Zeeweii intentionally places CH2 a little higher when first enabled so you can see that it's there. It gets placed into normal position if you hit Auto after enabling CH2 but still counter-intuitive because the measurements are still correct as though the signal is centered even while the display is offset. This actually is already implemented by @timschuerewegen on the DSO2512G.
- Saved waveforms - move the image counter, currently obscures cursor measurements. Could put it over the battery icon.
I don't think that first two of wishes achievable without Zeeweii's participation. But last two looks like they can be achieved by editing the binary code. I'll have to take a look.
Edit: should probably actually attach the file
I didn't see it at first... I like your listing. At first glance it looks better than the one I got.
I've been poking around just to get more familiar
And, I would say, taught me more than I taught you.

Never heard about Cutter/Rizin (but it looks like the Cutter doesn't support c-sky for real). I'm parsing plain text listing, using Visual Studio Code just as good and fast text editor.