CHDK_DE Vorschauversion  Trunk Rev. 6014
 Alle Datenstrukturen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
boot.c-Dateireferenz
#include "lolevel.h"
#include "platform.h"
#include "core.h"
+ Include-Abhängigkeitsdiagramm für boot.c:

gehe zum Quellcode dieser Datei

Funktionen

void createHook (void *pNewTcb)
 
void deleteHook (void *pTcb)
 
void boot ()
 
void __attribute__ ((naked, noinline))
 
void h_usrInit ()
 
void h_usrKernelInit ()
 
void h_usrRoot ()
 

Variablen

const char *const new_sa = &_end
 

Dokumentation der Funktionen

void __attribute__ ( (naked, noinline)  )

!!

Definiert in Zeile 15 der Datei boot.c.

23 {
24  volatile long *p=(void*)LED_PR;
25  int i;
26 
27  for(;cnt>0;cnt--){
28  p[0]=0x46;
29 
30  for(i=0;i<0x200000;i++){
31  asm ("nop\n");
32  asm ("nop\n");
33  }
34  p[0]=0x44;
35  for(i=0;i<0x200000;i++){
36  asm ("nop\n");
37  asm ("nop\n");
38  }
39  }
40 }
41 
42 static void __attribute__((noreturn)) panic(int cnt)
43 {
44  blink(cnt);
45  shutdown();
46 }
47 #endif
48 
49 void boot()
50 {
51 
52  asm volatile (
53 // "B 0xFFC00000\n"
54  "MOV R0, #2\n"
55  "TEQ R0, #2\n"
56  "LDR SP, =0x1900\n"
57  "MOV R11, #0\n"
58 
59  "MOV R0, #0x3D\n"
60  "MCR p15, 0, R0,c6,c0\n"
61  "MOV R0, #0xC000002F\n"
62  "MCR p15, 0, R0,c6,c1\n"
63  "MOV R0, #0x31\n"
64  "MCR p15, 0, R0,c6,c2\n"
65  "LDR R0, =0x10000031\n"
66  "MCR p15, 0, R0,c6,c3\n"
67  "MOV R0, #0x40000017\n"
68  "MCR p15, 0, R0,c6,c4\n"
69  "LDR R0, =0xFF80002D\n"
70  "MCR p15, 0, R0,c6,c5\n"
71  "MOV R0, #0x34\n"
72  "MCR p15, 0, R0,c2,c0\n"
73  "MOV R0, #0x34\n"
74  "MCR p15, 0, R0,c2,c0, 1\n"
75  "MOV R0, #0x34\n"
76  "MCR p15, 0, R0,c3,c0\n"
77  "LDR R0, =0x3333330\n"
78  "MCR p15, 0, R0,c5,c0, 2\n"
79  "LDR R0, =0x3333330\n"
80  "MCR p15, 0, R0,c5,c0, 3\n"
81  "MRC p15, 0, R0,c1,c0\n"
82  "ORR R0, R0, #0x1000\n"
83  "ORR R0, R0, #1\n"
84  "MCR p15, 0, R0,c1,c0\n"
85 
86  "STR LR, [SP,#-4]!\n"
87  "MRC p15, 0, R0,c1,c0\n"
88  "ORR R0, R0, #0x1000\n"
89  "ORR R0, R0, #4\n"
90  "ORR R0, R0, #1\n"
91  "MCR p15, 0, R0,c1,c0\n"
92  "LDR R3, =0xB910\n"
93  "MOV R12, #0\n"
94  "CMP R12, R3\n"
95  "LDR R2, =0xFFEF3DF0\n"
96  "MOV R1, #0x1900\n"
97  "BCS loc_FFC00130\n"
98  "MOV LR, R3\n"
99  "loc_FFC00114:\n"
100  "LDR R3, [R2]\n"
101  "ADD R12, R12, #4\n"
102  "CMP R12, LR\n"
103  "STR R3, [R1]\n"
104  "ADD R2, R2, #4\n"
105  "ADD R1, R1, #4\n"
106  "BCC loc_FFC00114\n"
107  "loc_FFC00130:\n"
108  "LDR R1, =0xD210\n"
109  "LDR R3, =0x922D0\n"
110  "MOV R12, #0\n"
111  "RSB R3, R1, R3\n"
112  "CMP R12, R3\n"
113  "BCS loc_FFC0015C\n"
114  "MOV R2, R12\n"
115  "loc_FFC0014C:\n"
116  "ADD R2, R2, #4\n"
117  "CMP R2, R3\n"
118  "STR R12, [R1],#4\n"
119  "BCC loc_FFC0014C\n"
120  "loc_FFC0015C:\n"
121  "MRC p15, 0, R0,c1,c0\n"
122  "ORR R0, R0, #0x1000\n"
123  "BIC R0, R0, #4\n"
124  "ORR R0, R0, #1\n"
125  "MCR p15, 0, R0,c1,c0\n"
126  "LDR LR, [SP],#4\n"
127 // "B sub_FFC0198C\n"
128  "B h_usrInit\n"
129  );
130 // blink(2);
131 
132 }
void boot ( )

