root/platform/m3/lib.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. vid_bitmap_refresh
  2. shutdown
  3. debug_led
  4. camera_set_led
  5. shutdown_soft
  6. get_flash_params_count
  7. JogDial_CW
  8. JogDial_CCW
  9. hook_raw_image_addr
  10. vid_get_viewport_fb
  11. vid_get_viewport_fb_d
  12. vid_get_viewport_live_fb
  13. vid_get_viewport_width
  14. vid_get_viewport_height
  15. vid_get_viewport_yoffset
  16. vid_get_viewport_display_xoffset
  17. vid_get_viewport_display_yoffset
  18. vid_get_viewport_type
  19. vid_get_bitmap_fb
  20. vid_get_viewport_display_xoffset_proper
  21. vid_get_viewport_display_yoffset_proper
  22. vid_get_viewport_buffer_width_proper
  23. vid_get_viewport_fullscreen_width
  24. vid_get_viewport_byte_width
  25. vid_get_viewport_fullscreen_height
  26. vid_get_aspect_ratio
  27. vid_get_bitmap_active_buffer
  28. vid_get_opacity_active_buffer
  29. vid_get_bitmap_active_palette
  30. update_screen_dimensions

   1 #include "platform.h"
   2 #include "lolevel.h"
   3 #include "live_view.h"
   4 
   5 void vid_bitmap_refresh() {
   6     // extern int full_screen_refresh;
   7     // extern void _ScreenUnlock();
   8     // extern void _ScreenLock();
   9     // extern void _displaybusyonscreen();
  10     // extern void _undisplaybusyonscreen();
  11 
  12     
  13     // clears perfectly but blinks and is asynchronous
  14     // _displaybusyonscreen();
  15     // _undisplaybusyonscreen();
  16     
  17     // https://chdk.setepontos.com/index.php?topic=12788.msg133958#msg133958
  18     extern void _transfer_src_overlay(int);
  19 // works in most cases but can cause "ghosting" in auto mode when canon UI constantly updates
  20 //  _transfer_src_overlay(active_bitmap_buffer);
  21     _transfer_src_overlay(0);
  22     _transfer_src_overlay(1);
  23 }
  24 
  25 void shutdown() {
  26 //***TODO***
  27 /*
  28     volatile long *p = (void*)0xC022001C;
  29 
  30     asm(
  31         "MRS     R1, CPSR\n"
  32         "AND     R0, R1, #0x80\n"
  33         "ORR     R1, R1, #0x80\n"
  34         "MSR     CPSR_cf, R1\n"
  35         :::"r1","r0"
  36     );
  37 
  38     *p = 0x44;  // power off.
  39 */
  40     while(1)   _SleepTask(500);
  41 }
  42 
  43 #define LED_PR 0xd20b0994 // green LED on the back
  44 
  45 void debug_led(int state) {
  46     volatile long *p = (void*)LED_PR;
  47     *p = ((state) ? 0x4d0002 : 0x4c0003);
  48 }
  49 
  50 // Power Led = first entry in table (led 0)
  51 // AF Assist Lamp = second entry in table (led 1)
  52 void camera_set_led(int led, int state, __attribute__ ((unused))int bright) {
  53     static char led_table[2]={0,4};
  54     _LEDDrive(led_table[led%sizeof(led_table)], state<=1 ? !state : state);
  55 }
  56 
  57 void shutdown_soft() {
  58 //      *(int*)0xd20b0810  = 0x4d0002;   // Orange Led = on
  59 
  60         _PostLogicalEventForNotPowerType(0x1005,0);
  61 }
  62 
  63 int get_flash_params_count(void) {
  64     return 0x91;
  65 }
  66 
  67 void JogDial_CW(void) {
  68     _PostLogicalEventToUI(0x872, 1);    //RotateJogDialRight
  69 }
  70 
  71 void JogDial_CCW(void) {
  72     _PostLogicalEventToUI(0x873, 1);    //RotateJogDialLeft
  73 }
  74 
  75 extern  int     active_raw_buffer;
  76 extern  char*   raw_buffers[];
  77 extern char* raw_buffers_canon_raw[];
  78 extern char* raw_buffers_jpeg[];
  79 
  80 char *hook_raw_image_addr()
  81 {
  82 //    return raw_buffers[(active_raw_buffer&3)];
  83     // observed values 0-2, 3 would index something that doesn't look like a raw fb in the jpeg case
  84     int i=active_raw_buffer&3;
  85     if(i>2) i=0;
  86     return raw_buffers[i];
  87         // TODO most scene modes seem to use different addresse(s)
  88 }
  89 
  90 /* char *hook_alt_raw_image_addr()
  91 {
  92     return raw_buffers[((active_raw_buffer&1)^1)];
  93 } */
  94 
  95 extern char active_viewport_buffer;
  96 extern void* viewport_buffers[];
  97 
  98 void *vid_get_viewport_fb() {
  99     // Return first viewport buffer - for case when vid_get_viewport_live_fb not defined
 100     //return (void*)0x43115100; // uyvy buffers with signed(?) chroma components
 101     return (void*)0x4367AF00; // 0x43A6F700 0x4b25fc00; uyvy buffers (more than 4), pixel format compatible with earlier DIGIC uyvy
 102 }
 103 
 104 void *vid_get_viewport_fb_d()    {
 105     // based on suggestion from 62ndidiot in https://chdk.setepontos.com/index.php?topic=12532.msg129914#msg129914
 106     extern void *current_fb_d;
 107     return current_fb_d;
 108 } 
 109 
 110 extern void* viewport_buffers[];
 111 extern void *current_viewport_buffer;
 112 
 113 void *vid_get_viewport_live_fb()
 114 {
 115 // current_viewport_buffer doesn't seem to be most recent
 116     int i;
 117     for(i=0;i<4;i++) {
 118         if(current_viewport_buffer == viewport_buffers[i]) {
 119             return viewport_buffers[(i+1)&3];
 120         }
 121     }
 122     return 0;
 123 //      return (void*)0x4367AF00;       
 124 }
 125 
 126 int vid_get_viewport_width() {
 127     extern int _GetVRAMHPixelsSize();
 128     if (camera_info.state.mode_play)
 129     {
 130         return 720;
 131     }
 132 // TODO: currently using actual width rather than half width used on pre d6
 133 // pixel format is uyvy (16bpp)
 134     return _GetVRAMHPixelsSize();
 135 }
 136 
 137 long vid_get_viewport_height() {
 138     extern int _GetVRAMVPixelsSize();
 139     if (camera_info.state.mode_play)
 140     {
 141         return 480;
 142     }
 143         return _GetVRAMVPixelsSize();
 144 }
 145 
 146 int vid_get_viewport_yoffset() {
 147     // this seems to be always 0, buffer always begins with actual display data (widescreen or not)
 148     return 0;
 149 }
 150 
 151 // 0 = 4:3, 1 = 16:9, 2 = 3:2, 3 = 1:1, 4 = 4:5
 152 static long vp_xo[5] = { 40, 0, 0, 120, 168 };                          // should all be even values for edge overlay
 153 
 154 int vid_get_viewport_display_xoffset() {
 155     if (camera_info.state.mode_play)
 156     {
 157         return 0;
 158     }
 159     // video, ignore still res propcase
 160     if(camera_info.state.mode_video || is_video_recording()) {
 161         if(shooting_get_prop(PROPCASE_VIDEO_RESOLUTION) == 2) {
 162             return 40;// 4:3 video
 163         } else {
 164             return 0; // 16:9 video, no x offset
 165         }
 166     }
 167     return vp_xo[shooting_get_prop(PROPCASE_ASPECT_RATIO)];
 168 }
 169 
 170 int vid_get_viewport_display_yoffset() {
 171     if (camera_info.state.mode_play)
 172     {
 173         return 0;
 174     }
 175     // video, ignore still res propcase
 176     if(camera_info.state.mode_video || is_video_recording()) {
 177         if(shooting_get_prop(PROPCASE_VIDEO_RESOLUTION) == 2) {
 178             return 0; // 4:3 video, no Y offset
 179         } else {
 180             return 36; // 16:9 video
 181         }
 182     }
 183     if (shooting_get_prop(PROPCASE_ASPECT_RATIO) == 1)
 184     {
 185         return 36;
 186     }
 187     return 0;
 188 }
 189 
 190 extern int active_bitmap_buffer;
 191 extern char* bitmap_buffer[];
 192 
 193 int vid_get_viewport_type() {
 194 //    if (camera_info.state.mode_play)
 195         return LV_FB_YUV8B;
 196 //    return LV_FB_YUV8C;
 197 }
 198 
 199 
 200 void *vid_get_bitmap_fb() {
 201     // Return first bitmap buffer address
 202     return bitmap_buffer[0];
 203 }
 204 
 205 // Functions for PTP Live View system
 206 int vid_get_viewport_display_xoffset_proper()   { return vid_get_viewport_display_xoffset() ; }
 207 int vid_get_viewport_display_yoffset_proper()   { return vid_get_viewport_display_yoffset() ; }
 208 int vid_get_viewport_buffer_width_proper()              { return camera_screen.buffer_width ; } //(*(int*)(0x00053CBC) );
 209 int vid_get_viewport_fullscreen_width()                 { return camera_screen.width; }
 210 int vid_get_viewport_byte_width()                               { return (camera_screen.buffer_width * 2); }
 211 
 212 int vid_get_viewport_fullscreen_height()        { return 480; }
 213 int vid_get_aspect_ratio()                      { return LV_ASPECT_3_2; }
 214 
 215 
 216 
 217 // the opacity buffer defines opacity for the bitmap overlay's pixels
 218 //volatile char *opacity_buffer[2] = {(char*)0x41718600, (void*)0x41796f00};
 219 volatile char *opacity_buffer[2] = {(char*)0x41741000, (void*)0x41801000};
 220 
 221 void *vid_get_bitmap_active_buffer() {
 222     return bitmap_buffer[active_bitmap_buffer&1];
 223 }
 224 
 225 void *vid_get_opacity_active_buffer() {
 226     return (void *)opacity_buffer[active_bitmap_buffer&1];
 227 }
 228 
 229 
 230 void *vid_get_bitmap_active_palette() {
 231     return (void*)0x8000; // just to return something valid, no palette needed on this cam
 232 }
 233 
 234 #ifdef CAM_SUPPORT_BITMAP_RES_CHANGE
 235 /*
 236  * needed because bitmap buffer resolutions change when an external display is used
 237  * an extra screen erase doesn't seem to be needed
 238  */
 239 void update_screen_dimensions() {
 240     // see sub_FC177FCA in 101a, sub_FC1780F2 in 120f for the values
 241     extern int displaytype;
 242     static int old_displaytype = -1;
 243 
 244     if (old_displaytype == displaytype) {
 245         return;
 246     }
 247     old_displaytype = displaytype;
 248     
 249     switch(displaytype) {
 250         case 0:
 251         case 3:
 252         case 4:
 253         case 5:
 254             // ?
 255             camera_screen.width = camera_screen.physical_width = camera_screen.buffer_width = 640;
 256             camera_screen.height = camera_screen.buffer_height = 480;
 257             camera_screen.size = camera_screen.buffer_size = 640*480;
 258             break;
 259         case 1:
 260         case 2:
 261         case 8:
 262         case 9:
 263             // tv-out (not implemented in hw)
 264             camera_screen.physical_width = camera_screen.width = 720;
 265             camera_screen.buffer_width = 736;
 266             camera_screen.height = camera_screen.buffer_height = 480;
 267             camera_screen.size = 720*480;
 268             camera_screen.buffer_size = 736*480;
 269             break;
 270         case 6:
 271         case 7:
 272             // hdmi
 273             camera_screen.width = camera_screen.physical_width = camera_screen.buffer_width = 960;
 274             camera_screen.height = camera_screen.buffer_height = 540;
 275             camera_screen.size = camera_screen.buffer_size = 960*540;
 276             break;
 277         case 10:
 278             // lcd
 279             camera_screen.physical_width = camera_screen.width = 720;
 280             camera_screen.buffer_width = 736;
 281             camera_screen.height = camera_screen.buffer_height = 480;
 282             camera_screen.size = 720*480;
 283             camera_screen.buffer_size = 736*480;
 284             break;
 285         case 11:
 286             // evf
 287             camera_screen.width = camera_screen.physical_width = camera_screen.buffer_width = 1024;
 288             camera_screen.height = camera_screen.buffer_height = 768;
 289             camera_screen.size = camera_screen.buffer_size = 1024*768;
 290             break;
 291     }
 292 }
 293 #endif
 294 

/* [<][>][^][v][top][bottom][index][help] */