source: trunk/platform/sx30/sub/100l/boot.c @ 1294

Revision 1294, 28.6 KB checked in by philmoz, 21 months ago (diff)

Update for G12 & SX30 to support very large, partitioned SD cards, where the 2nd partition is formatted as exFat.

  • 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, =0xFFC90928\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
168                 "B       sub_FF810354_my" // -->
169    );
170}
171
172void __attribute__((naked,noinline)) sub_FF810354_my() {
173
174        //http://chdk.setepontos.com/index.php/topic,4194.0.html
175        *(int*)0x1938=(int)taskHook;
176        *(int*)0x193C=(int)taskHook;    // need this for startup in Playback mode (otherwise init_file_modules_task doesn't hook properly)
177   
178        // replacement of sub_FF834740 for correct power-on.
179        *(int*)(0x2574) = (*(int*)0xC0220128)&1 ? 0x200000 : 0x100000;
180
181        asm volatile (
182                 "LDR     R0, =0xFF8103CC\n"
183                 "MOV     R1, #0\n"
184                 "LDR     R3, =0xFF810404\n"
185 "loc_FF810360:\n"
186                 "CMP     R0, R3\n"
187                 "LDRCC   R2, [R0],#4\n"
188                 "STRCC   R2, [R1],#4\n"
189                 "BCC     loc_FF810360\n"
190                 "LDR     R0, =0xFF810404\n"
191                 "MOV     R1, #0x4B0\n"
192                 "LDR     R3, =0xFF810618\n"
193 "loc_FF81037C:\n"
194                 "CMP     R0, R3\n"
195                 "LDRCC   R2, [R0],#4\n"
196                 "STRCC   R2, [R1],#4\n"
197                 "BCC     loc_FF81037C\n"
198                 "MOV     R0, #0xD2\n"
199                 "MSR     CPSR_cxsf, R0\n"
200                 "MOV     SP, #0x1000\n"
201                 "MOV     R0, #0xD3\n"
202                 "MSR     CPSR_cxsf, R0\n"
203                 "MOV     SP, #0x1000\n"
204                 "LDR     R0, =0x6C4\n"
205                 "LDR     R2, =0xEEEEEEEE\n"
206                 "MOV     R3, #0x1000\n"
207 "loc_FF8103B0:\n"
208                 "CMP     R0, R3\n"
209                 "STRCC   R2, [R0],#4\n"
210                 "BCC     loc_FF8103B0\n"
211//                 "BL      sub_FF811198\n"
212                 "BL      sub_FF811198_my\n" // -->
213     );
214}
215
216void __attribute__((naked,noinline)) sub_FF811198_my() {
217
218     asm volatile (
219                 "STR     LR, [SP,#-4]!\n"
220                 "SUB     SP, SP, #0x74\n"
221                 "MOV     R0, SP\n"
222                 "MOV     R1, #0x74\n"
223                 "BL      sub_FFB9274C\n"       
224                 "MOV     R0, #0x53000\n"
225                 "STR     R0, [SP,#4]\n"
226                                 
227#if defined(OPT_CHDK_IN_EXMEM)
228               "LDR     R0, =0x18124C\n" // use original heap offset since CHDK is loaded in high memory
229#else
230               "LDR     R0, =new_sa\n"   // otherwise use patched value
231               "LDR     R0, [R0]\n"      //
232#endif
233                                 
234"               LDR     R1, =0x379C00 \n"
235"               STR     R0, [SP,#8] \n"
236"               RSB     R0, R0, #0x1F80 \n"
237"               ADD     R0, R0, #0x370000 \n"
238"               STR     R0, [SP,#0x0c] \n"
239"               LDR     R0, =0x371F80 \n"
240"               STR     R1, [SP,#0] \n"
241"               STRD    R0, [SP,#0x10] \n"
242"               MOV     R0, #0x22 \n"
243"               STR     R0, [SP,#0x18] \n"
244"               MOV     R0, #0x68 \n"
245"               STR     R0, [SP,#0x1c] \n"
246"               LDR     R0, =0x19B \n"
247
248//"             LDR     R1, =0xFF815EE0 \n"
249"               LDR     R1, =sub_FF815EE0_my \n"                // patched
250
251"               B               sub_FF8111F0 \n"                // Continue in firmware
252     );
253}
254
255void __attribute__((naked,noinline)) sub_FF815EE0_my() {
256
257        asm volatile (
258"               STMFD   SP!, {R4,LR} \n"
259"               BL      sub_FF810B20 \n"
260"               BL      sub_FF81A33C \n"                                // dmSetup
261"               CMP     R0, #0 \n"
262
263//"             ADRLT   R0, aDmsetup \n"                        // "dmSetup"
264"               LDRLT   r0, =0xFF815FF4 \n"
265
266"               BLLT    _err_init_task \n"
267"               BL      sub_FF815B1C \n"
268"               CMP     R0, #0 \n"
269
270//"             ADRLT   R0, aTermdriverinit \n"         // "termDriverInit"
271"               LDRLT   R0, =0xFF815FFC \n"
272
273"               BLLT    _err_init_task \n"
274
275//"             ADR     R0, a_term \n"                                  // "/_term"
276"               LDR     R0, =0xFF81600C \n"
277
278"               BL      sub_FF815C04 \n"                                // termDeviceCreate
279"               CMP     R0, #0 \n"
280
281//"             ADRLT   R0, aTermdevicecrea \n"         // "termDeviceCreate"
282"               LDRLT   R0, =0xFF816014 \n"
283
284"               BLLT    _err_init_task \n"
285
286//"             ADR     R0, a_term \n"                                  // "/_term"
287"               LDR     R0, =0xFF81600C \n"
288
289"               BL      sub_FF813CA4 \n"
290"               CMP     R0, #0 \n"
291
292//"             ADRLT   R0, aStdiosetup \n"                     // "stdioSetup"
293"               LDRLT   R0, =0xFF816028 \n"
294
295"               BLLT    _err_init_task \n"
296"               BL      sub_FF819CC4 \n"
297"               CMP     R0, #0 \n"
298
299//"             ADRLT   R0, aStdlibsetup \n"            // "stdlibSetup"
300"               LDRLT   R0, =0xFF816034 \n"
301
302"               BLLT    _err_init_task \n"
303"               BL      sub_FF81167C \n"
304"               CMP     R0, #0 \n"
305
306//"             ADRLT   R0, aArmlib_setup \n"           // "armlib_setup"
307"               LDRLT   R0, =0xFF816040 \n"
308
309"               BLLT    _err_init_task \n"
310
311"               LDMFD   SP!, {R4,LR} \n"
312
313//"             B       sub_FF81FB54 \n"                                // taskcreate_Startup
314"               B       taskcreate_Startup_my \n"               // patched
315        );
316};
317
318void __attribute__((naked,noinline)) taskcreate_Startup_my() {
319
320        asm volatile (
321                "STMFD  SP!, {R3,LR}\n"
322//              "BL             j_nullsub_234\n"
323                "BL             sub_FF83C880\n"
324                "CMP    R0, #0\n"
325                "BNE    loc_FF81FB98\n"
326                "BL             sub_FF836160\n"
327                "CMP    R0, #0\n"
328                "BNE    loc_FF81FB98\n"
329                "BL             sub_FF834734\n"
330                "CMP    R0, #0\n"
331                "BNE    loc_FF81FB98\n"
332                "BL             sub_FF833DDC\n"
333                "LDR    R1, =0xC0220000\n"
334                "MOV    R0, #0x44\n"
335                "STR    R0, [R1,#0x1C]\n"
336                "BL             sub_FF833FCC\n"
337               
338"loc_FF81FB94:\n"
339                "B              loc_FF81FB94\n"
340               
341"loc_FF81FB98:\n"
342//              "BL             sub_FF834740\n"         // see begin of sub_FF810354_my()
343//              "BL             j_nullsub_235\n"
344                "BL             sub_FF83AA94\n"
345                "LDR    R1, =0x3CE000\n"
346                "MOV    R0, #0\n"
347                "BL             sub_FF83AEDC\n"
348                "BL             sub_FF83AC88\n" // KerSys
349                "MOV    R3, #0\n"
350                "STR    R3, [SP]\n"
351
352                //"ADR     R3, task_Startup\n"
353                "LDR    R3, =task_Startup_my\n" // patched
354
355                "B              sub_FF81FBC0\n" // Continue in firmware
356     );
357}
358
359void __attribute__((naked,noinline)) task_Startup_my() {
360
361        asm volatile (
362                "STMFD  SP!, {R4,LR}\n"
363                "BL             sub_FF816594\n" // taskcreate_ClockSave\n"
364                "BL             sub_FF835894\n"
365                "BL             sub_FF8339A4\n"
366//              "BL     j_nullsub_238\n"
367                "BL             sub_FF83CAB0\n"
368//              "BL             sub_FF83C958\n" // start diskboot.bin
369                "BL             sub_FF83CC54\n"
370                "BL             sub_FF832474\n"
371                "BL             sub_FF83CAE0\n"
372                "BL             sub_FF83A238\n"
373                "BL             sub_FF83CC58\n"
374
375                "BL             CreateTask_spytask\n" // added
376
377//              "BL             sub_FF83461C\n" //taskcreate_PhySw\n"
378                "BL             taskcreatePhySw_my\n"  // we do this here rather than hook so we don't waste the original stack
379
380                "B              sub_FF81FB24\n"         // Continue in firmware
381     );
382}
383
384void __attribute__((naked,noinline)) taskcreatePhySw_my() {
385        asm volatile (
386"                STMFD   SP!, {R3-R5,LR}\n"
387"                LDR     R4, =0x1C30\n"
388"                LDR     R0, [R4,#0x10]\n"
389"                CMP     R0, #0\n"
390"                BNE     sub_FF834650\n"
391"                MOV     R3, #0\n"
392"                STR     R3, [SP]\n"
393"                LDR     R3, =mykbd_task\n" // task_PhySw
394//"                MOV     R2, #0x800\n"
395"                MOV     R2, #0x2000\n" // stack size for new task_PhySw so we don't have to do stack switch
396"                               B       sub_FF834640 \n" // continue in firmware
397        );
398}
399
400/*----------------------------------------------------------------------
401        spytask
402-----------------------------------------------------------------------*/
403void spytask(long ua, long ub, long uc, long ud, long ue, long uf)
404{
405    core_spytask();
406}
407
408/*----------------------------------------------------------------------
409        CreateTask_spytask
410-----------------------------------------------------------------------*/
411void CreateTask_spytask() {
412        _CreateTask("SpyTask", 0x19, 0x2000, spytask, 0);
413}
414
415 ///*----------------------------------------------------------------------
416//@ FF8A3B50
417void __attribute__((naked,noinline)) init_file_modules_task() {
418 asm volatile(
419                 "STMFD   SP!, {R4-R6,LR}\n"
420                 "BL      sub_FF89A298\n"
421                 "LDR     R5, =0x5006\n"
422                 "MOVS    R4, R0\n"
423                 "MOVNE   R1, #0\n"
424                 "MOVNE   R0, R5\n"
425                 "BLNE    _PostLogicalEventToUI\n"
426
427                                 //"BL      sub_FF89A2C4\n"
428                 "BL      sub_FF89A2C4_my\n"                    // patched
429
430                 "BL      core_spytask_can_start\n"      // CHDK: Set "it's-safe-to-start" flag for spytask
431
432                                 "B                     sub_FF8A3B70\n" // Continue in firmware
433 );
434}
435
436void __attribute__((naked,noinline)) sub_FF89A2C4_my() {
437 asm volatile(
438                 "STMFD   SP!, {R4,LR}\n"
439                                 "MOV     R0, #3\n"
440
441                 //"BL      sub_FF876E1C\n"
442                 "BL      sub_FF876E1C_my\n"    // patched
443
444                                 "B             sub_FF89A2D0\n" // Continue in firmware
445 );
446}
447
448void __attribute__((naked,noinline)) sub_FF876E1C_my() {
449 asm volatile(
450                "STMFD  SP!, {R4-R8,LR}\n"
451                "MOV    R8, R0\n"
452                "BL             sub_FF876D9C\n"
453                "LDR    R1, =0x3A738\n"
454                "MOV    R6, R0\n"
455                "ADD    R4, R1, R0,LSL#7\n"
456                "LDR    R0, [R4,#0x6C]\n"
457                "CMP    R0, #4\n"
458                "LDREQ  R1, =0x83f\n"
459                "LDREQ  R0, =0xFF8768DC\n"      //=aMounter_c
460                "BLEQ   _DebugAssert\n"
461                "MOV    R1, R8\n"
462                "MOV    R0, R6\n"
463                "BL             sub_FF876650\n"
464                "LDR    R0, [R4,#0x38]\n"
465                "BL             sub_FF8774C0\n"
466                "CMP    R0, #0\n"
467                "STREQ  R0, [R4,#0x6C]\n"
468                "MOV    R0, R6\n"
469                "BL             sub_FF8766E0\n"
470                "MOV    R0, R6\n"
471
472                //"BL           sub_FF876A44\n"
473                "BL             sub_FF876A44_my\n"    // patched
474
475                "B              sub_FF876E74\n" // Continue in firmware
476 );
477}
478
479void __attribute__((naked,noinline)) sub_FF876A44_my() {
480 asm volatile(
481                "STMFD  SP!, {R4-R6,LR}\n"
482                "MOV    R5, R0\n"
483                "LDR    R0, =0x3A738\n"
484                "ADD    R4, R0, R5,LSL#7\n"
485                "LDR    R0, [R4,#0x6C]\n"
486                "TST    R0, #2\n"
487                "MOVNE  R0, #1\n"
488                "LDMNEFD        SP!, {R4-R6,PC}\n"
489                "LDR    R0, [R4,#0x38]\n"
490                "MOV    R1, R5\n"
491
492                //"BL           sub_FF876764\n"
493                "BL             sub_FF876764_my\n"    // patched
494
495                "B              sub_FF876A70\n" // Continue in firmware
496 );
497}
498//------------------------------------------------------------------
499void __attribute__((naked,noinline)) sub_FF876764_my() {
500 asm volatile(
501                "STMFD  SP!, {R4-R10,LR}\n"
502                "MOV    R9, R0\n"
503                "LDR    R0, =0x3A738\n"
504                "MOV    R8, #0\n"
505                "ADD    R5, R0, R1,LSL#7\n"
506                "LDR    R0, [R5,#0x3C]\n"
507                "MOV    R7, #0\n"
508                "CMP    R0, #7\n"
509                "MOV    R6, #0\n"
510                "ADDLS  PC, PC, R0,LSL#2\n"
511                                "B      loc_FF8768BC\n"
512"loc_FF876790:   B      loc_FF8767C8\n"
513"loc_FF876794:   B      loc_FF8767B0\n"
514"loc_FF876798:   B      loc_FF8767B0\n"
515"loc_FF87679C:   B      loc_FF8767B0\n"
516"loc_FF8767A0:   B      loc_FF8767B0\n"
517"loc_FF8767A4:   B      loc_FF8768B4\n"
518"loc_FF8767A8:   B      loc_FF8767B0\n"
519"loc_FF8767AC:   B      loc_FF8767B0\n"
520"loc_FF8767B0:\n"
521                "MOV    R2, #0\n"
522                "MOV    R1, #0x200\n"
523                "MOV    R0, #2\n"
524                "BL             sub_FF894348\n"
525                "MOVS   R4, R0\n"
526                "BNE    loc_FF8767D0\n"
527"loc_FF8767C8:\n"
528                "MOV    R0, #0\n"
529                "LDMFD  SP!, {R4-R10,PC}\n"
530"loc_FF8767D0:\n"
531                "LDR    R12, [R5,#0x50]\n"
532                "MOV    R3, R4\n"
533                "MOV    R2, #1\n"
534                "MOV    R1, #0\n"
535                "MOV    R0, R9\n"
536                "BLX    R12\n"
537                "CMP    R0, #1\n"
538                "BNE    loc_FF8767FC\n"
539                "MOV    R0, #2\n"
540                "BL             sub_FF894498\n"
541                "B              loc_FF8767C8\n"
542"loc_FF8767FC:\n"
543                "LDR    R1, [R5,#0x64]\n"
544                "MOV    R0, R9\n"
545                "BLX    R1\n"
546
547                "MOV   R1, R4\n"           //  pointer to MBR in R1
548                "BL    mbr_read_dryos\n"   //  total sectors count in R0 before and after call
549
550        // Start of DataGhost's FAT32 autodetection code
551        // Policy: If there is a partition which has type W95 FAT32, use the first one of those for image storage
552        // According to the code below, we can use R1, R2, R3 and R12.
553        // LR wasn't really used anywhere but for storing a part of the partition signature. This is the only thing
554        // that won't work with an offset, but since we can load from LR+offset into LR, we can use this to do that :)
555        "MOV     R12, R4\n"                    // Copy the MBR start address so we have something to work with
556        "MOV     LR, R4\n"                     // Save old offset for MBR signature
557        "MOV     R1, #1\n"                     // Note the current partition number
558        "B       dg_sd_fat32_enter\n"          // We actually need to check the first partition as well, no increments yet!
559"dg_sd_fat32:\n"
560        "CMP     R1, #4\n"                     // Did we already see the 4th partition?
561        "BEQ     dg_sd_fat32_end\n"            // Yes, break. We didn't find anything, so don't change anything.
562        "ADD     R12, R12, #0x10\n"            // Second partition
563        "ADD     R1, R1, #1\n"                 // Second partition for the loop
564"dg_sd_fat32_enter:\n"
565        "LDRB    R2, [R12, #0x1BE]\n"          // Partition status
566        "LDRB    R3, [R12, #0x1C2]\n"          // Partition type (FAT32 = 0xB)
567        "CMP     R3, #0xB\n"                   // Is this a FAT32 partition?
568        "CMPNE   R3, #0xC\n"                   // Not 0xB, is it 0xC (FAT32 LBA) then?
569        "CMPNE   R3, #0x7\n"                   // exFat?
570        "BNE     dg_sd_fat32\n"                // No, it isn't. Loop again.
571        "CMP     R2, #0x00\n"                  // It is, check the validity of the partition type
572        "CMPNE   R2, #0x80\n"
573        "BNE     dg_sd_fat32\n"                // Invalid, go to next partition
574                                               // This partition is valid, it's the first one, bingo!
575        "MOV     R4, R12\n"                    // Move the new MBR offset for the partition detection.
576
577"dg_sd_fat32_end:\n"
578        // End of DataGhost's FAT32 autodetection code
579
580                "LDRB   R1, [R4,#0x1C9]\n"
581                "LDRB   R3, [R4,#0x1C8]\n"
582                "LDRB   R12, [R4,#0x1CC]\n"
583                "MOV    R1, R1,LSL#24\n"
584                "ORR    R1, R1, R3,LSL#16\n"
585                "LDRB   R3, [R4,#0x1C7]\n"
586                "LDRB   R2, [R4,#0x1BE]\n"
587//              "LDRB   LR, [R4,#0x1FF]\n"
588                "ORR    R1, R1, R3,LSL#8\n"
589                "LDRB   R3, [R4,#0x1C6]\n"
590                "CMP    R2, #0\n"
591                "CMPNE  R2, #0x80\n"
592                "ORR    R1, R1, R3\n"
593                "LDRB   R3, [R4,#0x1CD]\n"
594                "MOV    R3, R3,LSL#24\n"
595                "ORR    R3, R3, R12,LSL#16\n"
596                "LDRB   R12, [R4,#0x1CB]\n"
597                "ORR    R3, R3, R12,LSL#8\n"
598                "LDRB   R12, [R4,#0x1CA]\n"
599                "ORR    R3, R3, R12\n"
600//              "LDRB    R12, [R4,#0x1FE]\n"
601"                LDRB    R12, [LR,#0x1FE]\n" // +
602"                LDRB    LR, [LR,#0x1FF]\n" // +
603                "BNE    loc_FF876888\n"
604                "CMP    R0, R1\n"
605                "BCC    loc_FF876888\n"
606                "ADD    R2, R1, R3\n"
607                "CMP    R2, R0\n"
608                "CMPLS  R12, #0x55\n"
609                "CMPEQ  LR, #0xAA\n"
610                "MOVEQ  R7, R1\n"
611                "MOVEQ  R6, R3\n"
612                "MOVEQ  R4, #1\n"
613                "BEQ    loc_FF87688C\n"
614"loc_FF876888:\n"
615                "MOV    R4, R8\n"
616"loc_FF87688C:\n"
617                "MOV    R0, #2\n"
618                "BL             sub_FF894498\n"
619                "CMP    R4, #0\n"
620                "BNE    loc_FF8768C8\n"
621                "LDR    R1, [R5,#0x64]\n"
622                "MOV    R7, #0\n"
623                "MOV    R0, R9\n"
624                "BLX    R1\n"
625                "MOV    R6, R0\n"
626                "B              loc_FF8768C8\n"
627"loc_FF8768B4:\n"
628                "MOV    R6, #0x40\n"
629                "B              loc_FF8768C8\n"
630"loc_FF8768BC:\n"
631                "LDR    R1, =0x597\n"
632                "LDR    R0, =0xFF8768DC\n"      //=aMounter_c
633                "BL             _DebugAssert\n"
634"loc_FF8768C8:\n"
635                "STR    R7, [R5,#0x44]!\n"
636                "STMIB  R5, {R6,R8}\n"
637                "MOV    R0, #1\n"
638                "LDMFD  SP!, {R4-R10,PC}\n"
639 );
640}
641
642// Pointer to stack location where jogdial task records previous and current
643// jogdial positions
644short *jog_position;
645
646// Firmware version @ FF865D08
647void __attribute__((naked,noinline)) JogDial_task_my() {
648 asm volatile(
649"                STMFD   SP!, {R4-R11,LR} \n"
650"                SUB     SP, SP, #0x1C \n"
651"                BL      sub_FF8660A0 \n"
652"                LDR     R1, =0x2588 \n"
653"                LDR     R6, =0xFFB97C9C \n"
654"                MOV     R0, #0 \n"
655"                ADD     R3, SP, #0x10 \n"
656
657// Save pointer for kbd.c routine
658" LDR R12, =jog_position \n"
659" STR R3, [R12] \n"
660
661"                ADD     R12, SP, #0x14 \n"
662"                ADD     R10, SP, #0x08 \n"
663"                MOV     R2, #0 \n"
664"                ADD     R9, SP, #0x0C \n"
665
666"loc_FF865D34: \n"
667"                ADD     R12, SP, #0x14 \n"
668"                ADD     LR, R12, R0,LSL#1 \n"
669"                MOV     R2, #0 \n"
670"                ADD     R3, SP, #0x10 \n"
671"                STRH    R2, [LR] \n"
672"                ADD     LR, R3, R0,LSL#1 \n"
673"                STRH    R2, [LR] \n"
674"                STR     R2, [R9,R0,LSL#2] \n"
675"                STR     R2, [R10,R0,LSL#2] \n"
676"                ADD     R0, R0, #1 \n"
677"                CMP     R0, #1 \n"
678"                BLT     loc_FF865D34 \n"
679
680"loc_FF865D64: \n"
681"                LDR     R0, =0x2588 \n"
682"                MOV     R2, #0 \n"
683"                LDR     R0, [R0,#8] \n"
684"                MOV     R1, SP \n"
685"                BL      sub_FF83A4C8 \n"
686"                CMP     R0, #0 \n"
687"                LDRNE   R1, =0x262 \n"
688"                                LDRNE   R0,=0xFF865FC4 \n" //aRotaryencoder_ ; "RotaryEncoder.c" \n"
689"                BLNE    _DebugAssert \n"
690"                LDR     R0, [SP] \n"
691"                AND     R4, R0, #0xFF \n"
692"                AND     R0, R0, #0xFF00 \n"
693"                CMP     R0, #0x100 \n"
694"                BEQ     loc_FF865DD4 \n"
695"                CMP     R0, #0x200 \n"
696"                BEQ     loc_FF865E0C \n"
697"                CMP     R0, #0x300 \n"
698"                BEQ     loc_FF866004 \n"
699"                CMP     R0, #0x400 \n"
700"                BNE     loc_FF865D64 \n"
701"                CMP     R4, #0 \n"
702"                LDRNE   R1, =0x2ED \n"
703"                                LDRNE   R0,=0xFF865FC4 \n" //aRotaryencoder_ ; "RotaryEncoder.c" \n"
704"                BLNE    _DebugAssert \n"
705"                RSB     R0, R4, R4,LSL#3 \n"
706"                LDR     R0, [R6,R0,LSL#2] \n"
707
708"loc_FF865DCC: \n"
709"                BL      sub_FF866084 \n"
710"                B       loc_FF865D64 \n"
711
712"loc_FF865DD4: \n"
713//------------------  added code ---------------------
714"labelA:\n"
715                "LDR     R0, =jogdial_stopped\n"
716                "LDR     R0, [R0]\n"
717                "CMP     R0, #1\n"
718                "BNE     labelB\n"
719                "MOV     R0, #40\n"
720                "BL      _SleepTask\n" //sleep
721                "B       labelA\n"
722"labelB:\n"
723//------------------  original code ------------------
724"                LDR     R7, =0x2594 \n"
725"                LDR     R0, [R7,R4,LSL#2] \n"
726"                BL      sub_FF83B460 \n"
727
728//"                ADR     R2, loc_FF865C54 \n"
729"                LDR     R2, =0xFF865C54 \n"
730
731"                ADD     R1, R2, #0 \n"
732"                ORR     R3, R4, #0x200 \n"
733"                MOV     R0, #0x28 \n"
734"                BL      sub_FF83B37C \n"
735"                TST     R0, #1 \n"
736"                CMPNE   R0, #0x15 \n"
737"                STR     R0, [R10,R4,LSL#2] \n"
738"                BEQ     loc_FF865D64 \n"
739"                MOV     R1, #0x274 \n"
740"                B       loc_FF865FB0 \n"
741
742"loc_FF865E0C: \n"
743"                RSB     R5, R4, R4,LSL#3 \n"
744"                LDR     R0, [R6,R5,LSL#2] \n"
745"                LDR     R1, =0xC0240104 \n"
746"                LDR     R0, [R1,R0,LSL#8] \n"
747"                MOV     R2, R0,ASR#16 \n"
748"                ADD     R0, SP, #0x14 \n"
749"                ADD     R0, R0, R4,LSL#1 \n"
750"                STR     R0, [SP,#0x18] \n"
751"                STRH    R2, [R0] \n"
752"                ADD     R0, SP, #0x10 \n"
753"                ADD     R11, R0, R4,LSL#1 \n"
754"                LDRSH   R3, [R11] \n"
755"                SUB     R0, R2, R3 \n"
756"                CMP     R0, #0 \n"
757"                BNE     loc_FF865E8C \n"
758"                LDR     R0, [R9,R4,LSL#2] \n"
759"                CMP     R0, #0 \n"
760"                BEQ     loc_FF865F6C \n"
761"                LDR     R7, =0x2594 \n"
762"                LDR     R0, [R7,R4,LSL#2] \n"
763"                BL      sub_FF83B460 \n"
764
765//"                ADR     R2, sub_FF865C60 \n"
766"                LDR     R2, =0xFF865C60 \n"
767
768"                ADD     R1, R2, #0 \n"
769"                ORR     R3, R4, #0x300 \n"
770"                MOV     R0, #0x1F4 \n"
771"                BL      sub_FF83B37C \n"
772"                TST     R0, #1 \n"
773"                CMPNE   R0, #0x15 \n"
774"                STR     R0, [R7,R4,LSL#2] \n"
775"                BEQ     loc_FF865F6C \n"
776"                LDR     R1, =0x28D \n"
777"                B       loc_FF865F64 \n"
778
779"loc_FF865E8C: \n"
780"                MOV     R1, R0 \n"
781"                RSBLT   R0, R0, #0 \n"
782"                MOVLE   R7, #0 \n"
783"                MOVGT   R7, #1 \n"
784"                CMP     R0, #0xFF \n"
785"                BLS     loc_FF865ECC \n"
786"                CMP     R1, #0 \n"
787"                RSBLE   R0, R3, #0xFF \n"
788"                ADDLE   R0, R0, #0x7F00 \n"
789"                ADDLE   R0, R0, R2 \n"
790"                RSBGT   R0, R2, #0xFF \n"
791"                ADDGT   R0, R0, #0x7F00 \n"
792"                ADDGT   R0, R0, R3 \n"
793"                ADD     R0, R0, #0x8000 \n"
794"                ADD     R0, R0, #1 \n"
795"                EOR     R7, R7, #1 \n"
796
797"loc_FF865ECC: \n"
798"                STR     R0, [SP,#0x04] \n"
799"                LDR     R0, [R9,R4,LSL#2] \n"
800"                CMP     R0, #0 \n"
801"                ADDEQ   R0, R6, R5,LSL#2 \n"
802"                LDREQ   R0, [R0,#8] \n"
803"                BEQ     loc_FF865F04 \n"
804"                ADD     R8, R6, R5,LSL#2 \n"
805"                ADD     R1, R8, R7,LSL#2 \n"
806"                LDR     R1, [R1,#0x10] \n"
807"                CMP     R1, R0 \n"
808"                BEQ     loc_FF865F08 \n"
809"                LDR     R0, [R8,#0xC] \n"
810"                BL      sub_FF89FEC0 \n"
811"                LDR     R0, [R8,#8] \n"
812
813"loc_FF865F04: \n"
814"                BL      sub_FF89FEC0 \n"
815
816"loc_FF865F08: \n"
817"                ADD     R0, R6, R5,LSL#2 \n"
818"                ADD     R7, R0, R7,LSL#2 \n"
819"                LDR     R0, [R7,#0x10] \n"
820"                LDR     R1, [SP,#0x04] \n"
821"                BL      sub_FF89FDE8 \n"
822"                LDR     R0, [R7,#0x10] \n"
823"                LDR     R7, =0x2594 \n"
824"                STR     R0, [R9,R4,LSL#2] \n"
825"                LDR     R0, [SP,#0x18] \n"
826"                LDRH    R0, [R0] \n"
827"                STRH    R0, [R11] \n"
828"                LDR     R0, [R7,R4,LSL#2] \n"
829"                BL      sub_FF83B460 \n"
830
831//"                ADR     R2, sub_FF865C60 \n"
832"                LDR     R2, =0xFF865C60 \n"
833
834"                ADD     R1, R2, #0 \n"
835"                ORR     R3, R4, #0x300 \n"
836"                MOV     R0, #0x1F4 \n"
837"                BL      sub_FF83B37C \n"
838"                TST     R0, #1 \n"
839"                CMPNE   R0, #0x15 \n"
840"                STR     R0, [R7,R4,LSL#2] \n"
841"                BEQ     loc_FF865F6C \n"
842"                LDR     R1, =0x2CF \n"
843
844"loc_FF865F64: \n"
845"                                LDR     R0,=0xFF865FC4 \n" //aRotaryencoder_ ; "RotaryEncoder.c" \n"
846"                BL      _DebugAssert \n"
847
848"loc_FF865F6C: \n"
849"                ADD     R0, R6, R5,LSL#2 \n"
850"                LDR     R0, [R0,#0x18] \n"
851"                CMP     R0, #1 \n"
852"                BNE     loc_FF865FFC \n"
853"                LDR     R0, =0x2588 \n"
854"                LDR     R0, [R0,#0x10] \n"
855"                CMP     R0, #0 \n"
856"                BEQ     loc_FF865FFC \n"
857
858//"                ADR     R2, loc_FF865C54 \n"
859"                LDR     R2, =0xFF865C54 \n"
860
861"                ADD     R1, R2, #0 \n"
862"                ORR     R3, R4, #0x400 \n"
863"                BL      sub_FF83B37C \n"
864"                TST     R0, #1 \n"
865"                CMPNE   R0, #0x15 \n"
866"                STR     R0, [R10,R4,LSL#2] \n"
867"                BEQ     loc_FF865D64 \n"
868"                LDR     R1, =0x2D6 \n"
869
870"loc_FF865FB0: \n"
871"                                LDR     R0,=0xFF865FC4 \n" //aRotaryencoder_ ; "RotaryEncoder.c" \n"
872"                BL      _DebugAssert \n"
873"                B       loc_FF865D64 \n"
874
875"loc_FF865FFC: \n"
876"                LDR     R0, [R6,R5,LSL#2] \n"
877"                B       loc_FF865DCC \n"
878
879"loc_FF866004: \n"
880"                LDR     R0, [R9,R4,LSL#2] \n"
881"                CMP     R0, #0 \n"
882"                MOVEQ   R1, #0x2E0 \n"
883"                                LDREQ   R0,=0xFF865FC4 \n" //aRotaryencoder_ ; "RotaryEncoder.c" \n"
884"                BLEQ    _DebugAssert \n"
885"                RSB     R0, R4, R4,LSL#3 \n"
886"                ADD     R0, R6, R0,LSL#2 \n"
887"                LDR     R0, [R0,#0xC] \n"
888"                BL      sub_FF89FEC0 \n"
889"                MOV     R2, #0 \n"
890"                STR     R2, [R9,R4,LSL#2] \n"
891"                B       loc_FF865D64 \n"
892);
893}
Note: See TracBrowser for help on using the repository browser.