source: trunk/platform/sx30/sub/100e/boot.c @ 1124

Revision 1124, 28.5 KB checked in by reyalP, 2 years ago (diff)

exmem improvements, experimental support for loading CHDK binary in exmem - from philmoz in http://chdk.setepontos.com/index.php?topic=650.msg63808#msg63808

  • Property svn:eol-style set to native
Line 
1#include "lolevel.h"
2#include "platform.h"
3#include "core.h"
4#include "dryos31.h"
5
6#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
7
8const char * const new_sa = &_end;
9
10// Forward declarations
11void CreateTask_PhySw();
12void CreateTask_spytask();
13extern volatile int jogdial_stopped;
14void JogDial_task_my(void);
15
16//void __attribute__((naked,noinline)) my_blinker(int n) {
17//      asm volatile (
18//"                STMFD   SP!, {R0-R5,LR}\n"
19//);
20//      int i, j;
21//      for (j=0; j<n; j++)
22//      {
23//              *((volatile int *) 0xC0220134) = 0x46; // Turn on LED
24//              for (i=0; i<0x200000; i++) { asm volatile ( "nop\n" ); }
25//
26//              *((volatile int *) 0xC0220134) = 0x44; // Turn off LED
27//              for (i=0; i<0x200000; i++) { asm volatile ( "nop\n" ); }
28//      }
29//      for (i=0; i<0x900000; i++) { asm volatile ( "nop\n" ); }
30//      asm volatile (
31//"                LDMFD   SP!, {R0-R5,PC}\n"
32//      );
33//}
34
35extern void task_CaptSeq();
36extern void task_InitFileModules();
37extern void task_RotaryEncoder();
38extern void task_MovieRecord();
39extern void task_ExpDrv();
40
41void taskHook(context_t **context)
42{
43        task_t *tcb=(task_t*)((char*)context-offsetof(task_t, context));
44
45        // Replace firmware task addresses with ours
46        if(tcb->entry == (void*)task_CaptSeq)                   tcb->entry = (void*)capt_seq_task;
47        if(tcb->entry == (void*)task_InitFileModules)   tcb->entry = (void*)init_file_modules_task;
48        if(tcb->entry == (void*)task_RotaryEncoder)             tcb->entry = (void*)JogDial_task_my;
49        if(tcb->entry == (void*)task_MovieRecord)               tcb->entry = (void*)movie_record_task;
50        if(tcb->entry == (void*)task_ExpDrv)                    tcb->entry = (void*)exp_drv_task;
51}
52
53/*---------------------------------------------------------------------
54  Memory Map:
55        0001900     MEMBASEADDR             start of data - used for initialized vars
56        00108B7                             end of inited data
57        00108B8                             start of bss - used for zeroed/uninited vars
58        018124B                             end of bss
59        018124C     MEMISOSTART             start of our data / bss
60
61        0400000                             raw buffers
62        8000000                             end of raw buffers
63
64        C0xxxxxx                            I/O
65
66        FF810000    ROMBASEADDR             start of rom
67        FFFFFFFF                            end of rom
68----------------------------------------------------------------------*/
69
70/*----------------------------------------------------------------------
71        boot()
72
73        Main entry point for the CHDK code
74-----------------------------------------------------------------------*/
75
76void __attribute__((naked,noinline)) boot() {
77
78    asm volatile (
79                 "LDR     R1, =0xC0410000\n"
80                 "MOV     R0, #0\n"
81                 "STR     R0, [R1]\n"
82                 "MOV     R1, #0x78\n"
83                 "MCR     p15, 0, R1,c1,c0\n"
84                 "MOV     R1, #0\n"
85                 "MCR     p15, 0, R1,c7,c10, 4\n"
86                 "MCR     p15, 0, R1,c7,c5\n"
87                 "MCR     p15, 0, R1,c7,c6\n"
88                 "MOV     R0, #0x3D\n"
89                 "MCR     p15, 0, R0,c6,c0\n"
90                 "MOV     R0, #0xC000002F\n"
91                 "MCR     p15, 0, R0,c6,c1\n"
92                 "MOV     R0, #0x35\n"
93                 "MCR     p15, 0, R0,c6,c2\n"
94                 "MOV     R0, #0x40000035\n"
95                 "MCR     p15, 0, R0,c6,c3\n"
96                 "MOV     R0, #0x80000017\n"
97                 "MCR     p15, 0, R0,c6,c4\n"
98                 "LDR     R0, =0xFF80002D\n"
99                 "MCR     p15, 0, R0,c6,c5\n"
100                 "MOV     R0, #0x34\n"
101                 "MCR     p15, 0, R0,c2,c0\n"
102                 "MOV     R0, #0x34\n"
103                 "MCR     p15, 0, R0,c2,c0, 1\n"
104                 "MOV     R0, #0x34\n"
105                 "MCR     p15, 0, R0,c3,c0\n"
106                 "LDR     R0, =0x3333330\n"
107                 "MCR     p15, 0, R0,c5,c0, 2\n"
108                 "LDR     R0, =0x3333330\n"
109                 "MCR     p15, 0, R0,c5,c0, 3\n"
110                 "MRC     p15, 0, R0,c1,c0\n"
111                 "ORR     R0, R0, #0x1000\n"
112                 "ORR     R0, R0, #4\n"
113                 "ORR     R0, R0, #1\n"
114                 "MCR     p15, 0, R0,c1,c0\n"
115                 "MOV     R1, #0x80000006\n"
116                 "MCR     p15, 0, R1,c9,c1\n"
117                 "MOV     R1, #6\n"
118                 "MCR     p15, 0, R1,c9,c1, 1\n"
119                 "MRC     p15, 0, R1,c1,c0\n"
120                 "ORR     R1, R1, #0x50000\n"
121                 "MCR     p15, 0, R1,c1,c0\n"
122                 "LDR     R2, =0xC0200000\n"
123                 "MOV     R1, #1\n"
124                 "STR     R1, [R2,#0x10C]\n"
125                 "MOV     R1, #0xFF\n"
126                 "STR     R1, [R2,#0xC]\n"
127                 "STR     R1, [R2,#0x1C]\n"
128                 "STR     R1, [R2,#0x2C]\n"
129                 "STR     R1, [R2,#0x3C]\n"
130                 "STR     R1, [R2,#0x4C]\n"
131                 "STR     R1, [R2,#0x5C]\n"
132                 "STR     R1, [R2,#0x6C]\n"
133                 "STR     R1, [R2,#0x7C]\n"
134                 "STR     R1, [R2,#0x8C]\n"
135                 "STR     R1, [R2,#0x9C]\n"
136                 "STR     R1, [R2,#0xAC]\n"
137                 "STR     R1, [R2,#0xBC]\n"
138                 "STR     R1, [R2,#0xCC]\n"
139                 "STR     R1, [R2,#0xDC]\n"
140                 "STR     R1, [R2,#0xEC]\n"
141                 "STR     R1, [R2,#0xFC]\n"
142                 "LDR     R1, =0xC0400008\n"
143                 "LDR     R2, =0x430005\n"
144                 "STR     R2, [R1]\n"
145                 "MOV     R1, #1\n"
146                 "LDR     R2, =0xC0243100\n"
147                 "STR     R2, [R1]\n"
148                 "LDR     R2, =0xC0242010\n"
149                 "LDR     R1, [R2]\n"
150                 "ORR     R1, R1, #1\n"
151                 "STR     R1, [R2]\n"
152
153                 "LDR     R0, =0xFFC906C8\n"
154                 "LDR     R1, =0x1900\n"
155                 "LDR     R3, =0x108B8\n"
156 "loc_FF81013C:\n"
157                 "CMP     R1, R3\n"
158                 "LDRCC   R2, [R0],#4\n"
159                 "STRCC   R2, [R1],#4\n"
160                 "BCC     loc_FF81013C\n"
161                 "LDR     R1, =0x18124C\n"
162                 "MOV     R2, #0\n"
163 "loc_FF810154:\n"
164                 "CMP     R3, R1\n"
165                 "STRCC   R2, [R3],#4\n"
166                 "BCC     loc_FF810154\n"
167                 "B       sub_FF810354_my" // -->
168    );
169}
170
171void __attribute__((naked,noinline)) sub_FF810354_my() {
172
173        //http://chdk.setepontos.com/index.php/topic,4194.0.html
174        *(int*)0x1938=(int)taskHook;
175        *(int*)0x193C=(int)taskHook;    // need this for startup in Playback mode (otherwise init_file_modules_task doesn't hook properly)
176   
177        // replacement of sub_FF834740 for correct power-on.
178        *(int*)(0x2574) = (*(int*)0xC0220128)&1 ? 0x200000 : 0x100000;
179
180        asm volatile (
181                 "LDR     R0, =0xFF8103CC\n"
182                 "MOV     R1, #0\n"
183                 "LDR     R3, =0xFF810404\n"
184 "loc_FF810360:\n"
185                 "CMP     R0, R3\n"
186                 "LDRCC   R2, [R0],#4\n"
187                 "STRCC   R2, [R1],#4\n"
188                 "BCC     loc_FF810360\n"
189                 "LDR     R0, =0xFF810404\n"
190                 "MOV     R1, #0x4B0\n"
191                 "LDR     R3, =0xFF810618\n"
192 "loc_FF81037C:\n"
193                 "CMP     R0, R3\n"
194                 "LDRCC   R2, [R0],#4\n"
195                 "STRCC   R2, [R1],#4\n"
196                 "BCC     loc_FF81037C\n"
197                 "MOV     R0, #0xD2\n"
198                 "MSR     CPSR_cxsf, R0\n"
199                 "MOV     SP, #0x1000\n"
200                 "MOV     R0, #0xD3\n"
201                 "MSR     CPSR_cxsf, R0\n"
202                 "MOV     SP, #0x1000\n"
203                 "LDR     R0, =0x6C4\n"
204                 "LDR     R2, =0xEEEEEEEE\n"
205                 "MOV     R3, #0x1000\n"
206 "loc_FF8103B0:\n"
207                 "CMP     R0, R3\n"
208                 "STRCC   R2, [R0],#4\n"
209                 "BCC     loc_FF8103B0\n"
210//                 "BL      sub_FF811198\n"
211                 "BL      sub_FF811198_my\n" // -->
212     );
213}
214
215void __attribute__((naked,noinline)) sub_FF811198_my() {
216
217     asm volatile (
218                 "STR     LR, [SP,#-4]!\n"
219                 "SUB     SP, SP, #0x74\n"
220                 "MOV     R0, SP\n"
221                 "MOV     R1, #0x74\n"
222                 "BL      sub_FFB924E8\n"
223                 "MOV     R0, #0x53000\n"
224                 "STR     R0, [SP,#4]\n"
225                                 
226#if defined(OPT_CHDK_IN_EXMEM)
227               "LDR     R0, =0x18124C\n" // use original heap offset since CHDK is loaded in high memory
228#else
229               "LDR     R0, =new_sa\n"   // otherwise use patched value
230               "LDR     R0, [R0]\n"      //
231#endif
232                                 
233"               LDR     R1, =0x379C00 \n"
234"               STR     R0, [SP,#8] \n"
235"               RSB     R0, R0, #0x1F80 \n"
236"               ADD     R0, R0, #0x370000 \n"
237"               STR     R0, [SP,#0x0c] \n"
238"               LDR     R0, =0x371F80 \n"
239"               STR     R1, [SP,#0] \n"
240"               STRD    R0, [SP,#0x10] \n"
241"               MOV     R0, #0x22 \n"
242"               STR     R0, [SP,#0x18] \n"
243"               MOV     R0, #0x68 \n"
244"               STR     R0, [SP,#0x1c] \n"
245"               LDR     R0, =0x19B \n"
246
247//"             LDR     R1, =0xFF815EE0 \n"
248"               LDR     R1, =sub_FF815EE0_my \n"                // patched
249
250"               B               sub_FF8111F0 \n"                // Continue in firmware
251     );
252}
253
254void __attribute__((naked,noinline)) sub_FF815EE0_my() {
255
256        asm volatile (
257"               STMFD   SP!, {R4,LR} \n"
258"               BL      sub_FF810B20 \n"
259"               BL      sub_FF81A33C \n"                                // dmSetup
260"               CMP     R0, #0 \n"
261
262//"             ADRLT   R0, aDmsetup \n"                        // "dmSetup"
263"               LDRLT   r0, =0xFF815FF4 \n"
264
265"               BLLT    _err_init_task \n"
266"               BL      sub_FF815B1C \n"
267"               CMP     R0, #0 \n"
268
269//"             ADRLT   R0, aTermdriverinit \n"         // "termDriverInit"
270"               LDRLT   R0, =0xFF815FFC \n"
271
272"               BLLT    _err_init_task \n"
273
274//"             ADR     R0, a_term \n"                                  // "/_term"
275"               LDR     R0, =0xFF81600C \n"
276
277"               BL      sub_FF815C04 \n"                                // termDeviceCreate
278"               CMP     R0, #0 \n"
279
280//"             ADRLT   R0, aTermdevicecrea \n"         // "termDeviceCreate"
281"               LDRLT   R0, =0xFF816014 \n"
282
283"               BLLT    _err_init_task \n"
284
285//"             ADR     R0, a_term \n"                                  // "/_term"
286"               LDR     R0, =0xFF81600C \n"
287
288"               BL      sub_FF813CA4 \n"
289"               CMP     R0, #0 \n"
290
291//"             ADRLT   R0, aStdiosetup \n"                     // "stdioSetup"
292"               LDRLT   R0, =0xFF816028 \n"
293
294"               BLLT    _err_init_task \n"
295"               BL      sub_FF819CC4 \n"
296"               CMP     R0, #0 \n"
297
298//"             ADRLT   R0, aStdlibsetup \n"            // "stdlibSetup"
299"               LDRLT   R0, =0xFF816034 \n"
300
301"               BLLT    _err_init_task \n"
302"               BL      sub_FF81167C \n"
303"               CMP     R0, #0 \n"
304
305//"             ADRLT   R0, aArmlib_setup \n"           // "armlib_setup"
306"               LDRLT   R0, =0xFF816040 \n"
307
308"               BLLT    _err_init_task \n"
309
310"               LDMFD   SP!, {R4,LR} \n"
311
312//"             B       sub_FF81FB54 \n"                                // taskcreate_Startup
313"               B       taskcreate_Startup_my \n"               // patched
314        );
315};
316
317void __attribute__((naked,noinline)) taskcreate_Startup_my() {
318
319        asm volatile (
320                "STMFD  SP!, {R3,LR}\n"
321//              "BL             j_nullsub_234\n"
322                "BL             sub_FF83C880\n"
323                "CMP    R0, #0\n"
324                "BNE    loc_FF81FB98\n"
325                "BL             sub_FF836160\n"
326                "CMP    R0, #0\n"
327                "BNE    loc_FF81FB98\n"
328                "BL             sub_FF834734\n"
329                "CMP    R0, #0\n"
330                "BNE    loc_FF81FB98\n"
331                "BL             sub_FF833DDC\n"
332                "LDR    R1, =0xC0220000\n"
333                "MOV    R0, #0x44\n"
334                "STR    R0, [R1,#0x1C]\n"
335                "BL             sub_FF833FCC\n"
336               
337"loc_FF81FB94:\n"
338                "B              loc_FF81FB94\n"
339               
340"loc_FF81FB98:\n"
341//              "BL             sub_FF834740\n"         // see begin of sub_FF810354_my()
342//              "BL             j_nullsub_235\n"
343                "BL             sub_FF83AA94\n"
344                "LDR    R1, =0x3CE000\n"
345                "MOV    R0, #0\n"
346                "BL             sub_FF83AEDC\n"
347                "BL             sub_FF83AC88\n" // KerSys
348                "MOV    R3, #0\n"
349                "STR    R3, [SP]\n"
350
351                //"ADR     R3, task_Startup\n"
352                "LDR    R3, =task_Startup_my\n" // patched
353
354                "B              sub_FF81FBC0\n" // Continue in firmware
355     );
356}
357
358void __attribute__((naked,noinline)) task_Startup_my() {
359
360        asm volatile (
361                "STMFD  SP!, {R4,LR}\n"
362                "BL             sub_FF816594\n" // taskcreate_ClockSave\n"
363                "BL             sub_FF835894\n"
364                "BL             sub_FF8339A4\n"
365//              "BL     j_nullsub_238\n"
366                "BL             sub_FF83CAB0\n"
367//              "BL             sub_FF83C958\n" // start diskboot.bin
368                "BL             sub_FF83CC54\n"
369                "BL             sub_FF832474\n"
370                "BL             sub_FF83CAE0\n"
371                "BL             sub_FF83A238\n"
372                "BL             sub_FF83CC58\n"
373
374                "BL             CreateTask_spytask\n" // added
375
376//              "BL             sub_FF83461C\n" //taskcreate_PhySw\n"
377                "BL             taskcreatePhySw_my\n"  // we do this here rather than hook so we don't waste the original stack
378
379                "B              sub_FF81FB24\n"         // Continue in firmware
380     );
381}
382
383void __attribute__((naked,noinline)) taskcreatePhySw_my() {
384        asm volatile (
385"                STMFD   SP!, {R3-R5,LR}\n"
386"                LDR     R4, =0x1C30\n"
387"                LDR     R0, [R4,#0x10]\n"
388"                CMP     R0, #0\n"
389"                BNE     sub_FF834650\n"
390"                MOV     R3, #0\n"
391"                STR     R3, [SP]\n"
392"                LDR     R3, =mykbd_task\n" // task_PhySw
393//"                MOV     R2, #0x800\n"
394"                MOV     R2, #0x2000\n" // stack size for new task_PhySw so we don't have to do stack switch
395"                               B       sub_FF834640 \n" // continue in firmware
396        );
397}
398
399/*----------------------------------------------------------------------
400        spytask
401-----------------------------------------------------------------------*/
402void spytask(long ua, long ub, long uc, long ud, long ue, long uf)
403{
404    core_spytask();
405}
406
407/*----------------------------------------------------------------------
408        CreateTask_spytask
409-----------------------------------------------------------------------*/
410void CreateTask_spytask() {
411        _CreateTask("SpyTask", 0x19, 0x2000, spytask, 0);
412}
413
414 ///*----------------------------------------------------------------------
415 // @ FF8A3B4C
416void __attribute__((naked,noinline)) init_file_modules_task() {
417 asm volatile(
418                 "STMFD   SP!, {R4-R6,LR}\n"
419                 "BL      sub_FF89A294\n"
420                 "LDR     R5, =0x5006\n"
421                 "MOVS    R4, R0\n"
422                 "MOVNE   R1, #0\n"
423                 "MOVNE   R0, R5\n"
424                 "BLNE    _eventproc_export_PostLogicalEventToUI\n"
425
426                                 //"BL      sub_FF89A2C0\n"
427                 "BL      sub_FF89A2C0_my\n"                    // patched
428
429                 "BL      core_spytask_can_start\n"      // CHDK: Set "it's-safe-to-start" flag for spytask
430
431                                 "B                     sub_FF8A3B6C\n" // Continue in firmware
432 );
433}
434
435void __attribute__((naked,noinline)) sub_FF89A2C0_my() {
436 asm volatile(
437                 "STMFD   SP!, {R4,LR}\n"
438                                 "MOV     R0, #3\n"
439
440                 //"BL      sub_FF876E1C\n"
441                 "BL      sub_FF876E1C_my\n"    // patched
442
443                                 "B             sub_FF89A2CC\n" // Continue in firmware
444 );
445}
446
447void __attribute__((naked,noinline)) sub_FF876E1C_my() {
448 asm volatile(
449                "STMFD  SP!, {R4-R8,LR}\n"
450                "MOV    R8, R0\n"
451                "BL             sub_FF876D9C\n"
452                "LDR    R1, =0x3A738\n"
453                "MOV    R6, R0\n"
454                "ADD    R4, R1, R0,LSL#7\n"
455                "LDR    R0, [R4,#0x6C]\n"
456                "CMP    R0, #4\n"
457                "LDREQ  R1, =0x83f\n"
458                "LDREQ  R0, =0xFF8768DC\n"      //=aMounter_c
459                "BLEQ   _DebugAssert\n"
460                "MOV    R1, R8\n"
461                "MOV    R0, R6\n"
462                "BL             sub_FF876650\n"
463                "LDR    R0, [R4,#0x38]\n"
464                "BL             sub_FF8774C0\n"
465                "CMP    R0, #0\n"
466                "STREQ  R0, [R4,#0x6C]\n"
467                "MOV    R0, R6\n"
468                "BL             sub_FF8766E0\n"
469                "MOV    R0, R6\n"
470
471                //"BL           sub_FF876A44\n"
472                "BL             sub_FF876A44_my\n"    // patched
473
474                "B              sub_FF876E74\n" // Continue in firmware
475 );
476}
477
478void __attribute__((naked,noinline)) sub_FF876A44_my() {
479 asm volatile(
480                "STMFD  SP!, {R4-R6,LR}\n"
481                "MOV    R5, R0\n"
482                "LDR    R0, =0x3A738\n"
483                "ADD    R4, R0, R5,LSL#7\n"
484                "LDR    R0, [R4,#0x6C]\n"
485                "TST    R0, #2\n"
486                "MOVNE  R0, #1\n"
487                "LDMNEFD        SP!, {R4-R6,PC}\n"
488                "LDR    R0, [R4,#0x38]\n"
489                "MOV    R1, R5\n"
490
491                //"BL           sub_FF876764\n"
492                "BL             sub_FF876764_my\n"    // patched
493
494                "B              sub_FF876A70\n" // Continue in firmware
495 );
496}
497//------------------------------------------------------------------
498void __attribute__((naked,noinline)) sub_FF876764_my() {
499 asm volatile(
500                "STMFD  SP!, {R4-R10,LR}\n"
501                "MOV    R9, R0\n"
502                "LDR    R0, =0x3A738\n"
503                "MOV    R8, #0\n"
504                "ADD    R5, R0, R1,LSL#7\n"
505                "LDR    R0, [R5,#0x3C]\n"
506                "MOV    R7, #0\n"
507                "CMP    R0, #7\n"
508                "MOV    R6, #0\n"
509                "ADDLS  PC, PC, R0,LSL#2\n"
510                                "B      loc_FF8768BC\n"
511"loc_FF876790:   B      loc_FF8767C8\n"
512"loc_FF876794:   B      loc_FF8767B0\n"
513"loc_FF876798:   B      loc_FF8767B0\n"
514"loc_FF87679C:   B      loc_FF8767B0\n"
515"loc_FF8767A0:   B      loc_FF8767B0\n"
516"loc_FF8767A4:   B      loc_FF8768B4\n"
517"loc_FF8767A8:   B      loc_FF8767B0\n"
518"loc_FF8767AC:   B      loc_FF8767B0\n"
519"loc_FF8767B0:\n"
520                "MOV    R2, #0\n"
521                "MOV    R1, #0x200\n"
522                "MOV    R0, #2\n"
523                "BL             sub_FF894344\n"
524                "MOVS   R4, R0\n"
525                "BNE    loc_FF8767D0\n"
526"loc_FF8767C8:\n"
527                "MOV    R0, #0\n"
528                "LDMFD  SP!, {R4-R10,PC}\n"
529"loc_FF8767D0:\n"
530                "LDR    R12, [R5,#0x50]\n"
531                "MOV    R3, R4\n"
532                "MOV    R2, #1\n"
533                "MOV    R1, #0\n"
534                "MOV    R0, R9\n"
535                "BLX    R12\n"
536                "CMP    R0, #1\n"
537                "BNE    loc_FF8767FC\n"
538                "MOV    R0, #2\n"
539                "BL             sub_FF894494\n"
540                "B              loc_FF8767C8\n"
541"loc_FF8767FC:\n"
542                "LDR    R1, [R5,#0x64]\n"
543                "MOV    R0, R9\n"
544                "BLX    R1\n"
545
546                "MOV   R1, R4\n"           //  pointer to MBR in R1
547                "BL    mbr_read_dryos\n"   //  total sectors count in R0 before and after call
548
549        // Start of DataGhost's FAT32 autodetection code
550        // Policy: If there is a partition which has type W95 FAT32, use the first one of those for image storage
551        // According to the code below, we can use R1, R2, R3 and R12.
552        // LR wasn't really used anywhere but for storing a part of the partition signature. This is the only thing
553        // that won't work with an offset, but since we can load from LR+offset into LR, we can use this to do that :)
554        "MOV     R12, R4\n"                    // Copy the MBR start address so we have something to work with
555        "MOV     LR, R4\n"                     // Save old offset for MBR signature
556        "MOV     R1, #1\n"                     // Note the current partition number
557        "B       dg_sd_fat32_enter\n"          // We actually need to check the first partition as well, no increments yet!
558"dg_sd_fat32:\n"
559        "CMP     R1, #4\n"                     // Did we already see the 4th partition?
560        "BEQ     dg_sd_fat32_end\n"            // Yes, break. We didn't find anything, so don't change anything.
561        "ADD     R12, R12, #0x10\n"            // Second partition
562        "ADD     R1, R1, #1\n"                 // Second partition for the loop
563"dg_sd_fat32_enter:\n"
564        "LDRB    R2, [R12, #0x1BE]\n"          // Partition status
565        "LDRB    R3, [R12, #0x1C2]\n"          // Partition type (FAT32 = 0xB)
566        "CMP     R3, #0xB\n"                   // Is this a FAT32 partition?
567        "CMPNE   R3, #0xC\n"                   // Not 0xB, is it 0xC (FAT32 LBA) then?
568        "BNE     dg_sd_fat32\n"                // No, it isn't. Loop again.
569        "CMP     R2, #0x00\n"                  // It is, check the validity of the partition type
570        "CMPNE   R2, #0x80\n"
571        "BNE     dg_sd_fat32\n"                // Invalid, go to next partition
572                                               // This partition is valid, it's the first one, bingo!
573        "MOV     R4, R12\n"                    // Move the new MBR offset for the partition detection.
574
575"dg_sd_fat32_end:\n"
576        // End of DataGhost's FAT32 autodetection code
577
578                "LDRB   R1, [R4,#0x1C9]\n"
579                "LDRB   R3, [R4,#0x1C8]\n"
580                "LDRB   R12, [R4,#0x1CC]\n"
581                "MOV    R1, R1,LSL#24\n"
582                "ORR    R1, R1, R3,LSL#16\n"
583                "LDRB   R3, [R4,#0x1C7]\n"
584                "LDRB   R2, [R4,#0x1BE]\n"
585//              "LDRB   LR, [R4,#0x1FF]\n"
586                "ORR    R1, R1, R3,LSL#8\n"
587                "LDRB   R3, [R4,#0x1C6]\n"
588                "CMP    R2, #0\n"
589                "CMPNE  R2, #0x80\n"
590                "ORR    R1, R1, R3\n"
591                "LDRB   R3, [R4,#0x1CD]\n"
592                "MOV    R3, R3,LSL#24\n"
593                "ORR    R3, R3, R12,LSL#16\n"
594                "LDRB   R12, [R4,#0x1CB]\n"
595                "ORR    R3, R3, R12,LSL#8\n"
596                "LDRB   R12, [R4,#0x1CA]\n"
597                "ORR    R3, R3, R12\n"
598//              "LDRB    R12, [R4,#0x1FE]\n"
599"                LDRB    R12, [LR,#0x1FE]\n" // +
600"                LDRB    LR, [LR,#0x1FF]\n" // +
601                "BNE    loc_FF876888\n"
602                "CMP    R0, R1\n"
603                "BCC    loc_FF876888\n"
604                "ADD    R2, R1, R3\n"
605                "CMP    R2, R0\n"
606                "CMPLS  R12, #0x55\n"
607                "CMPEQ  LR, #0xAA\n"
608                "MOVEQ  R7, R1\n"
609                "MOVEQ  R6, R3\n"
610                "MOVEQ  R4, #1\n"
611                "BEQ    loc_FF87688C\n"
612"loc_FF876888:\n"
613                "MOV    R4, R8\n"
614"loc_FF87688C:\n"
615                "MOV    R0, #2\n"
616                "BL             sub_FF894494\n"
617                "CMP    R4, #0\n"
618                "BNE    loc_FF8768C8\n"
619                "LDR    R1, [R5,#0x64]\n"
620                "MOV    R7, #0\n"
621                "MOV    R0, R9\n"
622                "BLX    R1\n"
623                "MOV    R6, R0\n"
624                "B              loc_FF8768C8\n"
625"loc_FF8768B4:\n"
626                "MOV    R6, #0x40\n"
627                "B              loc_FF8768C8\n"
628"loc_FF8768BC:\n"
629                "LDR    R1, =0x597\n"
630                "LDR    R0, =0xFF8768DC\n"      //=aMounter_c
631                "BL             _DebugAssert\n"
632"loc_FF8768C8:\n"
633                "STR    R7, [R5,#0x44]!\n"
634                "STMIB  R5, {R6,R8}\n"
635                "MOV    R0, #1\n"
636                "LDMFD  SP!, {R4-R10,PC}\n"
637 );
638}
639
640// Firmware version @ FF865D08
641void __attribute__((naked,noinline)) JogDial_task_my() {
642 asm volatile(
643"                STMFD   SP!, {R4-R11,LR} \n"
644"                SUB     SP, SP, #0x1C \n"
645"                BL      sub_FF8660A0 \n"
646"                LDR     R1, =0x2588 \n"
647"                LDR     R6, =0xFFB97A38 \n"
648"                MOV     R0, #0 \n"
649"                ADD     R3, SP, #0x10 \n"
650"                ADD     R12, SP, #0x14 \n"
651"                ADD     R10, SP, #0x08 \n"
652"                MOV     R2, #0 \n"
653"                ADD     R9, SP, #0x0C \n"
654
655"loc_FF865D34: \n"
656"                ADD     R12, SP, #0x14 \n"
657"                ADD     LR, R12, R0,LSL#1 \n"
658"                MOV     R2, #0 \n"
659"                ADD     R3, SP, #0x10 \n"
660"                STRH    R2, [LR] \n"
661"                ADD     LR, R3, R0,LSL#1 \n"
662"                STRH    R2, [LR] \n"
663"                STR     R2, [R9,R0,LSL#2] \n"
664"                STR     R2, [R10,R0,LSL#2] \n"
665"                ADD     R0, R0, #1 \n"
666"                CMP     R0, #1 \n"
667"                BLT     loc_FF865D34 \n"
668
669"loc_FF865D64: \n"
670"                LDR     R0, =0x2588 \n"
671"                MOV     R2, #0 \n"
672"                LDR     R0, [R0,#8] \n"
673"                MOV     R1, SP \n"
674"                BL      sub_FF83A4C8 \n"
675"                CMP     R0, #0 \n"
676"                LDRNE   R1, =0x262 \n"
677
678//"                ADRNE   R0, aRotaryencoder_ ; "RotaryEncoder.c" \n"
679"                               LDRNE   R0,=0xFF865FC4 \n"
680
681"                BLNE    _DebugAssert \n"
682"                LDR     R0, [SP] \n"
683"                AND     R4, R0, #0xFF \n"
684"                AND     R0, R0, #0xFF00 \n"
685"                CMP     R0, #0x100 \n"
686"                BEQ     loc_FF865DD4 \n"
687"                CMP     R0, #0x200 \n"
688"                BEQ     loc_FF865E0C \n"
689"                CMP     R0, #0x300 \n"
690"                BEQ     loc_FF866004 \n"
691"                CMP     R0, #0x400 \n"
692"                BNE     loc_FF865D64 \n"
693"                CMP     R4, #0 \n"
694"                LDRNE   R1, =0x2ED \n"
695
696//"                ADRNE   R0, aRotaryencoder_ ; "RotaryEncoder.c" \n"
697"                               LDRNE   R0,=0xFF865FC4 \n"
698
699"                BLNE    _DebugAssert \n"
700"                RSB     R0, R4, R4,LSL#3 \n"
701"                LDR     R0, [R6,R0,LSL#2] \n"
702
703"loc_FF865DCC: \n"
704"                BL      sub_FF866084 \n"
705"                B       loc_FF865D64 \n"
706
707"loc_FF865DD4: \n"
708//------------------  added code ---------------------
709"labelA:\n"
710                "LDR     R0, =jogdial_stopped\n"
711                "LDR     R0, [R0]\n"
712                "CMP     R0, #1\n"
713                "BNE     labelB\n"
714                "MOV     R0, #40\n"
715                "BL      _SleepTask\n" //sleep
716                "B       labelA\n"
717"labelB:\n"
718//------------------  original code ------------------
719"                LDR     R7, =0x2594 \n"
720"                LDR     R0, [R7,R4,LSL#2] \n"
721"                BL      sub_FF83B460 \n"
722
723//"                ADR     R2, loc_FF865C54 \n"
724"                LDR     R2, =0xFF865C54 \n"
725
726"                ADD     R1, R2, #0 \n"
727"                ORR     R3, R4, #0x200 \n"
728"                MOV     R0, #0x28 \n"
729"                BL      sub_FF83B37C \n"
730"                TST     R0, #1 \n"
731"                CMPNE   R0, #0x15 \n"
732"                STR     R0, [R10,R4,LSL#2] \n"
733"                BEQ     loc_FF865D64 \n"
734"                MOV     R1, #0x274 \n"
735"                B       loc_FF865FB0 \n"
736
737"loc_FF865E0C: \n"
738"                RSB     R5, R4, R4,LSL#3 \n"
739"                LDR     R0, [R6,R5,LSL#2] \n"
740"                LDR     R1, =0xC0240104 \n"
741"                LDR     R0, [R1,R0,LSL#8] \n"
742"                MOV     R2, R0,ASR#16 \n"
743"                ADD     R0, SP, #0x14 \n"
744"                ADD     R0, R0, R4,LSL#1 \n"
745"                STR     R0, [SP,#0x18] \n"
746"                STRH    R2, [R0] \n"
747"                ADD     R0, SP, #0x10 \n"
748"                ADD     R11, R0, R4,LSL#1 \n"
749"                LDRSH   R3, [R11] \n"
750"                SUB     R0, R2, R3 \n"
751"                CMP     R0, #0 \n"
752"                BNE     loc_FF865E8C \n"
753"                LDR     R0, [R9,R4,LSL#2] \n"
754"                CMP     R0, #0 \n"
755"                BEQ     loc_FF865F6C \n"
756"                LDR     R7, =0x2594 \n"
757"                LDR     R0, [R7,R4,LSL#2] \n"
758"                BL      sub_FF83B460 \n"
759
760//"                ADR     R2, sub_FF865C60 \n"
761"                LDR     R2, =0xFF865C60 \n"
762
763"                ADD     R1, R2, #0 \n"
764"                ORR     R3, R4, #0x300 \n"
765"                MOV     R0, #0x1F4 \n"
766"                BL      sub_FF83B37C \n"
767"                TST     R0, #1 \n"
768"                CMPNE   R0, #0x15 \n"
769"                STR     R0, [R7,R4,LSL#2] \n"
770"                BEQ     loc_FF865F6C \n"
771"                LDR     R1, =0x28D \n"
772"                B       loc_FF865F64 \n"
773
774"loc_FF865E8C: \n"
775"                MOV     R1, R0 \n"
776"                RSBLT   R0, R0, #0 \n"
777"                MOVLE   R7, #0 \n"
778"                MOVGT   R7, #1 \n"
779"                CMP     R0, #0xFF \n"
780"                BLS     loc_FF865ECC \n"
781"                CMP     R1, #0 \n"
782"                RSBLE   R0, R3, #0xFF \n"
783"                ADDLE   R0, R0, #0x7F00 \n"
784"                ADDLE   R0, R0, R2 \n"
785"                RSBGT   R0, R2, #0xFF \n"
786"                ADDGT   R0, R0, #0x7F00 \n"
787"                ADDGT   R0, R0, R3 \n"
788"                ADD     R0, R0, #0x8000 \n"
789"                ADD     R0, R0, #1 \n"
790"                EOR     R7, R7, #1 \n"
791
792"loc_FF865ECC: \n"
793"                STR     R0, [SP,#0x04] \n"
794"                LDR     R0, [R9,R4,LSL#2] \n"
795"                CMP     R0, #0 \n"
796"                ADDEQ   R0, R6, R5,LSL#2 \n"
797"                LDREQ   R0, [R0,#8] \n"
798"                BEQ     loc_FF865F04 \n"
799"                ADD     R8, R6, R5,LSL#2 \n"
800"                ADD     R1, R8, R7,LSL#2 \n"
801"                LDR     R1, [R1,#0x10] \n"
802"                CMP     R1, R0 \n"
803"                BEQ     loc_FF865F08 \n"
804"                LDR     R0, [R8,#0xC] \n"
805"                BL      sub_FF89FEBC \n"
806"                LDR     R0, [R8,#8] \n"
807
808"loc_FF865F04: \n"
809"                BL      sub_FF89FEBC \n"
810
811"loc_FF865F08: \n"
812"                ADD     R0, R6, R5,LSL#2 \n"
813"                ADD     R7, R0, R7,LSL#2 \n"
814"                LDR     R0, [R7,#0x10] \n"
815"                LDR     R1, [SP,#0x04] \n"
816"                BL      sub_FF89FDE4 \n"
817"                LDR     R0, [R7,#0x10] \n"
818"                LDR     R7, =0x2594 \n"
819"                STR     R0, [R9,R4,LSL#2] \n"
820"                LDR     R0, [SP,#0x18] \n"
821"                LDRH    R0, [R0] \n"
822"                STRH    R0, [R11] \n"
823"                LDR     R0, [R7,R4,LSL#2] \n"
824"                BL      sub_FF83B460 \n"
825
826//"                ADR     R2, sub_FF865C60 \n"
827"                LDR     R2, =0xFF865C60 \n"
828
829"                ADD     R1, R2, #0 \n"
830"                ORR     R3, R4, #0x300 \n"
831"                MOV     R0, #0x1F4 \n"
832"                BL      sub_FF83B37C \n"
833"                TST     R0, #1 \n"
834"                CMPNE   R0, #0x15 \n"
835"                STR     R0, [R7,R4,LSL#2] \n"
836"                BEQ     loc_FF865F6C \n"
837"                LDR     R1, =0x2CF \n"
838
839"loc_FF865F64: \n"
840//"                ADR     R0, aRotaryencoder_ ; "RotaryEncoder.c" \n"
841"                               LDR             R0,=0xFF865FC4 \n"
842
843"                BL      _DebugAssert \n"
844
845"loc_FF865F6C: \n"
846"                ADD     R0, R6, R5,LSL#2 \n"
847"                LDR     R0, [R0,#0x18] \n"
848"                CMP     R0, #1 \n"
849"                BNE     loc_FF865FFC \n"
850"                LDR     R0, =0x2588 \n"
851"                LDR     R0, [R0,#0x10] \n"
852"                CMP     R0, #0 \n"
853"                BEQ     loc_FF865FFC \n"
854
855//"                ADR     R2, loc_FF865C54 \n"
856"                LDR     R2, =0xFF865C54 \n"
857
858"                ADD     R1, R2, #0 \n"
859"                ORR     R3, R4, #0x400 \n"
860"                BL      sub_FF83B37C \n"
861"                TST     R0, #1 \n"
862"                CMPNE   R0, #0x15 \n"
863"                STR     R0, [R10,R4,LSL#2] \n"
864"                BEQ     loc_FF865D64 \n"
865"                LDR     R1, =0x2D6 \n"
866
867"loc_FF865FB0: \n"
868//"                ADR     R0, aRotaryencoder_ ; "RotaryEncoder.c" \n"
869"                               LDR             R0,=0xFF865FC4 \n"
870
871"                BL      _DebugAssert \n"
872"                B       loc_FF865D64 \n"
873
874"loc_FF865FFC: \n"
875"                LDR     R0, [R6,R5,LSL#2] \n"
876"                B       loc_FF865DCC \n"
877
878"loc_FF866004: \n"
879"                LDR     R0, [R9,R4,LSL#2] \n"
880"                CMP     R0, #0 \n"
881"                MOVEQ   R1, #0x2E0 \n"
882
883//"                ADREQ   R0, aRotaryencoder_ ; "RotaryEncoder.c" \n"
884"                               LDRNE   R0,=0xFF865FC4 \n"
885
886"                BLEQ    _DebugAssert \n"
887"                RSB     R0, R4, R4,LSL#3 \n"
888"                ADD     R0, R6, R0,LSL#2 \n"
889"                LDR     R0, [R0,#0xC] \n"
890"                BL      sub_FF89FEBC \n"
891"                MOV     R2, #0 \n"
892"                STR     R2, [R9,R4,LSL#2] \n"
893"                B       loc_FF865D64 \n"
894);
895}
Note: See TracBrowser for help on using the repository browser.