#include "pci.h"
#include "maru_device_ids.h"
#include "maru_brightness.h"
+#include "skin/maruskin_server.h"
#include "debug_ch.h"
MULTI_DEBUG_CHANNEL(qemu, maru_brightness);
/* level 81 ~ 90 */ 226, 228, 229, 231, 232, 234, 235, 237, 238, 240,
/* level 91 ~ 99 */ 241, 243, 244, 246, 247, 249, 250, 252, 253};
+QEMUBH *bh;
+
static uint64_t brightness_reg_read(void *opaque,
target_phys_addr_t addr,
unsigned size)
return;
case BRIGHTNESS_OFF:
INFO("brightness_off : %lld\n", val);
+ if (brightness_off == val) {
+ return;
+ }
+
brightness_off = val;
+
#ifdef TARGET_ARM
vga_hw_invalidate();
#endif
+
+ /* notify to skin process */
+ qemu_bh_schedule(bh);
+
return;
default:
ERR("wrong brightness register write - addr : %d\n", (int)addr);
.endianness = DEVICE_LITTLE_ENDIAN,
};
+static void brightness_exitfn(PCIDevice *dev)
+{
+ if (bh) {
+ qemu_bh_delete(bh);
+ }
+}
+
+static void maru_brightness_bh(void *opaque)
+{
+ if (brightness_off == 0) {
+ notify_brightness(TRUE);
+ } else {
+ notify_brightness(FALSE);
+ }
+}
+
static int brightness_initfn(PCIDevice *dev)
{
BrightnessState *s = DO_UPCAST(BrightnessState, dev, dev);
"maru_brightness_mmio", BRIGHTNESS_REG_SIZE);
pci_register_bar(&s->dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->mmio_addr);
+ bh = qemu_bh_new(maru_brightness_bh, s);
+
return 0;
}
k->no_hotplug = 1;
k->init = brightness_initfn;
+ k->exit = brightness_exitfn;
}
static TypeInfo brightness_info = {
DETAIL_INFO_DATA((short) 3),
RAMDUMP_COMPLETE((short) 4),
BOOTING_PROGRESS((short) 5),
+ BRIGHTNESS_VALUE((short) 6),
SENSOR_DAEMON_START((short) 800),
SHUTDOWN((short) 999);
private DataTranfer screenShotDataTransfer;
private DataTranfer detailInfoTransfer;
private DataTranfer progressDataTransfer;
+ private DataTranfer brightnessDataTransfer;
private Thread sendThread;
private LinkedList<SkinSendData> sendQueue;
this.progressDataTransfer.sleep = SCREENSHOT_WAIT_INTERVAL;
this.progressDataTransfer.maxWaitTime = SCREENSHOT_WAIT_LIMIT;
+ this.brightnessDataTransfer = new DataTranfer();
+ this.brightnessDataTransfer.sleep = SCREENSHOT_WAIT_INTERVAL;
+ this.brightnessDataTransfer.maxWaitTime = SCREENSHOT_WAIT_LIMIT;
+
this.heartbeatCount = new AtomicInteger(0);
//this.heartbeatExecutor = Executors.newSingleThreadScheduledExecutor();
this.heartbeatTimer = new Timer();
heartbeatTimer.schedule(heartbeatExecutor, 1, HEART_BEAT_INTERVAL * 1000);
}
- while ( true ) {
-
- if ( isTerminated ) {
+ while (true) {
+ if (isTerminated) {
break;
}
short cmd = dis.readShort();
int length = dis.readInt();
- if ( logger.isLoggable( Level.FINE ) ) {
- logger.fine( "[Socket] read - reqId:" + reqId + ", command:" + cmd + ", dataLength:" + length );
+ if (logger.isLoggable(Level.FINE)) {
+ logger.fine("[Socket] read - reqId:" + reqId +
+ ", command:" + cmd + ", dataLength:" + length);
}
ReceiveCommand command = null;
try {
- command = ReceiveCommand.getValue( cmd );
- } catch ( IllegalArgumentException e ) {
- logger.severe( "unknown command:" + cmd );
+ command = ReceiveCommand.getValue(cmd);
+ } catch (IllegalArgumentException e) {
+ logger.severe("unknown command:" + cmd);
continue;
}
break;
}
case BOOTING_PROGRESS: {
- logger.info("received BOOTING_PROGRESS from QEMU.");
+ //logger.info("received BOOTING_PROGRESS from QEMU.");
resetDataTransfer(progressDataTransfer);
receiveData(progressDataTransfer, length);
if (value == 100 | value == 0) {
/* this means progressbar will be
- dispose soon */
+ disposed soon */
if (skin.bootingProgress != null) {
skin.bootingProgress = null;
}
break;
}
+ case BRIGHTNESS_VALUE: {
+ //logger.info("received BRIGHTNESS_VALUE from QEMU.");
+
+ resetDataTransfer(brightnessDataTransfer);
+ receiveData(brightnessDataTransfer, length);
+
+ byte[] receivedData = getReceivedData(brightnessDataTransfer);
+ if (null != receivedData) {
+ String strValue = new String(receivedData, 0, length - 1);
+
+ int value = 1;
+ try {
+ value = Integer.parseInt(strValue);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+
+ if (value == 0) {
+ logger.info("display off");
+ } else {
+ logger.info("display on");
+ }
+ }
+
+ break;
+ }
case SENSOR_DAEMON_START: {
- logger.info( "received SENSOR_DAEMON_START from QEMU." );
- synchronized ( this ) {
+ logger.info("received SENSOR_DAEMON_START from QEMU.");
+ synchronized (this) {
isSensorDaemonStarted = true;
}
break;
}
case SHUTDOWN: {
- logger.info( "received RESPONSE_SHUTDOWN from QEMU." );
- sendToQEMU( SendCommand.RESPONSE_SHUTDOWN, null );
+ logger.info("received RESPONSE_SHUTDOWN from QEMU.");
+ sendToQEMU(SendCommand.RESPONSE_SHUTDOWN, null);
terminate();
break;
}
default: {
- logger.severe( "Unknown command from QEMU. command:" + cmd );
+ logger.severe("Unknown command from QEMU. command:" + cmd);
break;
}
}
- } catch ( IOException e ) {
- logger.log( Level.SEVERE, e.getMessage(), e );
+ } catch (IOException e) {
+ logger.log(Level.SEVERE, e.getMessage(), e);
break;
}
/*
* operation for emulator skin
*
- * Copyright (C) 2011 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (C) 2011 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
*
* Contact:
* GiWoong Kim <giwoong.kim@samsung.com>
MULTI_DEBUG_CHANNEL(qemu, skin_operation);
-#define RESUME_KEY_SEND_INTERVAL 500 // milli-seconds
-#define CLOSE_POWER_KEY_INTERVAL 1200 // milli-seconds
-#define DATA_DELIMITER "#" // in detail info data
-#define TIMEOUT_FOR_SHUTDOWN 10 // seconds
+
+#define RESUME_KEY_SEND_INTERVAL 500 /* milli-seconds */
+#define CLOSE_POWER_KEY_INTERVAL 1200 /* milli-seconds */
+#define DATA_DELIMITER "#" /* in detail info data */
+#define TIMEOUT_FOR_SHUTDOWN 10 /* seconds */
static int requested_shutdown_qemu_gracefully = 0;
static void* run_timed_shutdown_thread(void* args);
static void send_to_emuld(const char* request_type, int request_size, const char* send_buf, int buf_size);
-void start_display(uint64 handle_id, int lcd_size_width, int lcd_size_height, double scale_factor, short rotation_type)
+void start_display(uint64 handle_id,
+ int lcd_size_width, int lcd_size_height, double scale_factor, short rotation_type)
{
INFO("start_display handle_id:%ld, lcd size:%dx%d, scale_factor:%f, rotation_type:%d\n",
(long)handle_id, lcd_size_width, lcd_size_height, scale_factor, rotation_type);
SEND_DETAIL_INFO = 3,
SEND_RAMDUMP_COMPLETE = 4,
SEND_BOOTING_PROGRESS = 5,
+ SEND_BRIGHTNESS_VALUE = 6,
SEND_SENSOR_DAEMON_START = 800,
SEND_SHUTDOWN = 999,
};
}
}
+void notify_brightness(bool on)
+{
+ char brightness_data[2] = { 0, };
+ int brightness_value = 1;
+
+ if (on == FALSE) {
+ brightness_value = 0;
+ }
+
+ snprintf(brightness_data, 2, "%d", brightness_value);
+ TRACE("brightness value = %s\n", brightness_data);
+
+ if (client_sock) {
+ if (0 > send_skin_data(client_sock,
+ SEND_BRIGHTNESS_VALUE, (unsigned char *)brightness_data, 2, 0)) {
+
+ ERR("fail to send SEND_BRIGHTNESS_VALUE to skin.\n");
+ }
+ }
+}
+
int is_ready_skin_server(void)
{
return ready_server;
#ifndef MARUSKIN_SERVER_H_
#define MARUSKIN_SERVER_H_
+#include <stdbool.h>
+
int start_skin_server(int argc, char** argv, int qemu_argc, char** qemu_argv);
void shutdown_skin_server(void);
void notify_sensor_daemon_start(void);
void notify_ramdump_completed(void);
void notify_booting_progress(int progress_value);
+void notify_brightness(bool on);
+
int is_ready_skin_server(void);
int get_skin_server_port(void);