Definiert in Zeile 43 der Datei boot.c.

43  {
44 
45  long *canon_data_src = (void*)0xFFEDAC70; // value taken at ROM:FFC00188
46  long *canon_data_dst = (void*)0x1900;
47  long canon_data_len = 0xDF84 - 0x1900; // data_end - data_start 0xDF7C taken at ROM:FFC00138
48  long *canon_bss_start = (void*)0xDF84; // just after data
49  long canon_bss_len = 0xD4F38 - 0xDF84; // d4ec8 taken at ROM:FFC00FB4
50 
51  long i;
52 
53  // enable caches and write buffer...
54  // this is a carryover from old dryos ports, may not be useful
55  asm volatile (
56  "MRC p15, 0, R0,c1,c0\n"
57  "ORR R0, R0, #0x1000\n"
58  "ORR R0, R0, #4\n"
59  "ORR R0, R0, #1\n"
60  "MCR p15, 0, R0,c1,c0\n"
61  :::"r0"
62  );
63 
64  for(i=0;i<canon_data_len/4;i++)
65  canon_data_dst[i]=canon_data_src[i];
66 
67  for(i=0;i<canon_bss_len/4;i++)
68  canon_bss_start[i]=0;
69 
70  asm volatile ("B sub_FFC001A4_my\n");
71 };
void createHook ( void *  pNewTcb)

Definiert in Zeile 110 der Datei main.c.

111 {
112  char *name = (char*)(*(long*)((char*)pNewTcb+0x34));
113  long *entry = (long*)((char*)pNewTcb+0x74);
114 
115  // always hook first task creation
116  // to create SpyProc
117  if (!stop_hooking){
118  task_prev = (void*)(*entry);
119  *entry = (long)task_start_hook;
120  stop_hooking = 1;
121  } else {
122  // hook/replace another tasks
123  if (my_ncmp(name, "tPhySw", 6) == 0){
124  *entry = (long)physw_hook;
125  }
126 
127  if (my_ncmp(name, "tInitFileM", 10) == 0){
128  init_file_modules_prev = (void*)(*entry);
129 #if CAM_MULTIPART
130  *entry = (long)init_file_modules_task;
131 #else
132  *entry = (long)init_file_modules_hook;
133 #endif
134  }
135 
136  if (my_ncmp(name, "tCaptSeqTa", 10) == 0){
137  *entry = (long)capt_seq_hook;
138  }
139 
140 #if CAM_CHDK_HAS_EXT_VIDEO_MENU
141  if (my_ncmp(name, "tMovieReco", 10) == 0){
142  *entry = (long)movie_record_hook;
143  }
144 #endif
145 
146 #if CAM_EXT_TV_RANGE
147  if (my_ncmp(name, "tExpDrvTas", 10) == 0){
148  *entry = (long)exp_drv_task;
149  }
150 #endif
151 
152 #if CAM_HAS_FILEWRITETASK_HOOK
153  if (my_ncmp(name, "tFileWrite", 10) == 0){
154  *entry = (long)filewritetask;
155  }
156 #endif
157 
158 // for cameras that have a "touch control dial" with 'TouchW' task.
159 // some cameras may use a different task name
160 #ifdef HOOK_TOUCHW
161  if (my_ncmp(name, "tTouchW", 7) == 0){
162  *entry = (long)my_touchw_task;
163  }
164 #endif
165 
166  core_hook_task_create(pNewTcb);
167  }
168 }
void deleteHook ( void *  pTcb)

