#include "platform.h" #include "lolevel.h" #include "live_view.h" extern int active_bitmap_buffer; void vid_bitmap_refresh() { // https://chdk.setepontos.com/index.php?topic=12788.msg133958#msg133958 extern void _transfer_src_overlay(int); // works in most cases but can cause "ghosting" in auto mode when canon UI constantly updates // _transfer_src_overlay(active_bitmap_buffer); _transfer_src_overlay(0); _transfer_src_overlay(1); } void shutdown() { //***TODO*** /* volatile long *p = (void*)0xC022001C; asm( "MRS R1, CPSR\n" "AND R0, R1, #0x80\n" "ORR R1, R1, #0x80\n" "MSR CPSR_cf, R1\n" :::"r1","r0" ); *p = 0x44; // power off. */ while(1); } #define LED_PR 0xd20b0994 // green LED on the back void debug_led(int state) { volatile long *p = (void*)LED_PR; *p = ((state) ? 0x4d0002 : 0x4c0003); } // Power Led = first entry in table (led 0) // AF Assist Lamp = second entry in table (led 1) void camera_set_led(int led, int state, __attribute__ ((unused))int bright) { static char led_table[2]={0,4}; _LEDDrive(led_table[led%sizeof(led_table)], state<=1 ? !state : state); } void shutdown_soft() { _PostLogicalEventForNotPowerType(0x1005,0); // PressOffButton } int get_flash_params_count(void) { return 0xa6; // @fc0bbe8a GetParameterData FFTM } void JogDial_CW(void) { _PostLogicalEventToUI(0x872, 1); //RotateJogDialRight } void JogDial_CCW(void) { _PostLogicalEventToUI(0x873, 1); //RotateJogDialLeft } // Copied from sx280 extern int active_raw_buffer; extern char * raw_buffers[]; char *hook_raw_image_addr() { return raw_buffers[(active_raw_buffer&1)]; } char *hook_alt_raw_image_addr() { return raw_buffers[((active_raw_buffer&1)^1)]; } // *** Viewport buffer handling *** extern void* viewport_buffers[]; extern void *current_viewport_buffer; void *vid_get_viewport_fb() { //return viewport_buffers[0]; // From G16 copy return (void*)0x43312300; // sx700v100e "first" viewport adr, "VRAM Address : %p", contains d6 uyvy } /* playback viewport */ void *vid_get_viewport_fb_d() { // based on suggestion from 62ndidiot in https://chdk.setepontos.com/index.php?topic=12532.msg129914#msg129914 extern void *current_fb_d; return current_fb_d; } /* Below numbers for sx700v100e four viewport buffers @0xfc568a64 rmem 0xfc568a64 4 -i32 0xfc568a64 16 0xfc568a64: 0x43312300 0x433c0b00 0x4346f300 0x4351db00 */ void *vid_get_viewport_live_fb() { // current_viewport_buffer assummed not most recent, like g7x int i; for(i=0;i<4;i++) { if(current_viewport_buffer == viewport_buffers[i]) { return viewport_buffers[(i+1)&3]; } } return 0; } int vid_get_viewport_width() { extern int _GetVRAMHPixelsSize(); if (camera_info.state.mode_play) { return 640; } // TODO: currently using actual width rather than half width used on pre d6 // pixel format is uyvy (16bpp) return _GetVRAMHPixelsSize(); } long vid_get_viewport_height() { extern int _GetVRAMVPixelsSize(); if (camera_info.state.mode_play) { return 480; } // TODO: currently using actual height rather than 240 used on pre d6 return _GetVRAMVPixelsSize(); } int vid_get_viewport_yoffset() { // this seems to be always 0, buffer always begins with actual display data (widescreen or not) return 0; } // TODO // 0 = 4:3, 1 = 16:9, 2 = 3:2, 3 = 1:1 static long vp_xo[4] = { 0, 0, 0, 80 }; // should all be even values for edge overlay int vid_get_viewport_display_xoffset() { if (camera_info.state.mode_play) { return 0; } // video, ignore still res propcase if(camera_info.state.mode_video || is_video_recording()) { return 0; //neither 4:3 nor 16:9 video have x offset } return vp_xo[shooting_get_prop(PROPCASE_ASPECT_RATIO)]; } // 0 = 4:3, 1 = 16:9, 2 = 3:2, 3 = 1:1 static long vp_yo[4] = { 0, 60, 28, 0 }; int vid_get_viewport_display_yoffset() { if (camera_info.state.mode_play) { return 0; } // video, ignore still res propcase if(camera_info.state.mode_video || is_video_recording()) { if(shooting_get_prop(PROPCASE_VIDEO_RESOLUTION) == 2) { return 0; // 4:3 video, no Y offset } else { return 60; // 16:9 video } } return vp_yo[shooting_get_prop(PROPCASE_ASPECT_RATIO)]; } extern char* bitmap_buffer[]; void *vid_get_bitmap_fb() { // return (void *)0x5ff02e00; // from sub_fc1632ba, alt 5fe05c00, based on searching for "BmpDDev.c" similar to g7x return bitmap_buffer[0]; } int vid_get_viewport_byte_width() { return 640*2; } // Functions for PTP Live View system int vid_get_viewport_display_xoffset_proper() { return vid_get_viewport_display_xoffset(); } int vid_get_viewport_display_yoffset_proper() { return vid_get_viewport_display_yoffset(); } int vid_get_viewport_fullscreen_width() { return 640; } int vid_get_viewport_fullscreen_height() { return 480; } int vid_get_viewport_buffer_width_proper() { return 640; } int vid_get_viewport_type() { return LV_FB_YUV8B; } void *vid_get_bitmap_active_buffer() { return bitmap_buffer[active_bitmap_buffer&1]; } // the opacity buffer defines opacity for the bitmap overlay's pixels // fc1631ee, similar to g7x fc0f7b52, BmpDDev.c assert + switch // FFTM fc0e3c8c volatile char *opacity_buffer[2] = {(char*)0x4161b400, (void*)0x41699d00}; // 0x10108 also appears to contain the active buffer void *vid_get_opacity_active_buffer() { return (void *)opacity_buffer[active_bitmap_buffer&1]; } // TODO sx280 c&p //#if 0 #ifdef CAM_SUPPORT_BITMAP_RES_CHANGE /* * needed because bitmap buffer resolutions change when an external display is used * an extra screen erase doesn't seem to be needed */ void update_screen_dimensions() { // see sub_fc18618a in 102b and 102c for the values extern int displaytype; static int old_displaytype = -1; if (old_displaytype == displaytype) { return; } old_displaytype = displaytype; switch(displaytype) { case 0: case 3: case 4: case 5: // lcd camera_screen.width = camera_screen.physical_width = camera_screen.buffer_width = 640; camera_screen.height = camera_screen.buffer_height = 480; camera_screen.size = camera_screen.buffer_size = 640*480; break; case 1: case 2: case 8: case 9: // tv-out camera_screen.width = 720; camera_screen.physical_width = camera_screen.buffer_width = 736; camera_screen.height = camera_screen.buffer_height = 480; camera_screen.size = 720*480; camera_screen.buffer_size = 736*480; break; case 6: case 7: // hdmi camera_screen.width = camera_screen.physical_width = camera_screen.buffer_width = 960; camera_screen.height = camera_screen.buffer_height = 540; camera_screen.size = camera_screen.buffer_size = 960*540; break; } } #endif //#endif char *camera_jpeg_count_str() { extern char jpeg_count_str[]; return jpeg_count_str; }