From 973f8ee1dcb781feca3b346fc3a05d82c2f321e4 Mon Sep 17 00:00:00 2001 From: Son Hyunjun Date: Fri, 23 Mar 2012 01:15:55 +0900 Subject: [PATCH] [Title] fix hard key thread problem, resume using power key [Type] Bugfix [Module] Skin/Power [Priority] Major [CQ#] [Redmine#] [Problem] [Cause] [Solution] Change-Id: Id0ffc2f1ed39f54af85ac53021b8d5347e9349f6 --- tizen/src/emul_state.h | 2 + tizen/src/hw/maru_brightness.c | 93 ++++++++++++++---------------- tizen/src/hw/maru_brightness.h | 8 ++- tizen/src/hw/maru_pm.c | 10 ++-- tizen/src/hw/maru_vga.c | 112 ++++++++++++++++++------------------ tizen/src/maru_sdl.c | 64 +++++++++++++++++++++ tizen/src/maru_sdl.h | 2 + tizen/src/skin/maruskin_operation.c | 49 ++++++---------- 8 files changed, 194 insertions(+), 146 deletions(-) diff --git a/tizen/src/emul_state.h b/tizen/src/emul_state.h index 387086a..c715a12 100644 --- a/tizen/src/emul_state.h +++ b/tizen/src/emul_state.h @@ -41,6 +41,8 @@ enum { HARD_KEY_HOME = 101, HARD_KEY_POWER = 103, + HARD_KEY_VOL_UP = 115, + HARD_KEY_VOL_DOWN = 114, }; enum { diff --git a/tizen/src/hw/maru_brightness.c b/tizen/src/hw/maru_brightness.c index 32c00db..5040a04 100644 --- a/tizen/src/hw/maru_brightness.c +++ b/tizen/src/hw/maru_brightness.c @@ -43,16 +43,13 @@ #include "maru_brightness.h" #include "debug_ch.h" -MULTI_DEBUG_CHANNEL(qemu, maru_brightness); +MULTI_DEBUG_CHANNEL( qemu, maru_brightness ); #define QEMU_DEV_NAME "MARU_BRIGHTNESS" #define BRIGHTNESS_MEM_SIZE (4 * 1024) /* 4KB */ #define BRIGHTNESS_REG_SIZE 256 -#define BRIGHTNESS_MIN (0) -#define BRIGHTNESS_MAX (24) - typedef struct BrightnessState { PCIDevice dev; ram_addr_t vram_offset; @@ -60,8 +57,8 @@ typedef struct BrightnessState { } BrightnessState; enum { - BRIGHTNESS_LEVEL = 0x00, - BRIGHTNESS_OFF = 0x04, + BRIGHTNESS_LEVEL = 0x00, + BRIGHTNESS_OFF = 0x04, }; uint32_t brightness_level = 24; @@ -70,11 +67,10 @@ uint32_t brightness_off = 0; uint8_t brightness_tbl[] = {20, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240}; -static uint64_t brightness_reg_read(void *opaque, target_phys_addr_t addr, unsigned size) -{ - switch (addr & 0xFF) { +static uint64_t brightness_reg_read( void *opaque, target_phys_addr_t addr, unsigned size ) { + switch ( addr & 0xFF ) { case BRIGHTNESS_LEVEL: - INFO("brightness_reg_read: brightness_level = %d\n", brightness_level); + INFO("brightness_reg_read: brightness_level = %d\n", brightness_level); return brightness_level; case BRIGHTNESS_OFF: INFO("brightness_reg_read: brightness_off = %d\n", brightness_off); @@ -87,29 +83,28 @@ static uint64_t brightness_reg_read(void *opaque, target_phys_addr_t addr, unsig return 0; } -static void brightness_reg_write(void *opaque, target_phys_addr_t addr, uint64_t val, unsigned size) -{ +static void brightness_reg_write( void *opaque, target_phys_addr_t addr, uint64_t val, unsigned size ) { #if BRIGHTNESS_MIN > 0 - if (val < BRIGHTNESS_MIN || val > BRIGHTNESS_MAX) { + if (val < BRIGHTNESS_MIN || val > BRIGHTNESS_MAX) { #else - if (val > BRIGHTNESS_MAX) { + if ( val > BRIGHTNESS_MAX ) { #endif - ERR("brightness_reg_write: Invalide brightness level.\n"); - } - - switch (addr & 0xFF) { - case BRIGHTNESS_LEVEL: - brightness_level = val; - INFO("brightness_level : %lld\n", val); - return; - case BRIGHTNESS_OFF: - INFO("brightness_off : %lld\n", val); - brightness_off = val; - return; - default: - ERR("wrong brightness register write - addr : %d\n", (int)addr); - break; - } + ERR("brightness_reg_write: Invalide brightness level.\n"); + } + + switch ( addr & 0xFF ) { + case BRIGHTNESS_LEVEL: + brightness_level = val; + INFO("brightness_level : %lld\n", val); + return; + case BRIGHTNESS_OFF: + INFO("brightness_off : %lld\n", val); + brightness_off = val; + return; + default: + ERR("wrong brightness register write - addr : %d\n", (int)addr); + break; + } } static const MemoryRegionOps brightness_mmio_ops = { @@ -118,43 +113,39 @@ static const MemoryRegionOps brightness_mmio_ops = { .endianness = DEVICE_LITTLE_ENDIAN, }; -static int brightness_initfn(PCIDevice *dev) -{ - BrightnessState *s = DO_UPCAST(BrightnessState, dev, dev); +static int brightness_initfn( PCIDevice *dev ) { + BrightnessState *s = DO_UPCAST(BrightnessState, dev, dev); uint8_t *pci_conf = s->dev.config; - pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_TIZEN); - pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_VIRTUAL_BRIGHTNESS); - pci_config_set_class(pci_conf, PCI_CLASS_DISPLAY_OTHER); + pci_config_set_vendor_id( pci_conf, PCI_VENDOR_ID_TIZEN ); + pci_config_set_device_id( pci_conf, PCI_DEVICE_ID_VIRTUAL_BRIGHTNESS ); + pci_config_set_class( pci_conf, PCI_CLASS_DISPLAY_OTHER ); - memory_region_init_io (&s->mmio_addr, &brightness_mmio_ops, s, "maru_brightness_mmio", BRIGHTNESS_REG_SIZE); - pci_register_bar(&s->dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->mmio_addr); + memory_region_init_io( &s->mmio_addr, &brightness_mmio_ops, s, "maru_brightness_mmio", BRIGHTNESS_REG_SIZE ); + pci_register_bar( &s->dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->mmio_addr ); return 0; } /* external interface */ -int pci_get_brightness(void) -{ - return brightness_level; +int pci_get_brightness( void ) { + return brightness_level; } -int pci_maru_brightness_init(PCIBus *bus) -{ - pci_create_simple(bus, -1, QEMU_DEV_NAME); +int pci_maru_brightness_init( PCIBus *bus ) { + pci_create_simple( bus, -1, QEMU_DEV_NAME ); return 0; } static PCIDeviceInfo brightness_info = { - .qdev.name = QEMU_DEV_NAME, - .qdev.size = sizeof(BrightnessState), - .no_hotplug = 1, - .init = brightness_initfn, + .qdev.name = QEMU_DEV_NAME, + .qdev.size = sizeof(BrightnessState), + .no_hotplug = 1, + .init = brightness_initfn, }; -static void brightness_register(void) -{ - pci_qdev_register(&brightness_info); +static void brightness_register( void ) { + pci_qdev_register( &brightness_info ); } device_init(brightness_register); diff --git a/tizen/src/hw/maru_brightness.h b/tizen/src/hw/maru_brightness.h index 8ea9dd8..6e3da40 100644 --- a/tizen/src/hw/maru_brightness.h +++ b/tizen/src/hw/maru_brightness.h @@ -27,17 +27,19 @@ * */ - #ifndef MARU_BRIGHTNESS_H_ #define MARU_BRIGHTNESS_H_ #include "qemu-common.h" +#define BRIGHTNESS_MIN (0) +#define BRIGHTNESS_MAX (24) + extern uint32_t brightness_level; extern uint32_t brightness_off; extern uint8_t brightness_tbl[]; -int pci_get_brightness(void); -int pci_maru_brightness_init(PCIBus *bus); +int pci_get_brightness( void ); +int pci_maru_brightness_init( PCIBus *bus ); #endif /* MARU_BRIGHTNESS_H_ */ diff --git a/tizen/src/hw/maru_pm.c b/tizen/src/hw/maru_pm.c index 38610e0..18a8baf 100644 --- a/tizen/src/hw/maru_pm.c +++ b/tizen/src/hw/maru_pm.c @@ -102,6 +102,8 @@ static void pm_update_sci(PIIX4PMState *s) { int sci_level, pmsts; + acpi_state = s; + pmsts = acpi_pm1_evt_get_sts(&s->pm1a, s->tmr.overflow_time); sci_level = (((pmsts & s->pm1a.en) & (ACPI_BITMASK_RT_CLOCK_ENABLE | @@ -634,15 +636,15 @@ void resume( void ) { if ( acpi_state ) { if ( acpi_state->pm1_cnt.cmos_s3 ) { - acpi_state->pm1_cnt.cnt |= ( ACPI_BITMASK_WAKE_STATUS | ACPI_BITMASK_POWER_BUTTON_STATUS ); - INFO( "raise irq for ACPI wake." ); + acpi_state->pm1a.sts |= ( ACPI_BITMASK_WAKE_STATUS | ACPI_BITMASK_POWER_BUTTON_STATUS ); + INFO( "raise irq for ACPI wake.\n" ); qemu_irq_raise( acpi_state->pm1_cnt.cmos_s3 ); }else { - ERR( "acpi cmos_s3 is NULL." ); + ERR( "acpi cmos_s3 is NULL.\n" ); } }else { - ERR( "acpi state is NULL." ); + ERR( "acpi state is NULL.\n" ); } } diff --git a/tizen/src/hw/maru_vga.c b/tizen/src/hw/maru_vga.c index f7565e5..d8451c5 100644 --- a/tizen/src/hw/maru_vga.c +++ b/tizen/src/hw/maru_vga.c @@ -74,6 +74,8 @@ MULTI_DEBUG_CHANNEL(qemu, maru_vga); #define GET_PLANE(data, p) (((data) >> ((p) * 8)) & 0xff) #endif +#define MARU_VGA + static const uint32_t mask16[16] = { PAT(0x00000000), PAT(0x000000ff), @@ -135,10 +137,6 @@ static void vga_screen_dump(void *opaque, const char *filename); static const char *screen_dump_filename; static DisplayChangeListener *screen_dump_dcl; -#ifdef TARGET_I386 -static int is_off_screen = 0; -#endif - static void vga_dumb_update_retrace_info(VGACommonState *s) { (void) s; @@ -899,14 +897,6 @@ static void vga_draw_graphic(VGACommonState *s, int full_update) uint32_t v, addr1, addr; maru_vga_draw_line_func *maru_vga_draw_line; -#ifdef TARGET_I386 - if( brightness_off ) { - if( is_off_screen ) { - return; - } - } -#endif - full_update |= update_basic_params(s); if (!full_update) @@ -954,9 +944,15 @@ static void vga_draw_graphic(VGACommonState *s, int full_update) if (depth == 32) { #endif qemu_free_displaysurface(s->ds); + +#ifdef MARU_VGA // create new sufrace by malloc in MARU VGA + s->ds->surface = qemu_create_displaysurface( s->ds, disp_width, height ); +#else s->ds->surface = qemu_create_displaysurface_from(disp_width, height, depth, s->line_offset, s->vram_ptr + (s->start_addr * 4)); +#endif + #if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN) s->ds->surface->pf = qemu_different_endianness_pixelformat(depth); #endif @@ -1069,9 +1065,11 @@ static void vga_draw_graphic(VGACommonState *s, int full_update) } /* explicit invalidation for the hardware cursor */ update |= (s->invalidated_y_table[y >> 5] >> (y & 0x1f)) & 1; -#ifdef TARGET_I386 + +#ifdef MARU_VGA // needs full update update |= 1; #endif + if (update) { if (y_start < 0) y_start = y; @@ -1085,7 +1083,8 @@ static void vga_draw_graphic(VGACommonState *s, int full_update) s->cursor_draw_line(s, d, y); } -#ifdef TARGET_I386 +#ifdef MARU_VGA + int i; uint8_t *fb_sub; uint8_t *over_sub; @@ -1094,73 +1093,82 @@ static void vga_draw_graphic(VGACommonState *s, int full_update) uint32_t *dst; uint16_t overlay_bottom; - if (overlay0_power) { + if ( overlay0_power ) { + overlay_bottom = overlay0_top + overlay0_height; - if (overlay0_top <= y && y < overlay_bottom) { + if ( overlay0_top <= y && y < overlay_bottom ) { + fb_sub = s->vram_ptr + addr + overlay0_left * 4; - over_sub = overlay_ptr + (y - overlay0_top) * overlay0_width * 4; - dst = (uint32_t*)(s->ds->surface->data + addr + overlay0_left * 4); + over_sub = overlay_ptr + ( y - overlay0_top ) * overlay0_width * 4; + dst = (uint32_t*) ( s->ds->surface->data + addr + overlay0_left * 4 ); + + for ( i = 0; i < overlay0_width; i++, fb_sub += 4, over_sub += 4, dst++ ) { - for (i = 0; i < overlay0_width; i++, fb_sub += 4, over_sub += 4, dst++) { - //alpha = 0x80; alpha = fb_sub[3]; c_alpha = 0xff - alpha; - //fprintf(stderr, "alpha = %d\n", alpha); - *dst = ((c_alpha * over_sub[0] + alpha * fb_sub[0]) >> 8) | - ((c_alpha * over_sub[1] + alpha * fb_sub[1]) & 0xFF00) | - (((c_alpha * over_sub[2] + alpha * fb_sub[2]) & 0xFF00) << 8); + *dst = ( ( c_alpha * over_sub[0] + alpha * fb_sub[0] ) >> 8 ) + | ( ( c_alpha * over_sub[1] + alpha * fb_sub[1] ) & 0xFF00 ) + | ( ( ( c_alpha * over_sub[2] + alpha * fb_sub[2] ) & 0xFF00 ) << 8 ); } + } + } - if (overlay1_power) { + if ( overlay1_power ) { + overlay_bottom = overlay1_top + overlay1_height; - if (overlay1_top <= y && y < overlay_bottom) { + if ( overlay1_top <= y && y < overlay_bottom ) { + fb_sub = s->vram_ptr + addr + overlay1_left * 4; - over_sub = overlay_ptr + (y - overlay1_top) * overlay1_width * 4 + 0x00400000; - dst = (uint32_t*)(s->ds->surface->data + addr + overlay1_left * 4); + over_sub = overlay_ptr + ( y - overlay1_top ) * overlay1_width * 4 + 0x00400000; + dst = (uint32_t*) ( s->ds->surface->data + addr + overlay1_left * 4 ); + + for ( i = 0; i < overlay1_width; i++, fb_sub += 4, over_sub += 4, dst++ ) { - for (i = 0; i < overlay1_width; i++, fb_sub += 4, over_sub += 4, dst++) { - //alpha = 0x80; alpha = fb_sub[3]; c_alpha = 0xff - alpha; - //fprintf(stderr, "alpha = %d\n", alpha); - *dst = ((c_alpha * over_sub[0] + alpha * fb_sub[0]) >> 8) | - ((c_alpha * over_sub[1] + alpha * fb_sub[1]) & 0xFF00) | - (((c_alpha * over_sub[2] + alpha * fb_sub[2]) & 0xFF00) << 8); + *dst = ( ( c_alpha * over_sub[0] + alpha * fb_sub[0] ) >> 8 ) + | ( ( c_alpha * over_sub[1] + alpha * fb_sub[1] ) & 0xFF00 ) + | ( ( ( c_alpha * over_sub[2] + alpha * fb_sub[2] ) & 0xFF00 ) << 8 ); } + } + } - //FIXME - if( brightness_off ) { + if ( brightness_off ) { dst_sub = s->ds->surface->data + addr; - dst = (uint32_t*)(s->ds->surface->data + addr); - for (i=0; i < disp_width; i++, dst_sub += 4, dst++) { - *dst = 0xFF000000; + dst = (uint32_t*) ( s->ds->surface->data + addr ); + + for ( i = 0; i < disp_width; i++, dst_sub += 4, dst++ ) { + *dst = 0xFF000000; // black } - }else if (brightness_level < 24) { + } else { - alpha = brightness_tbl[brightness_level]; + if ( brightness_level < BRIGHTNESS_MAX ) { - dst_sub = s->ds->surface->data + addr; - dst = (uint32_t*)(s->ds->surface->data + addr); + alpha = brightness_tbl[brightness_level]; + + dst_sub = s->ds->surface->data + addr; + dst = (uint32_t*) ( s->ds->surface->data + addr ); - for (i=0; i < disp_width; i++, dst_sub += 4, dst++) { - *dst = ((alpha * dst_sub[0]) >> 8) | - ((alpha * dst_sub[1]) & 0xFF00) | - (((alpha * dst_sub[2]) & 0xFF00) << 8); + for ( i = 0; i < disp_width; i++, dst_sub += 4, dst++ ) { + *dst = ( ( alpha * dst_sub[0] ) >> 8 ) + | ( ( alpha * dst_sub[1] ) & 0xFF00 ) + | ( ( ( alpha * dst_sub[2] ) & 0xFF00 ) << 8 ); + } } } -#endif /* TARGET_I386 */ +#endif /* MARU_VGA */ } else { if (y_start >= 0) { @@ -1190,14 +1198,6 @@ static void vga_draw_graphic(VGACommonState *s, int full_update) disp_width, y - y_start); } - if( brightness_off ) { - is_off_screen = 1; - }else { - if( is_off_screen ) { - is_off_screen = 0; - } - } - /* reset modified pages */ if (page_max >= page_min) { memory_region_reset_dirty(&s->vram, diff --git a/tizen/src/maru_sdl.c b/tizen/src/maru_sdl.c index d497895..e250ec8 100644 --- a/tizen/src/maru_sdl.c +++ b/tizen/src/maru_sdl.c @@ -29,10 +29,12 @@ #include +#include "console.h" #include "maru_sdl.h" #include "emul_state.h" #include "sdl_rotate.h" #include "maru_finger.h" +#include "hw/maru_pm.h" #include "debug_ch.h" MULTI_DEBUG_CHANNEL(tizen, maru_sdl); @@ -64,6 +66,13 @@ static void qemu_update(void) SDL_Surface *processing_screen = NULL; if (scale_factor != 1.0 || screen_degree != 0.0) { + + // workaround + if ( surface_qemu ) { + // set color key 'magenta' + surface_qemu->format->colorkey = 0xFF00FF; + } + //image processing processing_screen = rotozoomSurface(surface_qemu, screen_degree, scale_factor, 1); SDL_BlitSurface(processing_screen, NULL, surface_screen, NULL); @@ -170,6 +179,57 @@ static int maru_sdl_poll_event(SDL_Event *ev) return ret; } +static void put_hardkey_code( SDL_UserEvent event ) { + + // use pointer as integer + int event_type = (int) event.data1; + int keycode = (int) event.data2; + + if ( KEY_PRESSED == event_type ) { + + if ( kbd_mouse_is_absolute() ) { + + // home key or power key is used for resume. + if ( ( HARD_KEY_HOME == keycode ) || ( HARD_KEY_POWER == keycode ) ) { + if ( is_suspended_state() ) { + INFO( "user requests system resume.\n" ); + resume(); + } + } + + ps2kbd_put_keycode( keycode & 0x7f ); + + } + + } else if ( KEY_RELEASED == event_type ) { + + if ( kbd_mouse_is_absolute() ) { + ps2kbd_put_keycode( keycode | 0x80 ); + } + + } else { + ERR( "Unknown hardkey event type.[event_type:%d]", event_type ); + } + +} + +static void handle_sdl_user_event ( SDL_UserEvent event ) { + + int code = event.code; + + switch ( code ) { + case SDL_USER_EVENT_CODE_HARDKEY: { + put_hardkey_code( event ); + break; + } + default: { + ERR( "Unknown sdl user event.[event code:%d]\n", code ); + break; + } + } + +} + static void qemu_ds_refresh(DisplayState *ds) { SDL_Event ev1, *ev = &ev1; @@ -216,6 +276,10 @@ static void qemu_ds_refresh(DisplayState *ds) break; } + case SDL_USEREVENT: { + handle_sdl_user_event( ev->user ); + break; + } default: break; diff --git a/tizen/src/maru_sdl.h b/tizen/src/maru_sdl.h index b0bbaae..442fc96 100644 --- a/tizen/src/maru_sdl.h +++ b/tizen/src/maru_sdl.h @@ -43,6 +43,8 @@ #include #include +#define SDL_USER_EVENT_CODE_HARDKEY 1 + void maruskin_display_init(DisplayState *ds); void maruskin_sdl_init(int swt_handle, int lcd_size_width, int lcd_size_height); void maruskin_sdl_resize(void); diff --git a/tizen/src/skin/maruskin_operation.c b/tizen/src/skin/maruskin_operation.c index cc4ba8a..eff0ee1 100644 --- a/tizen/src/skin/maruskin_operation.c +++ b/tizen/src/skin/maruskin_operation.c @@ -33,17 +33,17 @@ #include "maruskin_operation.h" #include "maru_sdl.h" #include "debug_ch.h" -#include "../hw/maru_pm.h" -#include "console.h" #include "sdb.h" #include "nbd.h" #include "../mloop_event.h" #include "emul_state.h" #include "maruskin_keymap.h" +#include "emul_state.h" MULTI_DEBUG_CHANNEL(qemu, skin_operation); +#define CLOSE_POWER_KEY_INTERVAL 1.2 // seconds void start_display( int handle_id, int lcd_size_width, int lcd_size_height, double scale_factor, short rotation_type ) { @@ -109,35 +109,18 @@ void do_hardkey_event( int event_type, int keycode ) { TRACE( "do_hardkey_event event_type:%d, keycode:%d\n", event_type, keycode ); - // press - if ( KEY_PRESSED == event_type ) { + SDL_Event event; + memset( &event, 0, sizeof(SDL_Event) ); - if ( kbd_mouse_is_absolute() ) { + event.type = SDL_USEREVENT; + event.user.code = SDL_USER_EVENT_CODE_HARDKEY; - // home key or power key is used for resume. - if ( ( HARD_KEY_HOME == keycode ) || ( HARD_KEY_POWER == keycode ) ) { - if ( is_suspended_state() ) { - INFO( "user requests system resume.\n" ); - resume(); -#ifdef _WIN32 - Sleep( 500 ); -#else - usleep( 500 * 1000 ); -#endif - } - } - - ps2kbd_put_keycode( keycode & 0x7f ); - - } + // use pointer as integer + event.user.data1 = (void*) event_type; + event.user.data2 = (void*) keycode; - } else if ( KEY_RELEASED == event_type ) { - - if ( kbd_mouse_is_absolute() ) { - ps2kbd_put_keycode( keycode | 0x80 ); - } - - } + // see qemu_ds_refresh in maru_sdl.c + SDL_PushEvent( &event ); } @@ -227,12 +210,14 @@ void request_close( void ) { INFO( "request_close\n" ); - ps2kbd_put_keycode( 103 & 0x7f ); + do_hardkey_event( KEY_PRESSED, HARD_KEY_POWER ); + #ifdef _WIN32 - Sleep( 1.6 * 1000 ); // 1.6 seconds + Sleep( CLOSE_POWER_KEY_INTERVAL * 1000 ); // 1.6 seconds #else - usleep( 1.6 * 1000 * 1000 ); // 1.6 seconds + usleep( CLOSE_POWER_KEY_INTERVAL * 1000 * 1000 ); // 1.6 seconds #endif - kbd_put_keycode( 103 | 0x80 ); + + do_hardkey_event( KEY_RELEASED, HARD_KEY_POWER ); } -- 2.7.4