source: trunk/platform/a630/main.c @ 79

Revision 79, 13.0 KB checked in by vitalyb, 6 years ago (diff)
  • updated Parameter-related stuff
  • revert r77 sig_ref_3
Line 
1#include "platform.h"
2#include "core.h"
3#include "keyboard.h"
4
5/* VxWorks stuff */
6extern long sysMemTopPtr;
7extern long sysPhysMemTopPtr;
8extern int taskCreateHookAdd (void *createHook);
9extern int taskDeleteHookAdd (void *deleteHook);
10
11/* Canon stuff */
12extern int CreateTask (const char *name, int prio, int stack_size /*?*/,
13    void *entry, long parm /*?*/);
14extern long CreateTaskStrict(const char *taskname, long a, long b, void *func, long d);
15extern void SleepTask(long msec);
16extern void __attribute__((noreturn)) ExitTask();
17extern long *GetSystemTime(long *t);
18extern long GetZoomLensCurrentPosition();
19extern long GetZoomLensCurrentPoint();
20extern long GetFocusLensCurrentPosition();
21extern long GetFocusLensSubjectDistance();
22extern long GetFocusLensSubjectDistanceFromLens();
23extern long GetPropertyCase(long opt_id, void *buf, long bufsize);
24extern long SetPropertyCase(long opt_id, void *buf, long bufsize);
25extern void RefreshPhysicalScreen(long f);
26extern long IsStrobeChargeCompleted();
27
28extern long GetParameterData(long id, void *buf, long size);
29extern long SetParameterData(long id, void *buf, long size);
30
31/* Ours stuff */
32extern long wrs_kernel_bss_start;
33extern long wrs_kernel_bss_end;
34
35extern void boot();
36
37
38/*
39 *
40 *
41 *
42 *
43 *
44 *
45 *
46 *
47 */
48
49void mykbd_task(long ua, long ub, long uc, long ud, long ue, long uf);
50
51void spytask(long ua, long ub, long uc, long ud, long ue, long uf)
52{
53    core_spytask();
54}
55
56static int stop_hooking;
57static void (*taskprev)(
58    long p0,    long p1,    long p2,    long p3,    long p4,
59    long p5,    long p6,    long p7,    long p8,    long p9);
60
61
62static void task_start_hook(
63    long p0,    long p1,    long p2,    long p3,    long p4,
64    long p5,    long p6,    long p7,    long p8,    long p9)
65{
66
67    CreateTask("SpyTask", 0x19, 0x2000, spytask, 0);
68
69    taskprev(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 );
70}
71
72int my_ncmp(const char *s1, const char *s2, long len)
73{
74    int i;
75    for (i=0;i<len;i++){
76        if (s1[i] != s2[i])
77            return 1;
78    }
79    return 0;
80}
81
82void createHook (void *pNewTcb)
83{
84    char *name = (char*)(*(long*)((char*)pNewTcb+0x34));
85    long *entry = (long*)((char*)pNewTcb+0x74);
86
87    // always hook first task creation
88    // to create SpyProc
89    if (!stop_hooking){
90        taskprev = (void*)(*entry);
91        *entry = (long)task_start_hook;
92        stop_hooking = 1;
93    } else {
94        // hook/replace another tasks
95        if (my_ncmp(name, "tPhySw", 6) == 0){
96            *entry = (long)mykbd_task;
97        }
98        core_hook_task_create(pNewTcb);
99    }
100}
101
102void deleteHook (void *pTcb)
103{
104    core_hook_task_delete(pTcb);
105}
106
107/*
108 * Startup
109 * Initialize .data and .bss segments & erase other memory.
110 * boot() call setups create|delete task hooks.
111 *
112 *
113 *
114 *
115 *
116 */
117
118void startup()
119{
120    long *bss = &wrs_kernel_bss_start;
121    long *ptr;
122
123    // sanity check
124    if ((long)&wrs_kernel_bss_end > (MEMISOSTART + MEMISOSIZE)){
125        started();
126        shutdown();
127    }
128
129    // initialize .bss senment
130    while (bss<&wrs_kernel_bss_end)
131        *bss++ = 0;
132
133    // fill memory with this magic value so we could see what
134    // parts of memory were or not used
135   
136    // update:
137    // this seems to be required for unknown reason
138    // or else sryproc startup will fail from
139    // time to time...
140    for (ptr=(void*)MEMBASEADDR;((long)ptr)<MEMISOSTART;ptr+=4){
141        ptr[0]=0x55555555;
142        ptr[1]=0x55555555;
143        ptr[2]=0x55555555;
144        ptr[3]=0x55555555;
145    }
146
147    boot();
148}
149
150/*
151 * Keyboard handling
152 *
153 *
154 *
155 *
156 *
157 *
158 *
159 */
160
161long get_tick_count()
162{
163    long t;
164    GetSystemTime(&t);
165    return t;
166}
167
168
169/****************/
170
171extern const char aPhysw;
172extern long physw_run;
173extern long kbd_p1_f();
174extern void kbd_p2_f();
175
176#define NEW_SS (0x2000)
177
178#ifndef MALLOCD_STACK
179static char kbd_stack[NEW_SS];
180#endif
181
182long __attribute__((naked)) wrap_kbd_p1_f() ;
183
184static void __attribute__((noinline)) mykbd_task_proceed()
185{
186    while (physw_run){
187        SleepTask(10);
188
189        if (wrap_kbd_p1_f() == 1){ // autorepeat ?
190            kbd_p2_f();
191        }
192    }
193}
194
195void __attribute__((naked,noinline))
196mykbd_task(long ua, long ub, long uc, long ud, long ue, long uf)
197{
198    /* WARNING
199     * Stack pointer manipulation performed here!
200     * This means (but not limited to):
201     *  function arguments destroyed;
202     *  function CAN NOT return properly;
203     *  MUST NOT call or use stack variables before stack
204     *  is setup properly;
205     *
206     */
207
208    register int i;
209    register long *newstack;
210
211#ifndef MALLOCD_STACK
212    newstack = (void*)kbd_stack;
213#else
214    newstack = malloc(NEW_SS);
215#endif
216
217    for (i=0;i<NEW_SS/4;i++)
218        newstack[i]=0xdededede;
219
220    asm volatile (
221        "MOV    SP, %0"
222        :: "r"(((char*)newstack)+NEW_SS)
223        : "memory"
224    );
225
226    mykbd_task_proceed();
227
228    /* function can be modified to restore SP here...
229     */
230
231    ExitTask();
232}
233
234
235long __attribute__((naked,noinline)) wrap_kbd_p1_f()
236{
237
238    asm volatile(
239                "STMFD   SP!, {R4-R7,LR}\n"
240                "SUB     SP, SP, #0xC\n"
241                "BL      my_kbd_read_keys\n"
242                "B       kbd_p1_f_cont\n"
243    );
244    return 0; // shut up the compiler
245}
246
247extern void kbd_pwr_on();
248extern void kbd_pwr_off();
249extern void kbd_read_keys_r2(void*p);
250extern long physw_status[3];
251
252static long kbd_new_state[3];
253static long kbd_prev_state[3];
254static long kbd_mod_state;
255
256void my_kbd_read_keys()
257{
258    volatile long *mmio1 = (void*)0xc0220204;
259    volatile long *mmio2 = (void*)0xc0220208;
260
261    kbd_prev_state[0] = kbd_new_state[0];
262    kbd_prev_state[1] = kbd_new_state[1];
263    kbd_prev_state[2] = kbd_new_state[2];
264
265    kbd_pwr_on();
266    kbd_new_state[0] = 0;
267    kbd_new_state[1] = *mmio1;
268    kbd_new_state[2] = *mmio2 & 0xffff;
269
270#if 0
271    if ((new_state[2] & 0x00001000 /* print button */) == 0 )
272        started();
273    else
274        finished();
275#endif
276
277    if (kbd_process() == 0){
278        // leave it alone...
279        physw_status[0] = kbd_new_state[0];
280        physw_status[1] = kbd_new_state[1];
281        physw_status[2] = kbd_new_state[2];
282#if 1
283        kbd_mod_state = kbd_new_state[2];
284#endif
285    } else {
286        // override keys
287#if 1
288        physw_status[2] = kbd_mod_state;
289#else
290        physw_status[0] = kbd_new_state[0];
291        physw_status[1] = kbd_new_state[1];
292        physw_status[2] = (kbd_new_state[2] & (~0x1fff)) |
293                          (kbd_mod_state & 0x1fff);
294#endif
295    }
296
297    kbd_read_keys_r2(physw_status); // have no idea what's that
298   
299    kbd_pwr_off();
300}
301
302/****************/
303
304static struct {
305        long hackkey;
306        long canonkey;
307} keymap[] = {
308    /* tiny bug: key order matters. see kbd_get_pressed_key()
309     * for example
310     */
311        { KEY_UP        , 0x00000001 },
312        { KEY_DOWN      , 0x00000002 },
313        { KEY_LEFT      , 0x00000008 },
314        { KEY_RIGHT     , 0x00000004 },
315        { KEY_SET       , 0x00000100 },
316        { KEY_SHOOT_FULL, 0x00000030 }, // note 3 here!
317        { KEY_SHOOT_HALF, 0x00000010 },
318        { KEY_ZOOM_IN   , 0x00000040 },
319        { KEY_ZOOM_OUT  , 0x00000080 },
320        { KEY_MENU      , 0x00000200 },
321        { KEY_DISPLAY   , 0x00000400 },
322        { KEY_PRINT     , 0x00001000 },
323        { KEY_ERASE     , 0x00000800 },
324};
325
326#define KEYSCNT (sizeof(keymap)/sizeof(keymap[0]))
327
328void kbd_key_press(long key)
329{
330    int i;
331    for (i=0;i<KEYSCNT;i++){
332        if (keymap[i].hackkey == key){
333            kbd_mod_state &= ~keymap[i].canonkey;
334            return;
335        }
336    }
337}
338
339void kbd_key_release(long key)
340{
341    int i;
342    for (i=0;i<KEYSCNT;i++){
343        if (keymap[i].hackkey == key){
344            kbd_mod_state |= keymap[i].canonkey;
345            return;
346        }
347    }
348}
349
350void kbd_key_release_all()
351{
352    kbd_mod_state |= 0x1fff;
353}
354
355long kbd_is_key_pressed(long key)
356{
357    int i;
358    for (i=0;i<KEYSCNT;i++){
359        if (keymap[i].hackkey == key){
360            return ((kbd_new_state[2] & keymap[i].canonkey) == 0) ? 1:0;
361        }
362    }
363    return 0;
364}
365
366long kbd_is_key_clicked(long key)
367{
368    int i;
369    for (i=0;i<KEYSCNT;i++){
370        if (keymap[i].hackkey == key){
371            return ((kbd_prev_state[2] & keymap[i].canonkey) != 0) &&
372                    ((kbd_new_state[2] & keymap[i].canonkey) == 0);
373        }
374    }
375    return 0;
376}
377
378long kbd_get_pressed_key()
379{
380    int i;
381    for (i=0;i<KEYSCNT;i++){
382        if ((kbd_new_state[2] & keymap[i].canonkey) == 0){
383            return keymap[i].hackkey;
384        }
385    }
386    return 0;
387}
388
389long kbd_get_clicked_key()
390{
391    int i;
392    for (i=0;i<KEYSCNT;i++){
393        if (((kbd_prev_state[2] & keymap[i].canonkey) != 0) &&
394            ((kbd_new_state[2] & keymap[i].canonkey) == 0)){
395            return keymap[i].hackkey;
396        }
397    }
398    return 0;
399}
400
401void *vid_get_bitmap_fb()
402{
403    return (void*)(0x10360000+0x1000);
404}
405
406void *vid_get_viewport_fb()
407{
408    return (void*)(0x105f20c0);
409}
410
411long vid_get_bitmap_width()
412{
413    return 360;
414}
415
416long vid_get_bitmap_height()
417{
418    return 240;
419}
420
421/*******************************************************************/
422
423long lens_get_zoom_pos()
424{
425    return GetZoomLensCurrentPosition();
426}
427
428void lens_set_zoom_pos(long newpos)
429{
430}
431
432long lens_get_zoom_point()
433{
434    return GetZoomLensCurrentPoint();
435}
436
437void lens_set_zoom_point(long newpt)
438{
439}
440
441long lens_get_focus_pos()
442{
443    return GetFocusLensSubjectDistance();
444}
445
446void lens_set_focus_pos(long newpos)
447{
448}
449
450long stat_get_vbatt()
451{
452    return VbattGet();
453}
454
455/*******************************************************************/
456
457const ApertureSize aperture_sizes_table[] = {
458    {  9, 288, "2.8", },
459    { 10, 320, "3.2", },
460    { 11, 352, "3.5", },
461    { 12, 384, "4.0", },
462    { 13, 416, "4.5", },
463    { 14, 448, "5.0", },
464    { 15, 480, "5.6", },
465    { 16, 512, "6.3", },
466    { 17, 544, "7.1", },
467    { 18, 576, "8.0", },
468};
469
470const ShutterSpeed shutter_speeds_table[] = {
471    {-13, -384, "15", 15000000  },
472    {-12, -352, "13", 13000000  },
473    {-11, -320, "10", 10000000  },
474    {-9, -288, "8", 8000000  },
475    {-8, -256, "6", 6000000  },
476    {-7, -224, "5", 5000000  },
477    {-6, -192, "4", 4000000  },
478    {-5, -160, "3.2", 3200000  },
479    {-4, -128, "2.5", 2500000  },
480    {-3, -96 , "2", 2000000  },
481    {-2, -64 , "1.6", 1600000  },
482    {-1, -32 , "1.3", 1300000  },
483    { 0, 0, "1", 1000000  },
484    { 1, 32, "0.8", 800000 },
485    { 2, 64, "0.6", 600000 },
486    { 3, 96, "0.5", 500000 },
487    { 4, 128, "0.4", 400000 },
488    { 5, 160, "0.3", 300000 },
489    { 6, 192, "1/4", 250000 },
490    { 7, 224, "1/5", 200000 },
491    { 8, 256, "1/6", 166667 },
492    { 9, 288, "1/8", 125000 },
493    {10, 320, "1/10", 100000 },
494    {11, 352, "1/13",  76923 },
495    {12, 384, "1/15",  66667 },
496    {13, 416, "1/20",  50000 },
497    {14, 448, "1/25",  40000 },
498    {15, 480, "1/30",  33333 },
499    {16, 512, "1/40",  25000 },
500    {17, 544, "1/50",  20000 },
501    {18, 576, "1/60",  16667 },
502    {19, 608, "1/80",  12500 },
503    {20, 640, "1/100",  10000 },
504    {21, 672, "1/125",   8000 },
505    {22, 704, "1/160",   6250 },
506    {23, 736, "1/200",   5000 },
507    {24, 768, "1/250",   4000 },
508    {25, 800, "1/320",   3125 },
509    {26, 832, "1/400",   2500 },
510    {27, 864, "1/500",   2000 },
511    {28, 896, "1/640",   1563 },
512    {30, 928, "1/800",   1250 },
513    {31, 960, "1/1000",   1000 },
514    {32, 992, "1/1250",    800 },
515    {33, 1021, "1/1600",    625 },
516    {34, 1053, "1/2000",    500 },
517    {35, 1084, "1/2500",    400 },
518};
519
520#define SS_SIZE (sizeof(shutter_speeds_table)/sizeof(shutter_speeds_table[0]))
521#define SSID_MIN (shutter_speeds_table[0].id)
522#define SSID_MAX (shutter_speeds_table[SS_SIZE-1].id)
523
524#define AS_SIZE (sizeof(aperture_sizes_table)/sizeof(aperture_sizes_table[0]))
525#define ASID_MIN (aperture_sizes_table[0].id)
526#define ASID_MAX (aperture_sizes_table[AS_SIZE-1].id)
527
528int shooting_get_tv()
529{
530    short int tvv;
531    long i;
532    GetPropertyCase(40, &tvv, sizeof(tvv));
533    for (i=0;i<SS_SIZE;i++){
534        if (shutter_speeds_table[i].prop_id == tvv)
535            return shutter_speeds_table[i].id;
536    }
537    return 0;
538}
539
540const ShutterSpeed *shooting_get_tv_line()
541{
542    short int tvv;
543    long i;
544    GetPropertyCase(40, &tvv, sizeof(tvv));
545    for (i=0;i<SS_SIZE;i++){
546        if (shutter_speeds_table[i].prop_id == tvv)
547            return &shutter_speeds_table[i];
548    }
549    return 0;
550
551}
552
553void shooting_set_tv(int v)
554{
555    long i;
556//    if ((v<SSID_MIN) || (v>SSID_MAX))
557//      return;
558
559
560    for (i=0;i<SS_SIZE;i++){
561        if (shutter_speeds_table[i].id == v){
562            short int vv = shutter_speeds_table[i].prop_id;
563            SetPropertyCase(40, &vv, sizeof(vv));
564            return;
565        }
566    }
567
568}
569
570void shooting_set_tv_rel(int v)
571{
572    int cv = shooting_get_tv();
573    shooting_set_tv(cv+v);
574}
575
576int shooting_get_av()
577{
578    short int avv;
579    long i;
580    GetPropertyCase(39, &avv, sizeof(avv));
581    for (i=0;i<AS_SIZE;i++){
582        if (aperture_sizes_table[i].prop_id == avv)
583            return aperture_sizes_table[i].id;
584    }
585    return 0;
586}
587
588void shooting_set_av(int v)
589{
590    long i;
591
592//    if ((v<ASID_MIN) || (v>ASID_MAX))
593//      return;
594
595    for (i=0;i<AS_SIZE;i++){
596        if (aperture_sizes_table[i].id == v){
597            short int vv = aperture_sizes_table[i].prop_id;
598            SetPropertyCase(39, &vv, sizeof(vv));
599            return;
600        }
601    }
602}
603
604void shooting_set_av_rel(int v)
605{
606    int cv = shooting_get_av();
607    shooting_set_av(cv+v);
608}
609
610int shooting_in_progress()
611{
612    int t = 0;
613    GetPropertyCase(205, &t, 4);
614    return t != 0;
615}
616
617int shooting_is_flash_ready()
618{
619    int t = 0;
620/* well, I'm not sure what's exactly is happening here
621 * but it works for a610-100e
622 */
623    GetPropertyCase(204, &t, 4);
624    if (t == 3){
625        GetPropertyCase(221, &t, 4);
626        return (t==1) && IsStrobeChargeCompleted();
627    }
628    return 1;
629}
630
631void vid_bitmap_refresh()
632{
633    RefreshPhysicalScreen(1);
634}
635
636long get_parameter_data(long id, void *buf, long bufsize)
637{
638    return GetParameterData(id|0x4000, buf, bufsize);
639}
640
641long set_parameter_data(long id, void *buf, long bufsize)
642{
643    return SetParameterData(id|0x4000, buf, bufsize);
644}
645
Note: See TracBrowser for help on using the repository browser.