source: trunk/platform/s2is/main.c @ 845

Revision 845, 5.5 KB checked in by reyalp, 4 years ago (diff)

correct S2IS modemap, thanks to MSL in http://chdk.setepontos.com/index.php/topic,4270.msg43862.html#msg43862

  • Property svn:eol-style set to native
Line 
1#define VBATT_DEFAULT_MIN (4550)
2#define VBATT_DEFAULT_MAX (5150)
3
4#include "lolevel.h"
5#include "platform.h"
6#include "core.h"
7#include "keyboard.h"
8
9/* Ours stuff */
10extern long link_bss_start;
11extern long link_bss_end;
12extern void boot();
13extern void mykbd_task(long ua, long ub, long uc, long ud, long ue, long uf);
14
15
16static int stop_hooking;
17
18static void (*taskprev)(
19    long p0,    long p1,    long p2,    long p3,    long p4,
20    long p5,    long p6,    long p7,    long p8,    long p9);
21
22static void (*taskfsprev)(
23    long p0,    long p1,    long p2,    long p3,    long p4,
24    long p5,    long p6,    long p7,    long p8,    long p9);
25
26
27
28void spytask(long ua, long ub, long uc, long ud, long ue, long uf)
29{
30    core_spytask();
31}
32
33
34static void task_start_hook(
35    long p0,    long p1,    long p2,    long p3,    long p4,
36    long p5,    long p6,    long p7,    long p8,    long p9)
37{
38    _CreateTask("SpyTask", 0x19, 0x2000, spytask, 0);
39
40    taskprev(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 );
41}
42
43
44
45static void task_fs(
46    long p0,    long p1,    long p2,    long p3,    long p4,
47    long p5,    long p6,    long p7,    long p8,    long p9)
48{
49    remount_filesystem();
50    taskfsprev(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 );
51}
52
53
54static void capt_seq_hook(
55    long p0,    long p1,    long p2,    long p3,    long p4,
56    long p5,    long p6,    long p7,    long p8,    long p9)
57{
58    capt_seq_task();
59}
60
61
62static void movie_record_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    movie_record_task();
67}
68
69
70static int my_ncmp(const char *s1, const char *s2, long len)
71{
72    int i;
73    for (i=0;i<len;i++){
74        if (s1[i] != s2[i])
75            return 1;
76    }
77    return 0;
78}
79
80void createHook (void *pNewTcb)
81{
82    char *name = (char*)(*(long*)((char*)pNewTcb+0x34));
83    long *entry = (long*)((char*)pNewTcb+0x74);
84
85    // always hook first task creation
86    // to create SpyProc
87    if (!stop_hooking){
88        taskprev = (void*)(*entry);
89        *entry = (long)task_start_hook;
90        stop_hooking = 1;
91    } else {
92        // hook/replace another tasks
93        if (my_ncmp(name, "tSwitchChe", 10) == 0){
94            *entry = (long)mykbd_task;
95        }
96        if (my_ncmp(name, "tInitFileM", 10) == 0){
97            taskfsprev = (void*)(*entry);
98            *entry = (long)task_fs;
99        }
100
101        if (my_ncmp(name, "tCaptSeqTa", 10) == 0){
102            *entry = (long)capt_seq_hook;
103        }
104
105        if (my_ncmp(name, "tMovieRecT", 10) == 0){
106            *entry = (long)movie_record_hook;
107        }
108
109        core_hook_task_create(pNewTcb);
110    }
111}
112
113void deleteHook (void *pTcb)
114{
115    core_hook_task_delete(pTcb);
116}
117
118void startup()
119{
120    long *bss = &link_bss_start;
121    long *ptr;
122
123    // sanity check
124    if ((long)&link_bss_end > (MEMISOSTART + MEMISOSIZE)){
125        started();
126        shutdown();
127    }
128
129    // initialize .bss senment
130    while (bss<&link_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#if 0
141    for (ptr=(void*)MEMBASEADDR;((long)ptr)<MEMISOSTART;ptr+=4){
142        ptr[0]=0x55555555;
143        ptr[1]=0x55555555;
144        ptr[2]=0x55555555;
145        ptr[3]=0x55555555;
146    }
147#endif
148
149    boot();
150}
151
152long get_vbatt_min()
153{
154    return 4550;
155}
156
157long get_vbatt_max()
158{
159    return 5150;
160}
161
162static const struct {
163    int zp, fl;
164} fl_tbl[] = {
165    {   0,   6000 },
166    {  11,   6400 },
167    {  41,  12100 },
168    {  64,  21300 },
169    {  86,  41600 },
170    { 105,  61400 },
171    { 128,  72000 },
172};
173#define NUM_FL (sizeof(fl_tbl)/sizeof(fl_tbl[0]))
174#define CF_EFL 6000
175
176const int zoom_points = 129;
177
178int get_effective_focal_length(int zp) {
179    return (CF_EFL*get_focal_length(zp))/1000;
180}
181
182int get_focal_length(int zp) {
183    int i;
184
185    if (zp<fl_tbl[0].zp)
186        return fl_tbl[0].fl;
187    else if (zp>fl_tbl[NUM_FL-1].zp)
188        return fl_tbl[NUM_FL-1].fl;
189    else
190        for (i=1; i<NUM_FL; ++i) {
191           if (zp==fl_tbl[i-1].zp)
192               return fl_tbl[i-1].fl;
193           else if (zp==fl_tbl[i].zp)
194               return fl_tbl[i].fl;
195           else if (zp<fl_tbl[i].zp)
196               return fl_tbl[i-1].fl+(zp-fl_tbl[i-1].zp)*(fl_tbl[i].fl-fl_tbl[i-1].fl)/(fl_tbl[i].zp-fl_tbl[i-1].zp);
197        }
198    return fl_tbl[NUM_FL-1].fl;
199}
200
201int get_zoom_x(int zp) {
202    return get_focal_length(zp)*10/fl_tbl[0].fl;
203}
204
205static struct {
206        int hackmode;
207        int canonmode;
208} modemap[] = {
209    { MODE_AUTO,                5 },
210    { MODE_P,                   1 },
211    { MODE_TV,                  3 },
212    { MODE_AV,                  2 },
213    { MODE_M,                   0 },
214    { MODE_PORTRAIT,            6 },
215    { MODE_NIGHT,               8 },
216    { MODE_LANDSCAPE,           7 },
217    { MODE_VIDEO_STD,           16 },
218    { MODE_STITCH,              15 },
219    { MODE_MY_COLORS,           4 },
220    { MODE_SCN_NIGHT,           14 },
221    { MODE_SCN_INDOOR,          13 },
222    { MODE_SCN_FOLIAGE,         9 },
223    { MODE_SCN_SNOW,            10 },
224    { MODE_SCN_BEACH,           11 },
225    { MODE_SCN_FIREWORK,        12 },
226};
227#define MODESCNT (sizeof(modemap)/sizeof(modemap[0]))
228
229int mode_get() {
230    int mode, i, t=0xFF;
231    mode  = (playrec_mode==1)?MODE_REC:MODE_PLAY;
232    mode |= (physw_copy[1] & 0x00000001)?0:MODE_SCREEN_OPENED;
233    mode |= (physw_copy[1] & 0x00000002)?0:MODE_SCREEN_ROTATED;
234   
235    t=0xFF;
236    _GetPropertyCase(PROPCASE_SHOOTING_MODE, &t, 4);
237    for (i=0; i<MODESCNT; ++i) {
238        if (modemap[i].canonmode == t) {
239            return (mode | (modemap[i].hackmode & MODE_SHOOTING_MASK));
240        }
241    }
242    return (mode);
243}
Note: See TracBrowser for help on using the repository browser.