1/* Copyright (C) 2008 The Android Open Source Project 2** 3** This software is licensed under the terms of the GNU General Public 4** License version 2, as published by the Free Software Foundation, and 5** may be copied, distributed, and modified under those terms. 6** 7** This program is distributed in the hope that it will be useful, 8** but WITHOUT ANY WARRANTY; without even the implied warranty of 9** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10** GNU General Public License for more details. 11*/ 12#include "android/avd/hw-config.h" 13#include "android/utils/ini.h" 14#include "android/utils/system.h" 15#include <string.h> 16#include <stdlib.h> 17 18 19/* the global variable containing the hardware config for this device */ 20AndroidHwConfig android_hw[1]; 21 22static int 23stringToBoolean( const char* value ) 24{ 25 if (!strcmp(value,"1") || 26 !strcmp(value,"yes") || 27 !strcmp(value,"YES") || 28 !strcmp(value,"true") || 29 !strcmp(value,"TRUE")) 30 { 31 return 1; 32 } 33 else 34 return 0; 35} 36 37static int64_t 38diskSizeToInt64( const char* diskSize ) 39{ 40 char* end; 41 int64_t value; 42 43 value = strtoll(diskSize, &end, 10); 44 if (*end == 'k' || *end == 'K') 45 value *= 1024ULL; 46 else if (*end == 'm' || *end == 'M') 47 value *= 1024*1024ULL; 48 else if (*end == 'g' || *end == 'G') 49 value *= 1024*1024*1024ULL; 50 51 return value; 52} 53 54 55void 56androidHwConfig_init( AndroidHwConfig* config, 57 int apiLevel ) 58{ 59#define HWCFG_BOOL(n,s,d,a,t) config->n = stringToBoolean(d); 60#define HWCFG_INT(n,s,d,a,t) config->n = d; 61#define HWCFG_STRING(n,s,d,a,t) config->n = ASTRDUP(d); 62#define HWCFG_DOUBLE(n,s,d,a,t) config->n = d; 63#define HWCFG_DISKSIZE(n,s,d,a,t) config->n = diskSizeToInt64(d); 64 65#include "android/avd/hw-config-defs.h" 66 67 /* Special case for hw.keyboard.lid, we need to set the 68 * default to FALSE for apiLevel >= 12. This allows platform builds 69 * to get correct orientation emulation even if they don't bring 70 * a custom hardware.ini 71 */ 72 if (apiLevel >= 12) { 73 config->hw_keyboard_lid = 0; 74 } 75} 76 77int 78androidHwConfig_read( AndroidHwConfig* config, 79 IniFile* ini ) 80{ 81 if (ini == NULL) 82 return -1; 83 84 /* use the magic of macros to implement the hardware configuration loaded */ 85 86#define HWCFG_BOOL(n,s,d,a,t) if (iniFile_getValue(ini, s)) { config->n = iniFile_getBoolean(ini, s, d); } 87#define HWCFG_INT(n,s,d,a,t) if (iniFile_getValue(ini, s)) { config->n = iniFile_getInteger(ini, s, d); } 88#define HWCFG_STRING(n,s,d,a,t) if (iniFile_getValue(ini, s)) { AFREE(config->n); config->n = iniFile_getString(ini, s, d); } 89#define HWCFG_DOUBLE(n,s,d,a,t) if (iniFile_getValue(ini, s)) { config->n = iniFile_getDouble(ini, s, d); } 90#define HWCFG_DISKSIZE(n,s,d,a,t) if (iniFile_getValue(ini, s)) { config->n = iniFile_getDiskSize(ini, s, d); } 91 92#include "android/avd/hw-config-defs.h" 93 94 return 0; 95} 96 97int 98androidHwConfig_write( AndroidHwConfig* config, 99 IniFile* ini ) 100{ 101 if (ini == NULL) 102 return -1; 103 104 /* use the magic of macros to implement the hardware configuration loaded */ 105 106#define HWCFG_BOOL(n,s,d,a,t) iniFile_setBoolean(ini, s, config->n); 107#define HWCFG_INT(n,s,d,a,t) iniFile_setInteger(ini, s, config->n); 108#define HWCFG_STRING(n,s,d,a,t) iniFile_setValue(ini, s, config->n); 109#define HWCFG_DOUBLE(n,s,d,a,t) iniFile_setDouble(ini, s, config->n); 110#define HWCFG_DISKSIZE(n,s,d,a,t) iniFile_setDiskSize(ini, s, config->n); 111 112#include "android/avd/hw-config-defs.h" 113 114 return 0; 115} 116 117void 118androidHwConfig_done( AndroidHwConfig* config ) 119{ 120#define HWCFG_BOOL(n,s,d,a,t) config->n = 0; 121#define HWCFG_INT(n,s,d,a,t) config->n = 0; 122#define HWCFG_STRING(n,s,d,a,t) AFREE(config->n); 123#define HWCFG_DOUBLE(n,s,d,a,t) config->n = 0.0; 124#define HWCFG_DISKSIZE(n,s,d,a,t) config->n = 0; 125 126#include "android/avd/hw-config-defs.h" 127} 128 129int 130androidHwConfig_isScreenNoTouch( AndroidHwConfig* config ) 131{ 132 return strcmp(config->hw_screen, "no-touch") == 0; 133} 134 135int 136androidHwConfig_isScreenTouch( AndroidHwConfig* config ) 137{ 138 return strcmp(config->hw_screen, "touch") == 0; 139} 140 141int 142androidHwConfig_isScreenMultiTouch( AndroidHwConfig* config ) 143{ 144 return strcmp(config->hw_screen, "multi-touch") == 0; 145} 146 147int 148androidHwConfig_getKernelDeviceNaming( AndroidHwConfig* config ) 149{ 150 if (!strcmp(config->kernel_newDeviceNaming, "no")) 151 return 0; 152 if (!strcmp(config->kernel_newDeviceNaming, "yes")) 153 return 1; 154 return -1; 155} 156 157int 158androidHwConfig_getKernelYaffs2Support( AndroidHwConfig* config ) 159{ 160 if (!strcmp(config->kernel_supportsYaffs2, "no")) 161 return 0; 162 if (!strcmp(config->kernel_supportsYaffs2, "yes")) 163 return 1; 164 return -1; 165} 166 167const char* androidHwConfig_getKernelSerialPrefix(AndroidHwConfig* config ) 168{ 169 if (androidHwConfig_getKernelDeviceNaming(config) >= 1) { 170 return "ttyGF"; 171 } else { 172 return "ttyS"; 173 } 174} 175