| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| #ifndef _libs_hardware_qemu_h |
| #define _libs_hardware_qemu_h |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #ifdef QEMU_HARDWARE |
| |
| /* returns 1 iff we're running in the emulator */ |
| extern int qemu_check(void); |
| |
| /* a structure used to hold enough state to connect to a given |
| * QEMU communication channel, either through a qemud socket or |
| * a serial port. |
| * |
| * initialize the structure by zero-ing it out |
| */ |
| typedef struct { |
| char is_inited; |
| char is_available; |
| char is_qemud; |
| char is_qemud_old; |
| char is_tty; |
| int fd; |
| char device[32]; |
| } QemuChannel; |
| |
| /* try to open a qemu communication channel. |
| * returns a file descriptor on success, or -1 in case of |
| * error. |
| * |
| * 'channel' must be a QemuChannel structure that is empty |
| * on the first call. You can call this function several |
| * time to re-open the channel using the same 'channel' |
| * object to speed things a bit. |
| */ |
| extern int qemu_channel_open( QemuChannel* channel, |
| const char* name, |
| int mode ); |
| |
| /* create a command made of a 4-hexchar prefix followed |
| * by the content. the prefix contains the content's length |
| * in hexadecimal coding. |
| * |
| * 'buffer' must be at last 6 bytes |
| * returns -1 in case of overflow, or the command's total length |
| * otherwise (i.e. content length + 4) |
| */ |
| extern int qemu_command_format( char* buffer, |
| int buffer_size, |
| const char* format, |
| ... ); |
| |
| /* directly sends a command through the 'hw-control' channel. |
| * this will open the channel, send the formatted command, then |
| * close the channel automatically. |
| * returns 0 on success, or -1 on error. |
| */ |
| extern int qemu_control_command( const char* fmt, ... ); |
| |
| /* sends a question to the hw-control channel, then receive an answer in |
| * a user-allocated buffer. returns the length of the answer, or -1 |
| * in case of error. |
| * |
| * 'question' *must* have been formatted through qemu_command_format |
| */ |
| extern int qemu_control_query( const char* question, int questionlen, |
| char* answer, int answersize ); |
| |
| #endif /* QEMU_HARDWARE */ |
| |
| /* use QEMU_FALLBACK(call) to call a QEMU-specific callback */ |
| /* use QEMU_FALLBACK_VOID(call) if the function returns void */ |
| #ifdef QEMU_HARDWARE |
| # define QEMU_FALLBACK(x) \ |
| do { \ |
| if (qemu_check()) \ |
| return qemu_ ## x ; \ |
| } while (0) |
| # define QEMU_FALLBACK_VOID(x) \ |
| do { \ |
| if (qemu_check()) { \ |
| qemu_ ## x ; \ |
| return; \ |
| } \ |
| } while (0) |
| #else |
| # define QEMU_FALLBACK(x) ((void)0) |
| # define QEMU_FALLBACK_VOID(x) ((void)0) |
| #endif |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* _libs_hardware_qemu_h */ |