1cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project/* 2cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * 4cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * you may not use this file except in compliance with the License. 6cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * You may obtain a copy of the License at 7cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * 8cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * 10cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * See the License for the specific language governing permissions and 14cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * limitations under the License. 15cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project */ 16cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#ifndef _libs_hardware_qemu_h 17cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#define _libs_hardware_qemu_h 18cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project 19cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#ifdef __cplusplus 20cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Projectextern "C" { 21cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#endif 22cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project 23cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#ifdef QEMU_HARDWARE 24cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project 25cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project/* returns 1 iff we're running in the emulator */ 26cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Projectextern int qemu_check(void); 27cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project 28cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project/* a structure used to hold enough state to connect to a given 29cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * QEMU communication channel, either through a qemud socket or 30cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * a serial port. 31cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * 32cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * initialize the structure by zero-ing it out 33cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project */ 34cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Projecttypedef struct { 35cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project char is_inited; 36cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project char is_available; 37cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project char is_qemud; 38e18b7b21c2fe0788e6cf1a1a055a25c2e5bc2dd8The Android Open Source Project char is_qemud_old; 39cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project char is_tty; 40e18b7b21c2fe0788e6cf1a1a055a25c2e5bc2dd8The Android Open Source Project int fd; 41cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project char device[32]; 42cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project} QemuChannel; 43cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project 44cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project/* try to open a qemu communication channel. 45cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * returns a file descriptor on success, or -1 in case of 46cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * error. 47cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * 48cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * 'channel' must be a QemuChannel structure that is empty 49cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * on the first call. You can call this function several 50cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * time to re-open the channel using the same 'channel' 51cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * object to speed things a bit. 52cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project */ 53cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Projectextern int qemu_channel_open( QemuChannel* channel, 54cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project const char* name, 55cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project int mode ); 56cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project 57cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project/* create a command made of a 4-hexchar prefix followed 58cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * by the content. the prefix contains the content's length 59cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * in hexadecimal coding. 60cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * 61cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * 'buffer' must be at last 6 bytes 62cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * returns -1 in case of overflow, or the command's total length 63cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * otherwise (i.e. content length + 4) 64cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project */ 65cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Projectextern int qemu_command_format( char* buffer, 66cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project int buffer_size, 67cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project const char* format, 68cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project ... ); 69cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project 70e18b7b21c2fe0788e6cf1a1a055a25c2e5bc2dd8The Android Open Source Project/* directly sends a command through the 'hw-control' channel. 71cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * this will open the channel, send the formatted command, then 72cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * close the channel automatically. 73cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * returns 0 on success, or -1 on error. 74cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project */ 75cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Projectextern int qemu_control_command( const char* fmt, ... ); 76cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project 77e18b7b21c2fe0788e6cf1a1a055a25c2e5bc2dd8The Android Open Source Project/* sends a question to the hw-control channel, then receive an answer in 78e18b7b21c2fe0788e6cf1a1a055a25c2e5bc2dd8The Android Open Source Project * a user-allocated buffer. returns the length of the answer, or -1 79cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * in case of error. 80cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * 81cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * 'question' *must* have been formatted through qemu_command_format 82cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project */ 83cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Projectextern int qemu_control_query( const char* question, int questionlen, 84cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project char* answer, int answersize ); 85cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project 86cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#endif /* QEMU_HARDWARE */ 87cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project 88cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project/* use QEMU_FALLBACK(call) to call a QEMU-specific callback */ 89cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project/* use QEMU_FALLBACK_VOID(call) if the function returns void */ 90cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#ifdef QEMU_HARDWARE 91cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project# define QEMU_FALLBACK(x) \ 92cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project do { \ 93cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project if (qemu_check()) \ 94cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project return qemu_ ## x ; \ 95cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project } while (0) 96cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project# define QEMU_FALLBACK_VOID(x) \ 97cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project do { \ 98cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project if (qemu_check()) { \ 99cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project qemu_ ## x ; \ 100cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project return; \ 101cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project } \ 102cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project } while (0) 103cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#else 104cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project# define QEMU_FALLBACK(x) ((void)0) 105cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project# define QEMU_FALLBACK_VOID(x) ((void)0) 106cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#endif 107cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project 108cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#ifdef __cplusplus 109cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project} 110cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#endif 111cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project 112cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#endif /* _libs_hardware_qemu_h */ 113