• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
24 extern 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  */
29 extern 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  */
40 extern 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  */
48 extern 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 
61 typedef struct QemudClient   QemudClient;
62 typedef 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  */
68 typedef 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  */
73 typedef void (*QemudClientRecv) ( void*  opaque, uint8_t*  msg, int  msglen, QemudClient*  client );
74 
75 /* Register a new client for a given service.
76  * 'clie_opaque' will be sent as the first argument to 'clie_recv' and 'clie_close'
77  * 'clie_recv' and 'clie_close' are both optional and may be NULL.
78  *
79  * You should typically use this function within a QemudServiceConnect callback
80  * (see below).
81  */
82 extern QemudClient*  qemud_client_new( QemudService*     service,
83                                        int               channel_id,
84                                        void*             clie_opaque,
85                                        QemudClientRecv   clie_recv,
86                                        QemudClientClose  clie_close );
87 
88 /* Enable framing on a given client channel.
89  */
90 extern void           qemud_client_set_framing( QemudClient*  client, int  enabled );
91 
92 /* Send a message to a given qemud client
93  */
94 extern void   qemud_client_send ( QemudClient*  client, const uint8_t*  msg, int  msglen );
95 
96 /* Force-close the connection to a given qemud client.
97  */
98 extern void   qemud_client_close( QemudClient*  client );
99 
100 
101 /* A function that will be called each time a new client in the emulated
102  * system tries to connect to a given qemud service. This should typically
103  * call qemud_client_new() to register a new client.
104  */
105 typedef QemudClient*  (*QemudServiceConnect)( void*   opaque, QemudService*  service, int  channel );
106 
107 /* Register a new qemud service.
108  * 'serv_opaque' is the first parameter to 'serv_connect'
109  */
110 extern QemudService*  qemud_service_register( const char*          serviceName,
111                                               int                  max_clients,
112                                               void*                serv_opaque,
113                                               QemudServiceConnect  serv_connect );
114 
115 /* Sends a message to all clients of a given service.
116  */
117 extern void           qemud_service_broadcast( QemudService*   sv,
118                                                const uint8_t*  msg,
119                                                int             msglen );
120 
121 #endif /* _android_qemud_h */
122