| 1 | #ifndef LOLEVEL_H |
|---|
| 2 | #define LOLEVEL_H |
|---|
| 3 | |
|---|
| 4 | #ifndef LOW_LEVEL |
|---|
| 5 | #error File can be included when platform is built only! |
|---|
| 6 | #endif |
|---|
| 7 | |
|---|
| 8 | #ifndef __arm__ |
|---|
| 9 | #error File can be included in ARM mode only! |
|---|
| 10 | #endif |
|---|
| 11 | |
|---|
| 12 | /* Canon stuff */ |
|---|
| 13 | extern long *_GetSystemTime(long *t); |
|---|
| 14 | extern long _GetZoomLensCurrentPosition(); |
|---|
| 15 | extern long _GetZoomLensCurrentPoint(); |
|---|
| 16 | extern long _MoveZoomLensWithPoint(short *pos); |
|---|
| 17 | extern long _SetZoomActuatorSpeedPercent(short *perc); |
|---|
| 18 | extern volatile long zoom_busy; |
|---|
| 19 | extern long _GetFocusLensCurrentPosition(); |
|---|
| 20 | extern long _GetFocusLensSubjectDistance(); |
|---|
| 21 | extern long _GetFocusLensSubjectDistanceFromLens(); |
|---|
| 22 | extern void _MoveFocusLensToDistance(short *dist); |
|---|
| 23 | extern void _PutInNdFilter(); |
|---|
| 24 | extern void _PutOutNdFilter(); |
|---|
| 25 | extern volatile long focus_busy; |
|---|
| 26 | extern long _GetCurrentAvValue(); |
|---|
| 27 | extern long _GetCurrentTargetDistance(); |
|---|
| 28 | extern long _GetPropertyCase(long opt_id, void *buf, long bufsize); |
|---|
| 29 | extern long _SetPropertyCase(long opt_id, void *buf, long bufsize); |
|---|
| 30 | extern long _IsStrobeChargeCompleted(); |
|---|
| 31 | extern long _VbattGet(); |
|---|
| 32 | extern int _GetBatteryTemperature(); |
|---|
| 33 | extern int _GetCCDTemperature(); |
|---|
| 34 | extern int _GetOpticalTemperature(); |
|---|
| 35 | extern void _PT_PlaySound(short , void*); |
|---|
| 36 | extern void _RefreshPhysicalScreen(long f); |
|---|
| 37 | extern void _Unmount_FileSystem(); |
|---|
| 38 | extern void _Mount_FileSystem(); |
|---|
| 39 | extern void _SleepTask(long msec); |
|---|
| 40 | extern int _CreateTask (const char *name, int prio, int stack_size /*?*/, |
|---|
| 41 | void *entry, long parm /*?*/); |
|---|
| 42 | extern void _SleepTask(long msec); |
|---|
| 43 | extern void __attribute__((noreturn)) _ExitTask(); |
|---|
| 44 | extern int _taskNameToId(char* taskName); // VxWorks only, task's name first letter must be 't', maximum 10 chars total |
|---|
| 45 | extern const char *_taskName(int taskID); // VxWorks only for now |
|---|
| 46 | extern int _taskIdListGet(int *idlist,int max); // VxWorks only for now |
|---|
| 47 | extern void _taskSuspend(int taskId); |
|---|
| 48 | extern void _taskResume(int taskId); |
|---|
| 49 | extern int _errnoOfTaskGet(int tid); |
|---|
| 50 | extern long _IsStrobeChargeCompleted(); |
|---|
| 51 | |
|---|
| 52 | long _SetEventFlag(void *flag, long what); |
|---|
| 53 | long _CheckAnyEventFlag(void *flag, long mask, long *res); |
|---|
| 54 | long _GetEventFlagValue(void *flag, long *res); |
|---|
| 55 | |
|---|
| 56 | long _ReceiveMessageQueue(void *msgq, long *dst, long unk1 /* maybe size? */); |
|---|
| 57 | |
|---|
| 58 | /* Canon stuff with nonoriginal naming */ |
|---|
| 59 | extern long _GetParameterData(long id, void *buf, long size); |
|---|
| 60 | extern long _SetParameterData(long id, void *buf, long size); |
|---|
| 61 | #ifdef CAM_DRYOS_2_3_R47 |
|---|
| 62 | extern void _MakeSDCardBootable(int driveno); |
|---|
| 63 | #else |
|---|
| 64 | extern void _UpdateMBROnFlash(int driveno, long offset, char *str); |
|---|
| 65 | #endif |
|---|
| 66 | |
|---|
| 67 | /* standart C library */ |
|---|
| 68 | //extern int _creat (const char *name, int flags); |
|---|
| 69 | extern int _open (const char *name, int flags, int mode ); |
|---|
| 70 | extern int _close (int fd); |
|---|
| 71 | extern int _write (int fd, void *buffer, long nbytes); |
|---|
| 72 | extern int _read (int fd, void *buffer, long nbytes); |
|---|
| 73 | extern int _lseek (int fd, long offset, int whence); |
|---|
| 74 | extern long _mkdir(const char *dirname); |
|---|
| 75 | |
|---|
| 76 | extern int _Open (const char *name, int flags, int mode ); |
|---|
| 77 | extern int _Close (int fd); |
|---|
| 78 | extern int _Write (int fd, const void *buffer, long nbytes); |
|---|
| 79 | extern int _Read (int fd, void *buffer, long nbytes); |
|---|
| 80 | extern int _Lseek (int fd, long offset, int whence); |
|---|
| 81 | extern int _Remove(const char *name); |
|---|
| 82 | |
|---|
| 83 | extern long _Fopen_Fut(const char *filename, const char *mode); |
|---|
| 84 | extern long _Fclose_Fut(long file); |
|---|
| 85 | extern long _Fread_Fut(void *buf, long elsize, long count, long f); |
|---|
| 86 | extern long _Fwrite_Fut(const void *buf, long elsize, long count, long f); |
|---|
| 87 | extern long _Fseek_Fut(long file, long offset, long whence); |
|---|
| 88 | extern long _Fflush_Fut(long file); |
|---|
| 89 | extern long _Feof_Fut(long file); |
|---|
| 90 | extern long _Fflush_Fut(long file); |
|---|
| 91 | extern char *_Fgets_Fut(char *buf, int n, long f); |
|---|
| 92 | extern long _RenameFile_Fut(const char *oldname, const char *newname); |
|---|
| 93 | extern long _DeleteFile_Fut(const char *name); |
|---|
| 94 | extern long _MakeDirectory_Fut(const char *name,int unk); |
|---|
| 95 | |
|---|
| 96 | extern int _rename(const char *oldname, const char *newname); |
|---|
| 97 | |
|---|
| 98 | extern int _isdigit(int c); |
|---|
| 99 | extern int _isspace(int c); |
|---|
| 100 | extern int _isalpha(int c); |
|---|
| 101 | extern int _isupper(int c); |
|---|
| 102 | extern int _islower(int c); |
|---|
| 103 | extern int _ispunct(int c); |
|---|
| 104 | extern int _isxdigit(int c); |
|---|
| 105 | |
|---|
| 106 | extern long _strlen(const char *s); |
|---|
| 107 | extern int _strcmp(const char *s1, const char *s2); |
|---|
| 108 | extern int _strncmp(const char *s1, const char *s2, long n); |
|---|
| 109 | extern char *_strchr(const char *s, int c); |
|---|
| 110 | extern char *_strcpy(char *dest, const char *src); |
|---|
| 111 | extern char *_strncpy(char *dest, const char *src, long n); |
|---|
| 112 | extern char *_strcat(char *dest, const char *app); |
|---|
| 113 | extern char *_strrchr(const char *s, int c); |
|---|
| 114 | extern char *_strpbrk(const char *s, const char *accept); |
|---|
| 115 | |
|---|
| 116 | extern long _strtol(const char *nptr, char **endptr, int base); |
|---|
| 117 | extern unsigned long _strtoul(const char *nptr, char **endptr, int base); |
|---|
| 118 | // DRYOS: this function is called by strtol (mode=1) and strtoul (mode=0) |
|---|
| 119 | // easier to match with sig finder |
|---|
| 120 | extern long _strtolx(const char *nptr, char **endptr, int base, int mode); |
|---|
| 121 | |
|---|
| 122 | extern int _tolower(int c); |
|---|
| 123 | extern int _toupper(int c); |
|---|
| 124 | |
|---|
| 125 | extern int _vsprintf(char *buf, const char *fmt, __builtin_va_list va_list); |
|---|
| 126 | |
|---|
| 127 | extern void *_malloc(long size); |
|---|
| 128 | extern void _free(void *p); |
|---|
| 129 | extern void *_AllocateUncacheableMemory(long size); |
|---|
| 130 | extern void _FreeUncacheableMemory(void *p); |
|---|
| 131 | |
|---|
| 132 | extern void *_memchr(const void *s, int c, int n); |
|---|
| 133 | extern void *_memcpy(void *dest, const void *src, long n); |
|---|
| 134 | extern void *_memset(void *s, int c, int n); |
|---|
| 135 | extern int _memcmp(const void *s1, const void *s2, long n); |
|---|
| 136 | |
|---|
| 137 | extern void _qsort (void *__base, int __nelem, int __size, int (*__cmp)(const void *__e1, const void *__e2)); |
|---|
| 138 | |
|---|
| 139 | /* VxWorks */ |
|---|
| 140 | extern long _taskLock(); |
|---|
| 141 | extern long _taskUnlock(); |
|---|
| 142 | extern int _taskCreateHookAdd (void *createHook); |
|---|
| 143 | extern int _taskDeleteHookAdd (void *deleteHook); |
|---|
| 144 | extern long _iosDevAdd(void*,void*,int); |
|---|
| 145 | extern long _iosDevDelete(void*); |
|---|
| 146 | extern long _iosDrvInstall(void*,void*,void*,void*,void*,void*,void*); |
|---|
| 147 | extern void _GiveSemaphore(int sem); |
|---|
| 148 | |
|---|
| 149 | /* misc */ |
|---|
| 150 | extern const char aPhysw; |
|---|
| 151 | extern long physw_run; |
|---|
| 152 | extern long _kbd_p1_f(); |
|---|
| 153 | extern void _kbd_p2_f(); |
|---|
| 154 | extern void _kbd_pwr_on(); |
|---|
| 155 | extern void _kbd_pwr_off(); |
|---|
| 156 | extern void _kbd_read_keys_r2(void*p); |
|---|
| 157 | extern long physw_status[3], physw_copy[3]; |
|---|
| 158 | |
|---|
| 159 | void __attribute__((naked,noinline)) mykbd_task(); |
|---|
| 160 | extern void capt_seq_task(); |
|---|
| 161 | extern void movie_record_task(); |
|---|
| 162 | extern void init_file_modules_task(); |
|---|
| 163 | extern void exp_drv_task(); |
|---|
| 164 | |
|---|
| 165 | void kbd_fetch_data(long *dst); |
|---|
| 166 | |
|---|
| 167 | /*used to detect play or record mode without relying on physical switch positions |
|---|
| 168 | values on most cameras: |
|---|
| 169 | 0 = startup in play |
|---|
| 170 | 1 = unknown, appears to happen in first play<->rec transition |
|---|
| 171 | 2 = record mode |
|---|
| 172 | 4 = canon menu in record mode |
|---|
| 173 | 3 = play after being in record mode at least once |
|---|
| 174 | 5 = transitioning between some record modes, such as movie |
|---|
| 175 | values on very old vxworks cameras (ixus50_sd400, ixus700_sd500, s2is) |
|---|
| 176 | 0 = startup in play |
|---|
| 177 | 1 = rec |
|---|
| 178 | 2 = play |
|---|
| 179 | 3 = maybe transition ? |
|---|
| 180 | address in all cases can be found with strings "MenuIn", "MenuOut" |
|---|
| 181 | */ |
|---|
| 182 | extern long playrec_mode; |
|---|
| 183 | |
|---|
| 184 | extern void *led_table; |
|---|
| 185 | extern void _UniqueLedOn(void *addr, long brightness); |
|---|
| 186 | extern void _UniqueLedOff(void *addr); |
|---|
| 187 | struct led_control {int led_num; int action; int brightness; int blink_count;}; |
|---|
| 188 | extern int _PostLEDMessage(struct led_control *); |
|---|
| 189 | int _LEDDrive(int led, int action); |
|---|
| 190 | |
|---|
| 191 | extern long _LockMainPower(); |
|---|
| 192 | extern long _UnlockMainPower(); |
|---|
| 193 | extern void _SetAutoShutdownTime(int t); |
|---|
| 194 | |
|---|
| 195 | /* |
|---|
| 196 | The following two functions post an event such as button press, switch change, cable connection change. |
|---|
| 197 | event: |
|---|
| 198 | A number identifying the event. This number may vary between camera models. |
|---|
| 199 | See levent.c and levent.h for methods to identify events by name. |
|---|
| 200 | unk: |
|---|
| 201 | Unknown value, usually 0 in canon code. For jogdial messages, this is number of clicks. |
|---|
| 202 | return value: |
|---|
| 203 | Unknown, possibly void. |
|---|
| 204 | */ |
|---|
| 205 | extern int _PostLogicalEventForNotPowerType(int event, int unk); |
|---|
| 206 | extern int _PostLogicalEventToUI(int event, int unk); |
|---|
| 207 | /* |
|---|
| 208 | Used in the canon code to modify the generation or delivery of events. For example, Canon |
|---|
| 209 | mode override code sets 1 on the desired dial position, and zero on all others. |
|---|
| 210 | event: as described above for PostLogicalEvent* |
|---|
| 211 | state: if 1, the event will be generated/delivered as normal. If 0, the event is disabled/blocked. |
|---|
| 212 | */ |
|---|
| 213 | extern void _SetLogicalEventActive(unsigned event, unsigned state); |
|---|
| 214 | /* Somehow related to the above. Normally 0, set to 1 for script mode */ |
|---|
| 215 | extern void _SetScriptMode(unsigned mode); |
|---|
| 216 | |
|---|
| 217 | /* math */ |
|---|
| 218 | extern int _rand(void); |
|---|
| 219 | extern void* _srand(unsigned int seed); |
|---|
| 220 | |
|---|
| 221 | extern double __log(double x); |
|---|
| 222 | extern double __log10(double x); |
|---|
| 223 | extern double __pow(double x, double y); |
|---|
| 224 | extern double __sqrt(double x); |
|---|
| 225 | |
|---|
| 226 | /* time */ |
|---|
| 227 | extern int _utime(const char *file, void *newTimes); |
|---|
| 228 | extern unsigned long _time(unsigned long *timer); |
|---|
| 229 | extern void *_localtime(const unsigned long *_tod); |
|---|
| 230 | extern void *_LocalTime(const unsigned long *_tod, void * t_m); // DRYOS |
|---|
| 231 | extern long _strftime(char *s, unsigned long maxsize, const char *format, const /*struct tm*/ void *timp); |
|---|
| 232 | extern /*time_t*/ long _mktime(/*struct tm*/ void *timp); // VXWORKS |
|---|
| 233 | extern /*time_t*/ long _mktime_ext(void *tim_extp); // DRYOS, doesn't take a struct tm * |
|---|
| 234 | |
|---|
| 235 | #ifdef CAM_DRYOS_2_3_R39 |
|---|
| 236 | int _SetFileTimeStamp(const char *file_path, int time1, int time2); |
|---|
| 237 | #else |
|---|
| 238 | extern int _SetFileTimeStamp(int fd, int time1, int time2); |
|---|
| 239 | #endif |
|---|
| 240 | |
|---|
| 241 | /* file */ |
|---|
| 242 | extern void *_opendir(const char* name); |
|---|
| 243 | extern void *_readdir(void *d); |
|---|
| 244 | extern int _ReadFastDir(void *d, void* dd); // DRYOS |
|---|
| 245 | extern int _closedir(void *d); |
|---|
| 246 | extern void _rewinddir(void *d); |
|---|
| 247 | extern int _stat(const char *name, void *pStat); |
|---|
| 248 | extern unsigned long _GetDrive_ClusterSize(int drive); |
|---|
| 249 | extern unsigned long _GetDrive_TotalClusters(int drive); |
|---|
| 250 | extern unsigned long _GetDrive_FreeClusters(int drive); |
|---|
| 251 | extern int _WriteSDCard(unsigned int drive, unsigned int start_sect, unsigned int num_sect, void *buf); |
|---|
| 252 | extern void _UnsetZoomForMovie(void); |
|---|
| 253 | void _TurnOffMic(void); |
|---|
| 254 | void _TurnOnMic(void); |
|---|
| 255 | |
|---|
| 256 | extern void _MakeAFScan(int*, int); |
|---|
| 257 | extern void _ExpCtrlTool_StartContiAE(int, int); |
|---|
| 258 | extern void _ExpCtrlTool_StopContiAE(int, int); |
|---|
| 259 | |
|---|
| 260 | extern int some_flag_for_af_scan; |
|---|
| 261 | extern int parameter_for_af_scan; |
|---|
| 262 | extern void _SetAE_ShutterSpeed(short* tv); |
|---|
| 263 | |
|---|
| 264 | extern void _EnterToCompensationEVF(void); |
|---|
| 265 | extern void _ExitFromCompensationEVF(void); |
|---|
| 266 | |
|---|
| 267 | extern void _TurnOnBackLight(void); |
|---|
| 268 | extern void _TurnOffBackLight(void); |
|---|
| 269 | |
|---|
| 270 | // reyalp used to calculate size of loaded CHDK |
|---|
| 271 | // these are linker symbols, with no actual data attached! |
|---|
| 272 | extern const char _start,_end; |
|---|
| 273 | |
|---|
| 274 | extern void _DoAFLock(void); |
|---|
| 275 | extern void _UnlockAF(void); |
|---|
| 276 | |
|---|
| 277 | extern int _apex2us(int); |
|---|
| 278 | |
|---|
| 279 | extern void _ScreenLock(); |
|---|
| 280 | extern void _SetCurrentCaptureModeType(); |
|---|
| 281 | extern unsigned _ExecuteEventProcedure(const char *name,...); |
|---|
| 282 | // known in CHDK as _RefreshPhysicalScreen |
|---|
| 283 | //extern void _ScreenUnLock(); |
|---|
| 284 | |
|---|
| 285 | // 7 calls functions and sets some MMIOs, but doesn't disable caches and actually restart |
|---|
| 286 | // 3 skips one function call on some cameras, but does restart |
|---|
| 287 | void _Restart(unsigned option); |
|---|
| 288 | |
|---|
| 289 | // boot an fir/fi2 file |
|---|
| 290 | void _reboot_fw_update(const char* bootfile); |
|---|
| 291 | #ifdef CAM_CHDK_PTP |
|---|
| 292 | extern int _add_ptp_handler(int, void*, int); |
|---|
| 293 | extern void _set_control_event(int); |
|---|
| 294 | extern void _PB2Rec(); |
|---|
| 295 | extern void _Rec2PB(); |
|---|
| 296 | #endif |
|---|
| 297 | |
|---|
| 298 | #ifdef OPT_EXMEM_MALLOC |
|---|
| 299 | // dryos + some vxworks only takes 3 params in reality |
|---|
| 300 | // on some vxworks the function that is easy to match with sig finder takes an additional param, |
|---|
| 301 | // set to zero in the real AllocateExMem |
|---|
| 302 | // versions that don't expect a 4th param will just ignore it |
|---|
| 303 | extern void *_exmem_alloc(int pool_id,int size,int unk,int unk2); |
|---|
| 304 | #endif |
|---|
| 305 | |
|---|
| 306 | // vxworks only |
|---|
| 307 | // used on a few cameras that don't have memPartInfoGet, see CAM_NO_MEMPARTINFO |
|---|
| 308 | extern int _memPartFindMax(int mempart_id); |
|---|
| 309 | extern int _memPartInfoGet(int mempart_id,int *info); |
|---|
| 310 | |
|---|
| 311 | #endif |
|---|