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