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