source: trunk/platform/g1x/lib.c @ 1828

Revision 1828, 7.0 KB checked in by philmoz, 13 months ago (diff)

Update to viewport functions and code using them to handle the G1X viewport system.
This is now more flexible by allowing viewport buffer offsets to be seperate from the viewport display offsets, it can handle stitch mode properly. This is also needed for reyalp's new live view system.

  • Property svn:eol-style set to native
Line 
1#include "platform.h"
2#include "lolevel.h"
3
4void vid_bitmap_refresh()
5{
6        extern int full_screen_refresh;
7        extern void _ScreenUnlock();
8        extern void _ScreenLock();
9
10        full_screen_refresh |= 3;
11        _ScreenLock();
12        _ScreenUnlock();
13}
14
15
16void shutdown()
17{
18        volatile long *p = (void*)0xC022001C;
19
20        asm(
21                "MRS     R1, CPSR\n"
22                "AND     R0, R1, #0x80\n"
23                "ORR     R1, R1, #0x80\n"
24                "MSR     CPSR_cf, R1\n"
25                :::"r1","r0");
26
27        *p = 0x44;  // power off.
28
29        while(1);
30}
31
32#define LED_PR 0xC022C30C       // Power LED (@FF15B178 & @FF15B1CC)
33
34void debug_led(int state)
35{
36        // using power LED, which defaults to on
37        // for debugging turn LED off if state is 1 and on for state = 0
38        // leaves LED on at end of debugging
39    volatile long *p = (void*)LED_PR;
40    *p = (*p & 0xFFFFFFCF) | ((state) ? 0x00 : 0x20);
41}
42
43// G1X has 4 led values
44// 0/0 - Upper indicator Green
45// 1/1 - Lower indicator Orange
46// 2/3 - Power LED Green
47// 3/9 - AF Assist Lamp
48void camera_set_led(int led, int state, int bright) {
49 static char led_table[5]={0,1,3,9};
50 _LEDDrive(led_table[led%sizeof(led_table)], state<=1 ? !state : state);
51}
52
53int get_flash_params_count(void) { return 0x9f; }              // Found @0xff206724
54
55void JogDial_CW(void){
56 _PostLogicalEventForNotPowerType(0x872, 1);  // RotateJogDialRight (in table @ FF593A0C, fw 1.00f)
57}
58
59void JogDial_CCW(void){
60 _PostLogicalEventForNotPowerType(0x873, 1);  // RotateJogDialLeft (in table @ FF593A0C, fw 1.00f)
61}
62
63// Viewport and Bitmap values that shouldn't change across firmware versions.
64// Values that may change are in lib.c for each firmware version.
65
66// Defined in stubs_min.S
67extern char active_viewport_buffer;
68extern void* viewport_buffers[];
69
70void *vid_get_viewport_fb()
71{
72    // Return first viewport buffer - for case when vid_get_viewport_live_fb not defined
73    return viewport_buffers[0];
74}
75
76void *vid_get_viewport_live_fb()
77{
78    if (MODE_IS_VIDEO(mode_get()) || (movie_status==VIDEO_RECORD_IN_PROGRESS))
79        return viewport_buffers[0];     // Video only seems to use the first viewport buffer.
80
81    // Hopefully return the most recently used viewport buffer so that motion detect, histogram, zebra and edge overly are using current image data
82    return viewport_buffers[(active_viewport_buffer-1)&3];
83}
84
85// Defined in stubs_min.S
86extern int active_bitmap_buffer;
87extern char* bitmap_buffer[];
88
89void *vid_get_bitmap_fb()
90{
91    // Return first bitmap buffer address
92    return bitmap_buffer[0];
93}
94
95// Y multiplier for cameras with 480 pixel high viewports (CHDK code assumes 240)
96int vid_get_viewport_yscale() {
97        return 2;               // G1X viewport is 480 pixels high
98}
99
100int vid_get_viewport_width()
101{
102    if (shooting_get_prop(PROPCASE_SHOOTING_MODE) == 16909) // Stitch mode
103    {
104        return 180;
105    }
106    else
107    {
108            // viewport width table for each image size
109            // 0 = 4:3, 1 = 16:9, 2 = 3:2, 3 = 1:1, 4 = 4:5
110            static long vp_w[5] = { 360, 360, 360, 272, 216 };
111            return vp_w[shooting_get_prop(PROPCASE_ASPECT_RATIO)];
112    }
113}
114
115int vid_get_viewport_display_xoffset()
116{
117    if (shooting_get_prop(PROPCASE_SHOOTING_MODE) == 16909) // Stitch mode
118    {
119        if (shooting_get_prop(PROPCASE_STITCH_DIRECTION) == 0)      // Direction check
120            if (shooting_get_prop(PROPCASE_STITCH_SEQUENCE) == 0)   // Shot already taken?
121                return 40;
122            else
123                return 140;
124        else
125            if (shooting_get_prop(PROPCASE_STITCH_SEQUENCE) == 0)   // Shot already taken?
126                return 140;
127            else
128                return 40;
129    }
130    else
131    {
132            // viewport width offset table for each image size
133            // 0 = 4:3, 1 = 16:9, 2 = 3:2, 3 = 1:1, 4 = 4:5
134            static long vp_w[5] = { 0, 0, 0, 44, 72 };                          // should all be even values for edge overlay
135            return vp_w[shooting_get_prop(PROPCASE_ASPECT_RATIO)];
136    }
137}
138
139long vid_get_viewport_height()
140{
141    if (shooting_get_prop(PROPCASE_SHOOTING_MODE) == 16909) // Stitch mode
142    {
143        return 120;
144    }
145    else
146    {
147            // viewport height table for each image size
148            // 0 = 4:3, 1 = 16:9, 2 = 3:2, 3 = 1:1, 4 = 4:5
149            static long vp_h[5] = { 240, 180, 214, 240, 240 };
150            return vp_h[shooting_get_prop(PROPCASE_ASPECT_RATIO)];
151    }
152}
153
154int vid_get_viewport_yoffset()
155{
156    if (shooting_get_prop(PROPCASE_SHOOTING_MODE) == 16909) // Stitch mode
157    {
158        return 0;
159    }
160    else
161    {
162            // viewport height offset table for each image size
163            // 0 = 4:3, 1 = 16:9, 2 = 3:2, 3 = 1:1, 4 = 4:5
164            static long vp_h[5] = { 0, 30, 13, 0, 0 };
165            return vp_h[shooting_get_prop(PROPCASE_ASPECT_RATIO)];
166    }
167}
168
169int vid_get_viewport_display_yoffset()
170{
171    if (shooting_get_prop(PROPCASE_SHOOTING_MODE) == 16909) // Stitch mode
172    {
173        return 72;
174    }
175    else
176    {
177            // viewport width offset table for each image size
178            // 0 = 4:3, 1 = 16:9, 2 = 3:2, 3 = 1:1, 4 = 4:5
179            static long vp_h[5] = { 0, 30, 13, 0, 0 };
180            return vp_h[shooting_get_prop(PROPCASE_ASPECT_RATIO)];
181    }
182}
183
184// Functions for PTP Live View system
185
186int vid_get_viewport_display_xoffset_proper()   { return vid_get_viewport_display_xoffset() * 2; }
187int vid_get_viewport_display_yoffset_proper()   { return vid_get_viewport_display_yoffset() * 2; }
188int vid_get_viewport_width_proper()             { return vid_get_viewport_width() * 2; }
189int vid_get_viewport_height_proper()            { return vid_get_viewport_height() * 2; }
190int vid_get_viewport_max_height()               { return 480; }
191int vid_get_palette_type()                      { return 3; }
192int vid_get_palette_size()                      { return 256 * 4; }
193
194void *vid_get_bitmap_active_buffer()
195{
196    return bitmap_buffer[active_bitmap_buffer];
197}
198
199void *vid_get_bitmap_active_palette()
200{
201    extern int active_palette_buffer;
202    extern char* palette_buffer[];
203    return (palette_buffer[active_palette_buffer]+4);
204}
205
206// Function to load CHDK custom colors into active Canon palette
207void load_chdk_palette()
208{
209    extern int active_palette_buffer;
210    // Only load for the standard record and playback palettes
211    if ((active_palette_buffer == 0) || (active_palette_buffer == 3) || (active_palette_buffer == 6))
212    {
213        int *pal = (int*)vid_get_bitmap_active_palette();
214        if (pal[CHDK_COLOR_BASE+0] != 0x33ADF62)
215        {
216            pal[CHDK_COLOR_BASE+0]  = 0x33ADF62;  // Red
217            pal[CHDK_COLOR_BASE+1]  = 0x326EA40;  // Dark Red
218            pal[CHDK_COLOR_BASE+2]  = 0x34CD57F;  // Light Red
219            pal[CHDK_COLOR_BASE+3]  = 0x373BFAE;  // Green
220            pal[CHDK_COLOR_BASE+4]  = 0x34BD6CA;  // Dark Green
221            pal[CHDK_COLOR_BASE+5]  = 0x395AB95;  // Light Green
222            pal[CHDK_COLOR_BASE+6]  = 0x34766F0;  // Blue
223            pal[CHDK_COLOR_BASE+7]  = 0x31250F3;  // Dark Blue
224            pal[CHDK_COLOR_BASE+8]  = 0x37F408F;  // Cyan
225            pal[CHDK_COLOR_BASE+9]  = 0x3512D5B;  // Magenta
226            pal[CHDK_COLOR_BASE+10] = 0x3A9A917;  // Yellow
227            pal[CHDK_COLOR_BASE+11] = 0x3819137;  // Dark Yellow
228            pal[CHDK_COLOR_BASE+12] = 0x3DED115;  // Light Yellow
229
230            extern char palette_control;
231            palette_control = 1;
232            vid_bitmap_refresh();
233        }
234    }
235}
Note: See TracBrowser for help on using the repository browser.