source: trunk/platform/sx30/sub/100n/boot.c @ 1274

Revision 1274, 29.6 KB checked in by philmoz, 22 months ago (diff)

Update for G12 & SX30 to block any rotations of the control wheel(s) in <Alt> mode from being processed by the Canon firmware after leaving <Alt> mode.

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