hw-qemud.h revision bb1f432421288dae208c7189356643023ccbffbc
1/* Copyright (C) 2007-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#ifndef _android_qemud_h
13#define _android_qemud_h
14
15#include "qemu-common.h"
16
17/* Support for the qemud-based 'services' in the emulator.
18 * Please read docs/ANDROID-QEMUD.TXT to understand what this is about.
19 */
20
21/* initialize the qemud support code in the emulator
22 */
23
24extern void  android_qemud_init( void );
25
26/* return the character driver state object that needs to be connected to the
27 * emulated serial port where all multiplexed channels go through.
28 */
29extern CharDriverState*  android_qemud_get_cs( void );
30
31/* returns in '*pcs' a CharDriverState object that will be connected to
32 * a single client in the emulated system for a given named service.
33 *
34 * this is only used to connect GPS and GSM service clients to the
35 * implementation that requires a CharDriverState object for legacy
36 * reasons.
37 *
38 * returns 0 on success, or -1 in case of error
39 */
40extern int  android_qemud_get_channel( const char*  name, CharDriverState* *pcs );
41
42/* set an explicit CharDriverState object for a given qemud communication channel. this
43 * is used to attach the channel to an external char driver device (e.g. one
44 * created with "-serial <device>") directly.
45 *
46 * returns 0 on success, -1 on error
47 */
48extern int  android_qemud_set_channel( const char*  name, CharDriverState*  peer_cs );
49
50/* list of known qemud channel names */
51#define  ANDROID_QEMUD_GSM      "gsm"
52#define  ANDROID_QEMUD_GPS      "gps"
53#define  ANDROID_QEMUD_CONTROL  "control"
54#define  ANDROID_QEMUD_SENSORS  "sensors"
55
56/* A QemudService service is used to connect one or more clients to
57 * a given emulator facility. Only one client can be connected at any
58 * given time, but the connection can be closed periodically.
59 */
60
61typedef struct QemudClient   QemudClient;
62typedef struct QemudService  QemudService;
63
64
65/* A function that will be called when the client running in the emulated
66 * system has closed its connection to qemud.
67 */
68typedef void (*QemudClientClose)( void*  opaque );
69
70/* A function that will be called when the client sends a message to the
71 * service through qemud.
72 */
73typedef void (*QemudClientRecv) ( void*  opaque, uint8_t*  msg, int  msglen, QemudClient*  client );
74
75/* A function that will be called when the state of the client should be
76 * saved to a snapshot.
77 */
78typedef void (*QemudClientSave) ( QEMUFile*  f, QemudClient*  client, void*  opaque );
79
80/* A function that will be called when the state of the client should be
81 * restored from a snapshot.
82 */
83typedef int (*QemudClientLoad) ( QEMUFile*  f, QemudClient*  client, void*  opaque );
84
85/* Register a new client for a given service.
86 * 'clie_opaque' will be sent as the first argument to 'clie_recv' and 'clie_close'
87 * 'clie_recv' and 'clie_close' are both optional and may be NULL.
88 *
89 * You should typically use this function within a QemudServiceConnect callback
90 * (see below).
91 */
92extern QemudClient*  qemud_client_new( QemudService*     service,
93                                        int               channel_id,
94                                        void*             clie_opaque,
95                                        QemudClientRecv   clie_recv,
96                                        QemudClientClose  clie_close,
97                                        QemudClientSave   clie_save,
98                                        QemudClientLoad   clie_load );
99
100/* Enable framing on a given client channel.
101 */
102extern void           qemud_client_set_framing( QemudClient*  client, int  enabled );
103
104/* Send a message to a given qemud client
105 */
106extern void   qemud_client_send ( QemudClient*  client, const uint8_t*  msg, int  msglen );
107
108/* Force-close the connection to a given qemud client.
109 */
110extern void   qemud_client_close( QemudClient*  client );
111
112
113/* A function that will be called each time a new client in the emulated
114 * system tries to connect to a given qemud service. This should typically
115 * call qemud_client_new() to register a new client.
116 */
117typedef QemudClient*  (*QemudServiceConnect)( void*   opaque, QemudService*  service, int  channel );
118
119/* A function that will be called when the state of the service should be
120 * saved to a snapshot.
121 */
122typedef void (*QemudServiceSave) ( QEMUFile*  f, QemudService*  service, void*  opaque );
123
124/* A function that will be called when the state of the service should be
125 * restored from a snapshot.
126 */
127typedef int (*QemudServiceLoad) ( QEMUFile*  f, QemudService*  service, void*  opaque );
128
129/* Register a new qemud service.
130 * 'serv_opaque' is the first parameter to 'serv_connect'
131 */
132extern QemudService*  qemud_service_register( const char*          serviceName,
133                                              int                  max_clients,
134                                              void*                serv_opaque,
135                                              QemudServiceConnect  serv_connect,
136                                              QemudServiceSave     serv_save,
137                                              QemudServiceLoad     serv_load);
138
139/* Sends a message to all clients of a given service.
140 */
141extern void           qemud_service_broadcast( QemudService*   sv,
142                                               const uint8_t*  msg,
143                                               int             msglen );
144
145#endif /* _android_qemud_h */
146