source: trunk/platform/generic/wrappers.c @ 740

Revision 740, 19.7 KB checked in by reyalp, 4 years ago (diff)

IXUS 980/ SD 990 beta
disable fi2 for sx1, viewport_width for 990 merge

  • Property svn:eol-style set to native
Line 
1#include "camera.h"
2#include "lolevel.h"
3#include "platform.h"
4#include "conf.h"
5#include "math.h"
6
7#if CAM_DRYOS
8#define _U      0x01    /* upper */
9#define _L      0x02    /* lower */
10#define _D      0x04    /* digit */
11#define _C      0x08    /* cntrl */
12#define _P      0x10    /* punct */
13#define _S      0x20    /* white space (space/lf/tab) */
14#define _X      0x40    /* hex digit */
15#define _SP     0x80    /* hard space (0x20) */
16unsigned char _ctype[] = {
17_C,_C,_C,_C,_C,_C,_C,_C,                        /* 0-7 */
18_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C,         /* 8-15 */
19_C,_C,_C,_C,_C,_C,_C,_C,                        /* 16-23 */
20_C,_C,_C,_C,_C,_C,_C,_C,                        /* 24-31 */
21_S|_SP,_P,_P,_P,_P,_P,_P,_P,                    /* 32-39 */
22_P,_P,_P,_P,_P,_P,_P,_P,                        /* 40-47 */
23_D,_D,_D,_D,_D,_D,_D,_D,                        /* 48-55 */
24_D,_D,_P,_P,_P,_P,_P,_P,                        /* 56-63 */
25_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U,      /* 64-71 */
26_U,_U,_U,_U,_U,_U,_U,_U,                        /* 72-79 */
27_U,_U,_U,_U,_U,_U,_U,_U,                        /* 80-87 */
28_U,_U,_U,_P,_P,_P,_P,_P,                        /* 88-95 */
29_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L,      /* 96-103 */
30_L,_L,_L,_L,_L,_L,_L,_L,                        /* 104-111 */
31_L,_L,_L,_L,_L,_L,_L,_L,                        /* 112-119 */
32_L,_L,_L,_P,_P,_P,_P,_C,                        /* 120-127 */
330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                /* 128-143 */
340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                /* 144-159 */
350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                /* 160-175 */
360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                /* 176-191 */
370,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                /* 192-207 */
380,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                /* 208-223 */
390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                /* 224-239 */
400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};               /* 240-255 */
41#endif
42
43void msleep(long msec)
44{
45    _SleepTask(msec);
46}
47
48#ifndef CAM_DRYOS
49void task_lock()
50{
51    _taskLock();
52}
53
54void task_unlock()
55{
56    _taskUnlock();
57}
58
59const char *task_name(int id)
60{
61    return _taskName(id);
62}
63
64int task_id_list_get(int *idlist,int size)
65{
66    return _taskIdListGet(idlist,size);
67}
68#endif
69
70long get_property_case(long id, void *buf, long bufsize)
71{
72    return _GetPropertyCase(id, buf, bufsize);
73}
74
75long set_property_case(long id, void *buf, long bufsize)
76{
77    return _SetPropertyCase(id, buf, bufsize);
78}
79
80void remount_filesystem()
81{
82    _Unmount_FileSystem();
83    _Mount_FileSystem();
84}
85
86
87void mark_filesystem_bootable()
88{
89    _UpdateMBROnFlash(0, 0x40, "BOOTDISK");
90}
91
92void __attribute__((weak)) vid_bitmap_refresh()
93{
94    _RefreshPhysicalScreen(1);
95}
96
97
98long get_parameter_data(long id, void *buf, long bufsize)
99{
100    return _GetParameterData(id|0x4000, buf, bufsize);
101}
102
103long set_parameter_data(long id, void *buf, long bufsize)
104{
105    return _SetParameterData(id|0x4000, buf, bufsize);
106}
107
108long lens_get_zoom_pos()
109{
110    return _GetZoomLensCurrentPosition();
111}
112
113void lens_set_zoom_pos(long newpos)
114{
115}
116
117long lens_get_zoom_point()
118{
119    return _GetZoomLensCurrentPoint();
120}
121
122void lens_set_zoom_point(long newpt)
123{
124    if (newpt < 0) {
125        newpt = 0;
126    } else if (newpt >= zoom_points) {
127        newpt = zoom_points-1;
128    }
129    _MoveZoomLensWithPoint((short*)&newpt);
130    while (zoom_busy);
131    if (newpt==0) zoom_status=ZOOM_OPTICAL_MIN;
132    else if (newpt >= zoom_points) zoom_status=ZOOM_OPTICAL_MAX;
133    else zoom_status=ZOOM_OPTICAL_MEDIUM;
134}
135
136void lens_set_zoom_speed(long newspd)
137{
138    if (newspd < 5) {
139        newspd = 5;
140    } else if (newspd > 100) {
141        newspd = 100;
142    }
143    _SetZoomActuatorSpeedPercent((short*)&newspd);
144}
145
146void lens_set_focus_pos(long newpos)
147{
148    _MoveFocusLensToDistance((short*)&newpos);
149    //while (focus_busy);
150    while ((shooting_is_flash_ready()!=1) || (focus_busy));
151    newpos = _GetFocusLensSubjectDistance();
152    _SetPropertyCase(PROPCASE_SUBJECT_DIST1, &newpos, sizeof(newpos));
153    _SetPropertyCase(PROPCASE_SUBJECT_DIST2, &newpos, sizeof(newpos));
154}
155
156void play_sound(unsigned sound)
157{
158        static const int sounds[]={ 0x2001, //startup sound
159                                0x2002, //shutter sound
160                                0x2003, //button press sound
161                                0x2004, //self-timer sound
162                                0xC211, //short beep
163                                50000,  // AF confirmation
164                                0xC507, // error beep imo
165                                0x400D, // LONG ERROR BEEP CONTINIUOUS- warning, cannot be stopped (yet)
166                            };
167    if(sound >= sizeof(sounds)/sizeof(sounds[0]))
168        return;
169
170    _PT_PlaySound(sounds[sound], 0);
171}
172
173long stat_get_vbatt()
174{
175    return _VbattGet();
176}
177
178int get_battery_temp()
179{
180    return _GetBatteryTemperature();
181}
182
183int get_ccd_temp()
184{
185    return _GetCCDTemperature();
186}
187
188int get_optical_temp()
189{
190    return _GetOpticalTemperature();
191}
192
193long get_tick_count()
194{
195long t;
196#if !CAM_DRYOS
197    _GetSystemTime(&t);
198    return t;
199#else
200    return (int)_GetSystemTime(&t);
201#endif
202}
203
204/*int creat (const char *name, int flags)
205{
206    return _creat(name, flags);
207}*/
208int open (const char *name, int flags, int mode )
209{
210    return _Open(name, flags, mode);
211}
212int close (int fd)
213{
214    return _Close(fd);
215}
216int write (int fd, void *buffer, long nbytes)
217{
218    return _Write(fd, buffer, nbytes);
219}
220int read (int fd, void *buffer, long nbytes)
221{
222    return _Read(fd, buffer, nbytes);
223}
224int lseek (int fd, long offset, int whence)
225{
226    return _lseek(fd, offset, whence); /* yes, it's lower-case lseek here since Lseek calls just lseek (A610) */
227}
228long mkdir(const char *dirname)
229{
230    return _mkdir(dirname);
231}
232
233int remove(const char *name) {
234    return _Remove(name);
235}
236
237int errnoOfTaskGet(int tid) {
238#if !CAM_DRYOS
239    return _errnoOfTaskGet(tid);
240#else
241    return 0;
242#endif
243}
244
245int isdigit(int c) {
246#if !CAM_DRYOS
247    return _isdigit(c);
248#else
249    return _ctype[c]&_D;
250#endif
251}
252
253int isspace(int c) {
254#if !CAM_DRYOS
255    return _isspace(c);
256#else
257    return _ctype[c]&_S;
258#endif
259
260}
261
262int isalpha(int c) {
263#if !CAM_DRYOS
264    return _isalpha(c);
265#else
266    return _ctype[c]&(_U|_L);
267#endif
268}
269
270int isupper(int c) {
271#if !CAM_DRYOS
272    return _isupper(c);
273#else
274    return _ctype[c]&_U;
275#endif
276
277}
278
279int islower(int c) {
280#if !CAM_DRYOS
281    return _islower(c);
282#else
283    return _ctype[c]&_L;
284#endif
285
286}
287
288int ispunct(int c) {
289#if !CAM_DRYOS
290    return _ispunct(c);
291#else
292    return _ctype[c]&_P;
293#endif
294}
295
296int isxdigit(int c) {
297#if !CAM_DRYOS
298    return _isxdigit(c);
299#else
300    return _ctype[c]&(_X|_D);
301#endif
302}
303
304long strlen(const char *s) {
305    return _strlen(s);
306}
307
308int strcmp(const char *s1, const char *s2) {
309    return _strcmp(s1, s2);
310}
311
312int strncmp(const char *s1, const char *s2, long n) {
313    return _strncmp(s1, s2, n);
314}
315
316char *strchr(const char *s, int c) {
317    return _strchr(s, c);
318}
319
320char *strcpy(char *dest, const char *src) {
321    return _strcpy(dest, src);
322}
323
324char *strncpy(char *dest, const char *src, long n) {
325    return _strncpy(dest, src, n);
326}
327
328char *strcat(char *dest, const char *app) {
329    return _strcat(dest, app);
330}
331
332char *strrchr(const char *s, int c) {
333    return _strrchr(s, c);
334}
335
336long strtol(const char *nptr, char **endptr, int base) {
337    return _strtol(nptr, endptr, base);
338}
339
340char *strpbrk(const char *s, const char *accept) {
341#if !CAM_DRYOS
342    return _strpbrk(s, accept);
343#else
344    const char *sc1,*sc2;
345
346    for( sc1 = s; *sc1 != '\0'; ++sc1) {
347     for( sc2 = accept; *sc2 != '\0'; ++sc2) {
348      if (*sc1 == *sc2) return (char *) sc1;
349     }
350    }
351return (void*)0;
352#endif
353}
354
355long sprintf(char *s, const char *st, ...)
356{
357    long res;
358    __builtin_va_list va;
359    __builtin_va_start(va, st);
360    res = _vsprintf(s, st, va);
361    __builtin_va_end(va);
362    return res;
363}
364
365// strerror exists on vxworks cams,
366// but it does about the same thing as this
367const char *strerror(int en) {
368#if !CAM_DRYOS
369    static char msg[20];
370    sprintf(msg,"errno 0x%X",en);
371    return msg;
372#else
373    return "error";
374#endif
375}
376
377int tolower(int c) {
378#if !CAM_DRYOS
379        return _tolower(c);
380#else
381        return isupper(c) ? c - 'A' + 'a' : c;
382#endif
383}
384
385int toupper(int c) {
386#if !CAM_DRYOS
387        return _toupper(c);
388#else
389        return islower(c) ? c - 'a' + 'A' : c;
390#endif
391}
392
393unsigned long time(unsigned long *timer) {
394    return _time(timer);
395}
396
397int utime(char *file, void *newTimes) {
398#if !CAM_DRYOS
399  return _utime(file, newTimes);
400#else
401 int fd;
402 int res=0;
403 fd = _open(file, 0, 0);
404 if (fd>=0) {
405  res=_SetFileTimeStamp(fd, ((int*)newTimes)[0] , ((int*)newTimes)[1]);
406  _close(fd);
407 }
408 // return value compatibe with utime: ok=0 fail=-1
409 return (res)?0:-1;
410#endif
411}
412
413void *localtime(const unsigned long *_tod) {
414#if !CAM_DRYOS
415    return _localtime(_tod);
416#else
417// for DRYOS cameras do something with this!  - sizeof(x[]) must be >= sizeof(struct tm) :  'static int x[9];'
418  static int x[9];
419  return _LocalTime(_tod, &x);   
420#endif
421}
422
423long strftime(char *s, unsigned long maxsize, const char *format, /*const struct tm*/ void *timp) {
424        return _strftime(s,maxsize,format,timp);
425}
426
427/*time_t*/ long mktime(/*struct tm*/ void *timp) {
428#if !CAM_DRYOS
429        return _mktime(timp);
430#else
431        int timp_ext[10]; // struct tm + a ptr
432        _memcpy(timp_ext,timp,9*sizeof(int));
433        timp_ext[9]=0;
434        long retval = _mktime_ext(&timp_ext);
435        _memcpy(timp,timp_ext,9*sizeof(int));
436        return retval;
437#endif
438}
439
440double _log(double x) {
441    return __log(x);
442}
443
444double _log10(double x) {
445    return __log10(x);
446}
447
448double _pow(double x, double y) {
449    return __pow(x, y);
450}
451
452double _sqrt(double x) {
453    return __sqrt(x);
454}
455
456void *malloc(long size) {
457    return _malloc(size);
458}
459
460void free(void *p) {
461    return _free(p);
462}
463
464void *memcpy(void *dest, const void *src, long n) {
465    return _memcpy(dest, src, n);
466}
467
468void *memset(void *s, int c, int n) {
469    return _memset(s, c, n);
470}
471
472int memcmp(const void *s1, const void *s2, long n) {
473    return _memcmp(s1, s2, n);
474}
475
476void *memchr(const void *s, int c, int n) {
477#if !CAM_DRYOS
478        return _memchr(s,c,n);
479#else
480        while (n-- > 0) {
481                if (*(char *)s == c)
482                        return (void *)s;
483                s++;
484        }
485        return (void *)0;
486#endif
487}
488
489int rand(void) {
490    return _rand();
491}
492
493void *srand(unsigned int seed) {
494    return _srand(seed);
495}
496
497void qsort(void *__base, int __nelem, int __size, int (*__cmp)(const void *__e1, const void *__e2)) {
498    _qsort(__base, __nelem, __size, __cmp);
499}
500
501void *opendir(const char* name) {
502    return _opendir(name);
503}
504
505void* readdir(void *d) {
506# if !CAM_DRYOS
507    return _readdir(d);
508#else
509// for DRYOS cameras  A650, A720  do something with this!  - sizeof(de[]) must be >= sizeof(struct dirent): 'static char de[40];'
510  static char de[40];
511  _ReadFastDir(d, &de);
512  return de[0]? &de : (void*)0;
513#endif
514}
515
516int closedir(void *d) {
517    return _closedir(d);
518}
519
520void rewinddir(void *d) {
521    return _rewinddir(d);
522}
523
524int stat(char *name, void *pStat) {
525    return _stat(name, pStat);
526}
527
528void *umalloc(long size) {
529    return _AllocateUncacheableMemory(size);
530}
531
532void ufree(void *p) {
533    return _FreeUncacheableMemory(p);
534}
535
536static int shutdown_disabled = 0;
537void disable_shutdown() {
538    if (!shutdown_disabled) {
539        _LockMainPower();
540        shutdown_disabled = 1;
541    }
542}
543
544void enable_shutdown() {
545    if (shutdown_disabled) {
546        _UnlockMainPower();
547        shutdown_disabled = 0;
548    }
549}
550void camera_shutdown_in_a_second(void){
551int i;
552//#if CAM_DRYOS
553//#else
554_SetAutoShutdownTime(1); // 1 sec
555for (i=0;i<200;i++) _UnlockMainPower(); // set power unlock counter to 200 or more, because every keyboard function call try to lock power again ( if "Disable LCD off" menu is "alt" or "script").
556//#endif
557}
558long MakeDirectory_Fut(const char *dirname) {
559 return _MakeDirectory_Fut(dirname,-1); // meaning of second arg is not clear, firmware seems to use -1
560}
561
562long Fopen_Fut(const char *filename, const char *mode){
563 return _Fopen_Fut(filename,mode);
564}
565
566long Fclose_Fut(long file){
567 return _Fclose_Fut(file);
568}
569
570long Fread_Fut(void *buf, long elsize, long count, long f){
571 return _Fread_Fut(buf,  elsize,  count, f);
572}
573
574long Fwrite_Fut(const void *buf, long elsize, long count, long f){
575  return _Fwrite_Fut(buf, elsize, count, f);
576}
577
578long Fseek_Fut(long file, long offset, long whence){
579 return  _Fseek_Fut(file, offset, whence);
580}
581
582long Feof_Fut(long file) {
583 return _Feof_Fut(file);
584}
585
586long Fflush_Fut(long file) {
587 return _Fflush_Fut(file);
588}
589
590char *Fgets_Fut(char *buf, int n, long f) {
591 return _Fgets_Fut(buf,n,f);
592}
593
594long RenameFile_Fut(const char *oldname, const char *newname) {
595 return _RenameFile_Fut(oldname, newname);
596}
597
598int rename(const char *oldname, const char *newname){
599 // doesn't appear to work on a540
600 return _rename(oldname, newname);
601}
602
603long DeleteFile_Fut(const char *name) {
604 return _DeleteFile_Fut(name);
605}
606
607unsigned int GetFreeCardSpaceKb(void){
608 return (_GetDrive_FreeClusters(0)*(_GetDrive_ClusterSize(0)>>9))>>1;
609}
610
611unsigned int GetTotalCardSpaceKb(void){
612 return (_GetDrive_TotalClusters(0)*(_GetDrive_ClusterSize(0)>>9))>>1;
613}
614
615
616unsigned int GetJpgCount(void){
617
618 return strtol(camera_jpeg_count_str(),((void*)0),0);
619}
620
621unsigned int GetRawCount(void){
622 return GetFreeCardSpaceKb()/((hook_raw_size() / 1024)+GetFreeCardSpaceKb()/GetJpgCount());
623
624}
625
626void EnterToCompensationEVF(void)
627{
628  _EnterToCompensationEVF();
629}
630
631void ExitFromCompensationEVF()
632{
633  _ExitFromCompensationEVF();
634}
635
636void TurnOnBackLight(void)
637{
638  _TurnOnBackLight();
639}
640
641void TurnOffBackLight(void)
642{
643  _TurnOffBackLight();
644}
645
646void DoAFLock(void)
647{
648  _DoAFLock();
649}
650
651void UnlockAF(void)
652{
653  _UnlockAF();
654}
655
656#if CAM_MULTIPART
657
658#define SECTOR_SIZE 512
659static char *mbr_buf=(void*)0;
660static unsigned long drive_sectors;
661
662int mbr_read(char* mbr_sector, unsigned long drive_total_sectors, unsigned long *part_start_sector,  unsigned long *part_length){
663// return value: 1 - success, 0 - fail
664// called only in VxWorks
665 
666 int offset=0x10; // points to partition #2
667 int valid;
668 
669 if ((mbr_sector[0x1FE]!=0x55) || (mbr_sector[0x1FF]!=0xAA)) return 0; // signature check
670
671 mbr_buf=_AllocateUncacheableMemory(SECTOR_SIZE);
672 _memcpy(mbr_buf,mbr_sector,SECTOR_SIZE);
673 drive_sectors=drive_total_sectors;
674
675 while(offset>=0) {
676 
677  *part_start_sector=(*(unsigned short*)(mbr_sector+offset+0x1C8)<<16) | *(unsigned short*)(mbr_sector+offset+0x1C6);
678  *part_length=(*(unsigned short*)(mbr_sector+offset+0x1CC)<<16) | *(unsigned short*)(mbr_sector+offset+0x1CA);
679
680  valid= (*part_start_sector) && (*part_length) &&
681         (*part_start_sector<=drive_total_sectors) &&
682         (*part_start_sector+*part_length<=drive_total_sectors) &&
683         ((mbr_sector[offset+0x1BE]==0) || (mbr_sector[offset+0x1BE]==0x80)); // status: 0x80 (active) or 0 (non-active)
684
685  if (valid && ((mbr_sector[0x1C2+offset]==0x0B) || (mbr_sector[0x1C2+offset]==0x0C))) break;   // FAT32 secondary partition
686
687  offset-=0x10;
688
689 }
690
691 return valid;
692}
693
694
695int mbr_read_dryos(unsigned long drive_total_sectors, char* mbr_sector ){
696// Called only in DRYOS
697 mbr_buf=_AllocateUncacheableMemory(SECTOR_SIZE);
698 _memcpy(mbr_buf,mbr_sector,SECTOR_SIZE);
699 drive_sectors=drive_total_sectors;
700 return drive_total_sectors;
701}
702
703int get_part_count(void){
704 unsigned long part_start_sector, part_length;
705 char part_status, part_type;
706 int i;
707 int count=0;
708 for (i=0; i<=1;i++){
709  part_start_sector=(*(unsigned short*)(mbr_buf+i*16+0x1C8)<<16) | *(unsigned short*)(mbr_buf+i*16+0x1C6);
710  part_length=(*(unsigned short*)(mbr_buf+i*16+0x1CC)<<16) | *(unsigned short*)(mbr_buf+i*16+0x1CA);
711  part_status=mbr_buf[i*16+0x1BE];
712  part_type=mbr_buf[0x1C2+i*16];
713  if ( part_start_sector && part_length && part_type && ((part_status==0) || (part_status==0x80)) ) count++;
714 }
715 return count;
716}
717
718void swap_partitions(void){
719 int i;
720 char c;
721 for(i=0;i<16;i++){
722  c=mbr_buf[i+0x1BE];
723  mbr_buf[i+0x1BE]=mbr_buf[i+0x1CE];
724  mbr_buf[i+0x1CE]=c;
725 }
726 _WriteSDCard(0,0,1,mbr_buf);
727}
728
729void create_partitions(void){
730 unsigned long start, length;
731 char type;
732
733 _memset(mbr_buf,0,SECTOR_SIZE);
734 
735 start=1; length=2*1024*1024/SECTOR_SIZE; //2 Mb
736 type=1; // FAT primary
737 mbr_buf[0x1BE + 4]=type;
738 mbr_buf[0x1BE + 8]=start;   mbr_buf[0x1BE + 9]=start>>8;   mbr_buf[0x1BE + 10]=start>>16;  mbr_buf[0x1BE + 11]=start>>24;
739 mbr_buf[0x1BE + 12]=length; mbr_buf[0x1BE + 13]=length>>8; mbr_buf[0x1BE + 14]=length>>16; mbr_buf[0x1BE + 15]=length>>24;
740
741 start=start+length; length=drive_sectors-start-1;
742 type=0x0B;  //FAT32 primary;
743 mbr_buf[0x1CE + 4]=type;
744 mbr_buf[0x1CE + 8]=start;   mbr_buf[0x1CE + 9]=start>>8;   mbr_buf[0x1CE + 10]=start>>16;  mbr_buf[0x1CE + 11]=start>>24;
745 mbr_buf[0x1CE + 12]=length; mbr_buf[0x1CE + 13]=length>>8; mbr_buf[0x1CE + 14]=length>>16; mbr_buf[0x1CE + 15]=length>>24;
746
747 mbr_buf[0x1FE]=0x55; mbr_buf[0x1FF]=0xAA; // signature;
748
749 _WriteSDCard(0,0,1,mbr_buf);
750}
751
752#endif
753
754int mute_on_zoom(int x){
755 static int old_busy=0;
756 int busy=zoom_busy||focus_busy;
757 if (old_busy!=busy) {
758  if (busy) {
759#if CAM_CAN_MUTE_MICROPHONE
760   if (conf.mute_on_zoom) _TurnOffMic();
761#endif
762   }
763   else {
764#if CAM_CAN_MUTE_MICROPHONE
765  if (conf.mute_on_zoom) _TurnOnMic();
766#endif
767#if CAM_EV_IN_VIDEO
768  if (get_ev_video_avail()) set_ev_video_avail(0);
769#endif
770  }
771  old_busy=busy;
772 }
773 return x; // preserve R0 if called from assembler
774}
775
776
777#if CAM_AF_SCAN_DURING_VIDEO_RECORD
778void MakeAFScan(void){
779 int a=0, save;
780 if (zoom_busy || focus_busy) return;
781 save=some_flag_for_af_scan;
782 some_flag_for_af_scan=0;
783#if CAM_AF_SCAN_DURING_VIDEO_RECORD == 2
784 parameter_for_af_scan=3;
785#endif
786 _MakeAFScan(&a, 3);
787 some_flag_for_af_scan=save;
788 _ExpCtrlTool_StartContiAE(0,0);
789}
790#endif
791
792long __attribute__((weak)) get_jogdial_direction(void){
793 return 0;
794}
795
796void reverse_bytes_order(char* start, int count){
797// note, we will go to count rounded up to the nearest 32
798asm volatile(
799        "ldr    r2, =0xFF00FF\n"        // r2 = mask
800        "add    r1, r0, r1\n"           // r1 = start + count
801"LOOP:\n"
802        "ldm    r0, {R4-R11}\n"         // load 8 words
803       
804        // out = ((in>>8) & 0xFF00FF) | ((in&0xFF00FF) << 8);
805        "mov    r3, r4, lsr #8\n"       // r3 = in >> 8
806        "and    r3, r3, r2\n"           // r3 &= 0xFF00FF
807        "and    r4, r4, r2\n"           // r4 = in & 0xFF00FF
808        "orr    r4, r3, r4, asl #8\n" // out = r3 | (r4 << 8)
809
810        "mov    r3, r5, lsr #8\n"
811        "and    r3, r3, r2\n"
812        "and    r5, r5, r2\n"
813        "orr    r5, r3, r5, asl #8\n"
814
815        "mov    r3, r6, lsr #8\n"
816        "and    r3, r3, r2\n"
817        "and    r6, r6, r2\n"
818        "orr    r6, r3, r6, asl #8\n"
819
820        "mov    r3, r7, lsr #8\n"
821        "and    r3, r3, r2\n"
822        "and    r7, r7, r2\n"
823        "orr    r7, r3, r7, asl #8\n"
824
825        "mov    r3, r8, lsr #8\n"
826        "and    r3, r3, r2\n"
827        "and    r8, r8, r2\n"
828        "orr    r8, r3, r8, asl #8\n"
829
830        "mov    r3, r9, lsr #8\n"
831        "and    r3, r3, r2\n"
832        "and    r9, r9, r2\n"
833        "orr    r9, r3, r9, asl #8\n"
834
835        "mov    r3, r10, lsr #8\n"
836        "and    r3, r3, r2\n"
837        "and    r10, r10, r2\n"
838        "orr    r10, r3, r10, asl #8\n"
839
840        "mov    r3, r11, lsr #8\n"
841        "and    r3, r3, r2\n"
842        "and    r11, r11, r2\n"
843        "orr    r11, r3, r11, asl #8\n"
844
845        "stmia  r0!, {r4-r11}\n"        // store and increment
846
847        "cmp    r0, r1\n"
848        "bcc    LOOP\n"
849        :::"r0","r1","r2","r3","r4","r5","r6","r7","r8","r9","r10","r11"
850 );
851}
852
853#if defined (DNG_EXT_FROM)
854
855#define DNG_EXT_TO ".DNG"
856
857typedef int(*p_some_f)(char*, int);
858
859extern p_some_f some_f_for_dng;  // camera variable!
860extern char* second_ext_for_dng; // camera variable!
861
862p_some_f default_some_f;         
863char *   default_second_ext;     
864
865char *_strstr (const char *s1, const char *s2)
866{
867  const char *p = s1;
868  const int len = _strlen (s2);
869
870  for (; (p = _strchr (p, *s2)) != 0; p++)
871    {
872      if (_strncmp (p, s2, len) == 0)
873        return (char *)p;
874    }
875  return (0);
876}
877
878
879int my_some_f(char *s, int x){
880  char *f;
881  f=_strstr(s, DNG_EXT_FROM);
882  if (f) _memcpy(f, DNG_EXT_TO, sizeof(DNG_EXT_TO)-1);
883  return default_some_f(s, x);
884}
885
886void save_ext_for_dng(void){
887 default_some_f=some_f_for_dng;
888 default_second_ext=second_ext_for_dng;
889}
890
891void change_ext_to_dng(void){
892 some_f_for_dng=my_some_f;
893 second_ext_for_dng=DNG_EXT_TO;
894}
895
896void change_ext_to_default(void){
897 some_f_for_dng=default_some_f;
898 second_ext_for_dng=default_second_ext;
899}
900
901#endif
902
903
904static long drv_struct[16];
905
906long dh_err()
907{
908    return -1;
909}
910
911void drv_self_hide()
912{
913#if !CAM_DRYOS
914    long drvnum;
915   
916    drvnum = _iosDrvInstall(dh_err,dh_err,dh_err,dh_err,dh_err,dh_err,dh_err);
917    if (drvnum >= 0)
918        _iosDevAdd(drv_struct, "A/DISKBOOT.BIN", drvnum);
919#endif
920}
921
922void drv_self_unhide(){
923#if !CAM_DRYOS
924 _iosDevDelete(drv_struct);
925#endif
926}
927
928#if CAM_EXT_TV_RANGE
929int  apex2us(int apex_tv){
930 if (apex_tv<-576) return 1000000.0*pow(2.0, -apex_tv/96.0);
931 else return _apex2us(apex_tv);
932}
933#endif
934
935// TODO this belongs lib.c, but not all cameras include it
936// same as bitmap width for most cameras, override in platform/sub/lib.c as needed
937int __attribute__((weak)) vid_get_viewport_width() {
938        return vid_get_bitmap_screen_width();
939}
940
941
Note: See TracBrowser for help on using the repository browser.