Definiert in Zeile 170 der Datei main.c.

171 {
172  core_hook_task_delete(pTcb);
173 }
void h_usrInit ( )

Definiert in Zeile 135 der Datei boot.c.

136 {
137  asm volatile (
138  "STR LR, [SP,#-4]!\n"
139  "BL sub_FFC01968\n"
140  "MOV R0, #2\n"
141  "MOV R1, R0\n"
142  "BL sub_FFEDA92C\n"
143  "BL sub_FFECD5A8\n"
144  "BL sub_FFC011C4\n"
145  "BL sub_FFC01728\n"
146  "LDR LR, [SP],#4\n"
147 // "B sub_FFC01744\n"
148  "B h_usrKernelInit\n"
149  );
150 }
void h_usrKernelInit ( )

Definiert in Zeile 152 der Datei boot.c.

153 {
154 
155  asm volatile (
156  "STMFD SP!, {R4,LR}\n"
157  "SUB SP, SP, #8\n"
158  "BL sub_FFEDAE2C\n"
159  "BL sub_FFEEDC14\n"
160  "LDR R3, =0xC230\n"
161  "LDR R2, =0x8E900\n"
162  "LDR R1, [R3]\n"
163  "LDR R0, =0x91C90\n"
164  "MOV R3, #0x100\n"
165  "BL sub_FFEE6D24\n"
166  "LDR R3, =0xC1F0\n"
167  "LDR R0, =0xCA38\n"
168  "LDR R1, [R3]\n"
169  "BL sub_FFEE6D24\n"
170  "LDR R3, =0xC2AC\n"
171  "LDR R0, =0x91C64\n"
172  "LDR R1, [R3]\n"
173  "BL sub_FFEE6D24\n"
174  "BL sub_FFEF1FD0\n"
175  "BL sub_FFC012B0\n"
176  "MOV R4, #0\n"
177  "MOV R3, R0\n"
178  "MOV R12, #0x800\n"
179 
180 // "LDR R0, =0xFFC01A60\n"
181 // "MOV R1, #0x4000\n"
182 // "LDR R2, =0x922D0\n"
183 
184  "LDR R0, =h_usrRoot\n"
185  "MOV R1, #0x4000\n"
186  );
187 // "LDR R2, =0xD22D0\n" // 0x922D0 + MEMISOSIZE(0x40000)
188  asm volatile (
189  "LDR R2, =new_sa\n"
190  "LDR R2, [R2]\n"
191  );
192  asm volatile (
193 
194  "STR R12, [SP]\n"
195  "STR R4, [SP,#4]\n"
196  "BL sub_FFEEAE54\n"
197  "ADD SP, SP, #8\n"
198  "LDMFD SP!, {R4,PC}\n"
199  );
200 }
void h_usrRoot ( )

Definiert in Zeile 203 der Datei boot.c.

204 {
205  asm volatile (
206  "STMFD SP!, {R4,R5,LR}\n"
207  "MOV R5, R0\n"
208  "MOV R4, R1\n"
209  "BL sub_FFC019D0\n"
210  "MOV R1, R4\n"
211  "MOV R0, R5\n"
212  "BL sub_FFEDFAC0\n"
213  "MOV R1, R4\n"
214  "MOV R0, R5\n"
215  "BL sub_FFEE0538\n"
216  "BL sub_FFC017E8\n"
217  "BL sub_FFC01704\n"
218  "BL sub_FFC01A0C\n"
219  "BL sub_FFC019F0\n"
220  "BL sub_FFC01A38\n"
221  "BL sub_FFC019C4\n"
222  );
223 
224 // patch begin
227 
228  drv_self_hide();
229 
230 // patch end
231 
232  asm volatile (
233  "LDMFD SP!, {R4,R5,LR}\n"
234  "B sub_FFC0136C\n"
235  );
236 }

Variablen-Dokumentation

const char* const new_sa = &_end

Definiert in Zeile 5 der Datei boot.c.