hw-control.c revision 318e4f294c181df33cf2541763904565b29bcccb
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2008 The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms. 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful, 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/ 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this file implements the support of the new 'hardware control' 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * qemud communication channel, which is used by libs/hardware on 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the system image to communicate with the emulator program for 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * emulating the following: 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * - power management 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * - led(s) brightness 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * - vibrator 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * - flashlight 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/hw-control.h" 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "cbuffer.h" 259877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project#include "android/hw-qemud.h" 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/misc.h" 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/debug.h" 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "qemu-char.h" 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdio.h> 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h> 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define D(...) VERBOSE_PRINT(hw_control,__VA_ARGS__) 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* define T_ACTIVE to 1 to debug transport communications */ 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define T_ACTIVE 0 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if T_ACTIVE 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define T(...) VERBOSE_PRINT(hw_control,__VA_ARGS__) 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define T(...) ((void)0) 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct { 449877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project void* client; 459877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project AndroidHwControlFuncs client_funcs; 469877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project QemudService* service; 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} HwControl; 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 499877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project/* handle query */ 509877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Projectstatic void hw_control_do_query( HwControl* h, uint8_t* query, int querylen ); 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 529877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project/* called when a qemud client sends a command */ 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 54318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner_hw_control_qemud_client_recv( void* opaque, 55318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner uint8_t* msg, 56318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner int msglen, 57318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner QemudClient* client ) 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 599877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project hw_control_do_query(opaque, msg, msglen); 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 629877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project/* called when a qemud client connects to the service */ 639877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Projectstatic QemudClient* 649877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project_hw_control_qemud_connect( void* opaque, QemudService* service, int channel ) 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 669877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project QemudClient* client; 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 689877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project client = qemud_client_new( service, channel, 699877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project opaque, 709877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project _hw_control_qemud_client_recv, 719877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project NULL ); 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 739877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project qemud_client_set_framing(client, 1); 749877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project return client; 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic uint8_t* 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectif_starts_with( uint8_t* buf, int buflen, const char* prefix ) 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int prefixlen = strlen(prefix); 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (buflen < prefixlen || memcmp(buf, prefix, prefixlen)) 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (uint8_t*)buf + prefixlen; 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecthw_control_do_query( HwControl* h, 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* query, 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int querylen ) 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* q; 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 979877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project T("%s: query %4d '%.*s'", __FUNCTION__, querylen, querylen, query ); 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = if_starts_with( query, querylen, "power:light:brightness:" ); 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q != NULL) { 1019877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project if (h->client_funcs.light_brightness) { 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* qq = strchr((const char*)q, ':'); 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int value; 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (qq == NULL) { 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("%s: badly formatted", __FUNCTION__ ); 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *qq++ = 0; 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project value = atoi(qq); 1109877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project h->client_funcs.light_brightness( h->client, (char*)q, value ); 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1179877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Projectstatic void 1189877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Projecthw_control_init( HwControl* control, 1199877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project void* client, 1209877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project const AndroidHwControlFuncs* client_funcs ) 1219877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project{ 1229877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project control->client = client; 1239877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project control->client_funcs = client_funcs[0]; 1249877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project control->service = qemud_service_register( "hw-control", 0, 1259877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project control, 1269877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project _hw_control_qemud_connect ); 1279877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project} 1289877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectandroid_hw_control_init( void* opaque, const AndroidHwControlFuncs* funcs ) 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1329877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project static HwControl hwstate[1]; 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1349877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project hw_control_init(hwstate, opaque, funcs); 1359877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project D("%s: hw-control qemud handler initialized", __FUNCTION__); 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 137