source: trunk/platform/a800/sub/100c/boot.c @ 1723

Revision 1723, 12.4 KB checked in by reyalp, 2 years ago (diff)

a800 100a port from mland, patch by waterwings in http://chdk.setepontos.com/index.php?topic=650.msg81174#msg81174

  • 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;
9int myFlag =0;
10
11void taskHook(context_t **context) {
12        task_t *tcb=(task_t*)((char*)context-offsetof(task_t, context));
13
14        if(!_strcmp(tcb->name, "PhySw"))           tcb->entry = (void*)mykbd_task;
15        if(!_strcmp(tcb->name, "CaptSeqTask"))     tcb->entry = (void*)capt_seq_task;
16        if(!_strcmp(tcb->name, "InitFileModules")) tcb->entry = (void*)init_file_modules_task;
17        if(!_strcmp(tcb->name, "MovieRecord"))     tcb->entry = (void*)movie_record_task;
18        if(!_strcmp(tcb->name, "ExpDrvTask"))      tcb->entry = (void*)exp_drv_task;
19}
20
21void CreateTask_spytask() {
22        _CreateTask("SpyTask", 0x19, 0x2000, core_spytask, 0);
23};
24
25//ffc0000c
26void __attribute__((naked,noinline)) boot() {
27        asm volatile (
28                        "LDR     R1, =0xC0410000\n"
29                        "MOV     R0, #0\n"
30                        "STR     R0, [R1]\n"
31                        "MOV     R1, #0x78\n"
32                        "MCR     p15, 0, R1,c1,c0\n"
33                        "MOV     R1, #0\n"
34                        "MCR     p15, 0, R1,c7,c10, 4\n"
35                        "MCR     p15, 0, R1,c7,c5\n"
36                        "MCR     p15, 0, R1,c7,c6\n"
37                        "MOV     R0, #0x3D\n"
38                        "MCR     p15, 0, R0,c6,c0\n"
39                        "MOV     R0, #0xC000002F\n"
40                        "MCR     p15, 0, R0,c6,c1\n"
41                        "MOV     R0, #0x31\n"           // memory region & size. bits 1 - 5 = size index, actual size = 2^(size index + 1) = 128MB (de IXUS220 - recalcular)
42                        "MCR     p15, 0, R0,c6,c2\n"
43                        "LDR     R0, =0x10000031\n"     // memory region & size. bits 1 - 5 = size index, actual size = 2^(size index + 1) = 128MB (...)
44                        "MCR     p15, 0, R0,c6,c3\n"
45                        "MOV     R0, #0x40000017\n"
46                        "MCR     p15, 0, R0,c6,c4\n"
47                        "LDR     R0, =0xFFC0002B\n"
48                        "MCR     p15, 0, R0,c6,c5\n"
49                        "MOV     R0, #0x34\n"
50                        "MCR     p15, 0, R0,c2,c0\n"
51                        "MOV     R0, #0x34\n"
52                        "MCR     p15, 0, R0,c2,c0, 1\n"
53                        "MOV     R0, #0x34\n"
54                        "MCR     p15, 0, R0,c3,c0\n"
55                        "LDR     R0, =0x3333330\n"
56                        "MCR     p15, 0, R0,c5,c0, 2\n"
57                        "LDR     R0, =0x3333330\n"
58                        "MCR     p15, 0, R0,c5,c0, 3\n"
59                        "MRC     p15, 0, R0,c1,c0\n"
60                        "ORR     R0, R0, #0x1000\n"
61                        "ORR     R0, R0, #4\n"
62                        "ORR     R0, R0, #1\n"
63                        "MCR     p15, 0, R0,c1,c0\n"
64                        "MOV     R1, #0x40000006\n"
65                        "MCR     p15, 0, R1,c9,c1\n"
66                        "MOV     R1, #6\n"
67                        "MCR     p15, 0, R1,c9,c1, 1\n"
68                        "MRC     p15, 0, R1,c1,c0\n"
69                        "ORR     R1, R1, #0x50000\n"
70                        "MCR     p15, 0, R1,c1,c0\n"
71                        "LDR     R2, =0xC0200000\n"
72                        "MOV     R1, #1\n"
73                        "STR     R1, [R2,#0x10C]\n"
74                        "MOV     R1, #0xFF\n"
75                        "STR     R1, [R2,#0xC]\n"
76                        "STR     R1, [R2,#0x1C]\n"
77                        "STR     R1, [R2,#0x2C]\n"
78                        "STR     R1, [R2,#0x3C]\n"
79                        "STR     R1, [R2,#0x4C]\n"
80                        "STR     R1, [R2,#0x5C]\n"
81                        "STR     R1, [R2,#0x6C]\n"
82                        "STR     R1, [R2,#0x7C]\n"
83                        "STR     R1, [R2,#0x8C]\n"
84                        "STR     R1, [R2,#0x9C]\n"
85                        "STR     R1, [R2,#0xAC]\n"
86                        "STR     R1, [R2,#0xBC]\n"
87                        "STR     R1, [R2,#0xCC]\n"
88                        "STR     R1, [R2,#0xDC]\n"
89                        "STR     R1, [R2,#0xEC]\n"
90                        "STR     R1, [R2,#0xFC]\n"
91                        "LDR     R1, =0xC0400008\n"
92                        "LDR     R2, =0x430005\n"
93                        "STR     R2, [R1]\n"
94                        "MOV     R1, #1\n"
95                        "LDR     R2, =0xC0243100\n"
96                        "STR     R2, [R1]\n"  //esquisito
97                        //"STR     R1, [R2]\n" //
98                        "LDR     R2, =0xC0242010\n"
99                        "LDR     R1, [R2]\n"
100                        "ORR     R1, R1, #1\n"
101                        "STR     R1, [R2]\n"
102                        "LDR     R0, =0xfff0e280\n"
103                        "LDR     R1, =0x1900\n"
104                        "LDR     R3, =0xb3c8\n"
105"loc_FFC0013C:\n"
106                        "CMP     R1, R3\n"  //Initialize Data with Rom values
107                        "LDRCC   R2, [R0],#4\n"
108                        "STRCC   R2, [R1],#4\n"
109                        "BCC     loc_FFC0013C\n"
110                        "LDR     R1, =0x13a700\n"
111                        "MOV     R2, #0\n"
112"loc_FFC00154:\n"
113                        "CMP     R3, R1\n"  //Zero initialization
114                        "STRCC   R2, [R3],#4\n"
115                        "BCC     loc_FFC00154\n"
116                        //"B             sub_FFC0035C\n"
117                        "B       sub_FFC0035C_my\n"//---------> patched
118        );
119};
120
121
122long *blob_chdk_core;
123long *blob_copy_and_reset;
124long blob_chdk_core_size;
125long blob_copy_and_reset_size;
126
127void __attribute__((naked,noinline)) sub_FFC0035C_my() {
128        *(int*)0x1938=(int)taskHook;    // ? compared to iXUS220 - a800(ffc00794) x ixus220 (ff810790:)
129        *(int*)0x193C=(int)taskHook;    // ?
130
131        // "correct power on" is to start in record mode if the power button is held down, on cameras that can start with play or power button. Otherwise CHDK always starts in play mode.
132        //*(int*)(0x20F8)= (*(int*)0xC022005C) & 1 ? 0x4000000 : 0x2000000; // replacement of sub_FFC42F30 for correct power-on deA495.
133        //A800 ffc4383c <= ffc2396c(Next to NotifyMask) <= ffc10730. Associated Modification in taskcreate_Startup_my (comment BL      sub_FFC2396C) - VERY IMPORTANT from Start of PORTING work
134        *(int*)(0x20FC)= (*(int*)0xC022005C) & 1 ? 0x200000 : 0x100000;
135       
136asm volatile (
137                        "LDR     R0, =0xFFC003D4\n"     //a95-> 3d0
138                        "MOV     R1, #0\n"
139                        "LDR     R3, =0xFFC0040C\n" //a95->
140"loc_FFC00368:\n"
141                        "CMP     R0, R3\n"  //inicia a partir de 0 uma tabela de rotinas (vetor de interrupção ?)
142                        "LDRCC   R2, [R0],#4\n"
143                        "STRCC   R2, [R1],#4\n"
144                        "BCC     loc_FFC00368\n"
145                        "LDR     R0, =0xFFC0040C\n" //routine deals with IRQ (vetor em 0x18 clock IRQ)
146                        "MOV     R1, #0x4B0\n"
147                        "LDR     R3, =0xFFC00620\n" //
148"loc_FFC00384:\n"
149                        "CMP     R0, R3\n"
150                        "LDRCC   R2, [R0],#4\n"
151                        "STRCC   R2, [R1],#4\n"
152                        "BCC     loc_FFC00384\n"
153                        "MOV     R0, #0xD2\n" //Disables IRQ and FIQ and sets IRQ Mode
154                        "MSR     CPSR_cxsf, R0\n"
155                        "MOV     SP, #0x1000\n"
156                        "MOV     R0, #0xD3\n"  //... and sets supervisor mode
157                        "MSR     CPSR_cxsf, R0\n"
158                        "MOV     SP, #0x1000\n"
159                        "LDR     R0, =0x6C4\n"
160                        "LDR     R2, =0xEEEEEEEE\n"
161                        "MOV     R3, #0x1000\n"
162"loc_FFC003B8:\n"
163                        "CMP     R0, R3\n"
164                        "STRCC   R2, [R0],#4\n"
165                        "BCC     loc_FFC003B8\n"
166                        "BL      sub_FFC011B4_my\n" //--------> doesn't return as 11b4_my doesn't
167        );
168}
169
170void __attribute__((naked,noinline)) sub_FFC011B4_my() {
171        asm volatile (
172                "str    lr, [sp, #-4]!\n"
173                "sub    sp, sp, #116\n" // 0x74\n"
174                "mov    r1, #116\n"     // 0x74\n"
175                "mov    r0, sp\n"
176                "BL             sub_FFE99B50\n"
177                "mov    r0, #339968\n"  // 0x53000\n"
178                "str    r0, [sp, #4]\n"
179                //"ldr  r0, [pc, #144]"\n"      // ffc01268: (0013a700)
180#if defined(OPT_CHDK_IN_EXMEM)
181        "LDR     R0, =0x13a700\n"                       // use original heap offset since CHDK is loaded in high memory
182#else
183                "LDR     R0, =new_sa\n"                         // + substitutes MEMISOSTART
184                "LDR     R0, [R0]\n"                            // +
185#endif
186                "ldr    r2, =0x271f80\n" //[pc, #144]"\n"       // ffc0126c: (00271f80)
187                "str    r0, [sp, #8]\n"
188                "sub    r0, r2, r0\n"
189                "str    r0, [sp, #12]\n"
190                "mov    r0, #34\n"      // 0x22\n"
191                "str    r0, [sp, #24]\n"
192                "mov    r0, #104\n"     // 0x68\n"
193                "str    r0, [sp, #28]\n"
194                "ldr    r1, =0x00279c00\n" //[pc, #104]\n"      // ffc01264: (00279c00)
195                "ldr    r0, =0x0000019b\n" //[pc, #112]\n"      // ffc01270: (0000019b)
196                "str    r1, [sp]\n"
197                "str    r0, [sp, #32]\n"
198                "mov    r0, #150\n"     // 0x96\n"
199                "str    r2, [sp, #16]\n"
200                "str    r1, [sp, #20]\n"
201                "str    r0, [sp, #36]\n"        // 0x24\n"
202                "str    r0, [sp, #40]\n"        // 0x28\n"
203                "mov    r0, #100\n"     // 0x64\n"
204                "str    r0, [sp, #44]\n"        // 0x2c\n"
205                "mov    r0, #0\n"
206                "str    r0, [sp, #48]\n"        // 0x30\n"
207                "str    r0, [sp, #52]\n"        // 0x34\n"
208                "mov    r0, #16\n"
209                "str    r0, [sp, #92]\n"        // 0x5c\n"
210                "mov    r0, #2048\n"    // 0x800\n"
211                "str    r0, [sp, #96]\n"        // 0x60\n"
212                "mov    r0, #160\n"     // 0xa0\n"
213                "str    r0, [sp, #100]\n"       // 0x64\n"
214                "mov    r0, #640\n"     // 0x280\n"
215                "str    r0, [sp, #104]\n"       // 0x68\n"
216                "ldr    r1, =sub_FFC05EE4_my\n" //"ldr  r1, =0XFFC05EE4\n" //[pc, #32]\n"       
217                "mov    r2, #0\n"
218                "mov    r0, sp\n"
219                "BL             sub_FFC034C8\n"         //Doesn't return
220                "B              sub_FFC01250\n"
221        );
222}
223
224
225void __attribute__((naked,noinline)) sub_FFC05EE4_my() {
226        asm volatile (
227
228                        "STMFD   SP!, {R4,LR}\n"
229                        "BL      sub_FFC00B2C\n" //FFC00B24\n"
230                        "BL      sub_FFC0A978\n" //FFC0A8D0\n"  // dmSetup
231                        "CMP     R0, #0\n"
232                        "LDRLT   R0, =0xFFC05FF8\n" //FFC05F70\n"       // dmSetup
233                        "BLLT    sub_FFC05FD8\n" //FFC05F50\n"  //_err_init_task
234                        "BL      sub_FFC05B1C\n" //FFC05A98\n"
235                        "CMP     R0, #0\n"
236                        "LDRLT   R0, =0xFFC06000\n" //FFC05F78\n"       // "termDriverInit"
237                        "BLLT    sub_FFC05FD8\n" //FFC05F50\n"
238                        "LDR     R0, =0xFFC06010\n" //FFC05F88\n"       // "/_term"
239                        "BL      sub_FFC05C04\n" //FFC05B80\n"
240                        "CMP     R0, #0\n"
241                        "LDRLT   R0, =0xFFC06018\n" //FFC05F90\n"       // "termDeviceCreate"
242                        "BLLT    sub_FFC05FD8\n" //FFC05F50\n"
243                        "LDR     R0, =0xFFC06010\n" //FFC05F88\n"       // "/_term"
244                        "BL      sub_FFC03CAC\n" //FFC03BF4\n"
245                        "CMP     R0, #0\n"
246                        "LDRLT   R0, =0xFFC0602C\n" //FFC05FA4\n"       // "stdioSetup"
247                        "BLLT    sub_FFC05FD8\n" //FFC05F50\n"
248                        "BL      sub_FFC0A304\n" //FFC0A2C8\n"
249                        "CMP     R0, #0\n"
250                        "LDRLT   R0, =0xFFC06038\n" //FFC05FB0\n"       // "stdlibSetup"
251                        "BLLT    sub_FFC05FD8\n" //FFC05F50\n"
252                        "BL      sub_FFC01694\n" //FFC01680\n"
253                        "CMP     R0, #0\n"
254                        "LDRLT   R0, =0xFFC06044\n" //FFC05FBC\n"       // "armlib_setup"
255                        "BLLT    sub_FFC05FD8\n" //FFC05F50\n"
256                        "LDMFD   SP!, {R4,LR}\n"
257                        "B       taskcreate_Startup_my\n" //-------->
258        );
259};
260
261//ffc10730:
262void __attribute__((naked,noinline)) taskcreate_Startup_my() {//referenced to ixus220
263        asm volatile (
264                                "STMFD   SP!, {R3-R9,LR} \n"
265                                "MOV     R6, #0 \n"
266                                //"BL            sub_FFC23964\n"                                // j_nullsub_107
267                                "BL      sub_FFC2B1CC\n" //FF83D9B0 \n"
268                                "LDR     R9, =0xC0220000 \n"
269                                "MOVS    R7, R0 \n"
270                                "MOV     R8, #1 \n"
271                                "BNE     loc_FFC10790 \n"
272                                "BL      sub_FFC25268\n" //FF8372F0 \n"
273                                "CMP     R0, #0 \n"
274                                "BEQ     loc_FFC10790 \n"
275                                "LDR     R0, [R9, #68]\n"       // 0x44\n"
276                                "BIC     R5, R8, R0 \n"
277                                "LDR     R0, [R9, #92]\n"       // 0x5c\n"
278                                "BIC     R4, R8, R0 \n"
279                                "BL      sub_FFC232AC\n" //FF833DDC \n"
280                                "CMP     R0, #1 \n"
281                                "MOVEQ   R6, #1 \n"
282                                "ORR     R0, R4, R5 \n"
283                                "ORRS    R0, R0, R6 \n"
284                                "BNE     loc_FFC107A0 \n"
285                                //"BL      sub_FF834190 \n" in a800 this routine doesn't exist
286                                "MOV     R0, #0x44 \n"
287                                "STR     R0, [R9,#32] \n"
288                                //"BL      sub_FF834380 \n" in a800 this routine doesn't exist
289        "loc_FFC1078C: \n"
290                                "B       loc_FFC1078C \n"
291        "loc_FFC10790: \n"
292                                "LDR     R0, [R9, #92]\n"       // 0x5c\n"
293                                "BIC     R4, R8, R0 \n"
294                                "LDR     R0, [R9, #68]\n"       // 0x44\n"
295                                "BIC     R5, R8, R0 \n"
296        "loc_FFC107A0: \n"
297                                "MOV     R3, R6 \n"
298                                "MOV     R2, R7 \n"
299                                "MOV     R1, R5 \n"
300                                "MOV     R0, R4 \n"
301                                //"BL      sub_FFC2396C\n" //   ;sub_FFc4383c \n"  //*** COMMENTED for proper poweron - associated with seting 0x20fc above - VERY IMPORTANT
302                                //"BL      sub_FFC23968\n" //   ;sub_FF834B48 \n"                                       //j_nullsub_108
303                                "BL      sub_FFC29590\n"
304                                "LDR     R1, =0x2ce000\n"
305                                "MOV     R0, #0 \n"
306                                "BL      sub_FFC29800\n"
307                                "BL      sub_FFC297A8\n"
308                                "MOV     R3, #0 \n"
309                                "STR     R3, [SP] \n"
310                                //"LDR     R3, =0xFFC106D4\n" //=task_Startup \n"               // original task_Startup
311                                "LDR     R3, =task_Startup_my \n"       // --> patched
312                                "B       sub_FFC107D8\n"        //FF81FD64 \n"                          // --> continue in firmware
313        );
314}
315
316void __attribute__((naked,noinline)) task_Startup_my() {
317//ffc106d4
318        asm volatile (
319                "STMFD   SP!, {R4,LR}\n"
320                "BL     sub_FFC062B0\n"
321                "BL     sub_FFC24AD8\n"
322                "BL     sub_FFC232BC\n"
323                "BL     sub_FFC2B214\n"                                                                 // j_nullsub_110 ou 196
324                "BL     sub_FFC2B400\n"
325                //"BL   sub_ffc2b2a8\n" //start diskboot.bin    //avoids boot loop
326                "BL     sub_FFC2B59C\n"
327                "BL     sub_FFC2B430\n"
328                "BL     sub_FFC28A24\n"
329                "BL     sub_FFC2B5A0\n"
330                "BL      CreateTask_spytask\n"  // +
331                //"BL   sub_FFC2382C\n" // original taskcreate_PhySw()
332                "BL      taskcreate_PhySw_my\n" // +
333                "BL     sub_FFC27168\n" //
334                "BL     sub_FFC2B5B8\n"
335                //"BL   sub_FFC2221C\n"                                                                 // j_nullsub_101
336                "BL     sub_FFC22CC4\n"
337                "BL     sub_FFC2AF88\n"
338                "BL     sub_FFC2325C\n"
339                "BL     sub_FFC22C64\n"
340
341                "BL     sub_FFC2C130\n"
342                "BL     sub_FFC22C28\n"         //Clock enabler
343                "LDMFD   SP!, {R4,LR}\n"
344                "B      sub_FFC061B0\n"
345        );
346}
347
348// ROM:FFC2382C taskcreate_PhySw
349void __attribute__((naked,noinline)) taskcreate_PhySw_my() {
350        asm volatile(
351                        "STMFD   SP!, {R3-R5,LR}\n"
352                        "LDR     R4, =0x1BF8\n"
353                        "LDR     R0, [R4,#0x4]\n"
354                        "CMP     R0, #0\n"
355                        "BNE     sub_FFC23860\n"
356                        "MOV     R3, #0\n"
357                        "STR     R3, [SP]\n"
358                        "LDR     R3, =mykbd_task\n"             // Changed (original = 0xffc237f8)
359                        //  "MOV     R2, #0x800\n"
360                        "MOV     R2, #0x2000\n"                 // + stack size for new task_PhySw so we don't have to do stack switch
361                        "B       sub_FFC23850\n"    // Continue Firmware code
362        );
363}
364
365// ROM:ffc7387c task_InitFileModules
366void __attribute__((naked,noinline)) init_file_modules_task() {
367        asm volatile(
368                        "STMFD   SP!, {R4-R6,LR}\n"
369                        "BL      sub_FFC6C2C0\n"
370                        "LDR     R5, =0x5006\n"
371                        "MOVS    R4, R0\n"
372                        "MOVNE   R1, #0\n"
373                        "MOVNE   R0, R5\n"
374                        "BLNE    sub_FFC6FB08\n"
375                        "BL              sub_FFC6C2EC\n"        // a495 port patch other routines. IXUS220 doesn't tried first the easier way
376                                                                                //"BL      sub_FFC69E74_my\n"                   //------------->
377                        "BL      core_spytask_can_start\n"      // + set "it's safe to start" flag for spytask
378                        "B               sub_FFC7389C\n"        // continues firmware code
379        );
380}
381
382
Note: See TracBrowser for help on using the repository browser.