Reported by Trent Creekmore
[dahdi/tools.git] / xpp / mpptalk.h
1 #ifndef MPPTALK_H
2 #define MPPTALK_H
3 /*
4  * Written by Oron Peled <oron@actcom.co.il>
5  * Copyright (C) 2008, Xorcom
6  *
7  * All rights reserved.
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22  *
23  */
24
25 #ifdef __cplusplus
26 extern "C"
27 {
28 #endif /* __cplusplus */
29
30 /*
31  * MPPTALK - Example XTALK dialect
32  */
33
34 #include <xtalk/proto.h>
35 #include <xtalk/proto_sync.h>
36
37 #ifdef  __GNUC__
38 #define PACKED  __attribute__((packed))
39 #else
40 #define PACKED
41 #endif
42
43 /*---------------- Common types --------------------*/
44
45 /*
46  * The eeprom_table is common to all eeprom types.
47  */
48 #define LABEL_SIZE      8
49 struct eeprom_table {
50         uint8_t         source;         /* C0 - small eeprom, C2 - large eeprom */
51         uint16_t        vendor;
52         uint16_t        product;
53         uint16_t        release;        /* BCD encoded release */
54         uint8_t         config_byte;    /* Must be 0 */
55         uint8_t         label[LABEL_SIZE];
56 } PACKED;
57
58 #define VERSION_LEN     6
59 struct firmware_versions {
60         char    usb[VERSION_LEN];
61         char    fpga[VERSION_LEN];
62         char    eeprom[VERSION_LEN];
63 } PACKED;
64
65 struct capabilities {
66         uint8_t         ports_fxs;
67         uint8_t         ports_fxo;
68         uint8_t         ports_bri;
69         uint8_t         ports_pri;
70         uint8_t         extra_features; /* BIT(0) - TwinStar */
71         uint8_t         ports_echo;
72         uint8_t         reserved[2];
73         uint32_t        timestamp;
74 } PACKED;
75
76 #define CAP_EXTRA_TWINSTAR(c)           ((c)->extra_features & 0x01)
77 #define CAP_EXTRA_TWINSTAR_SET(c)       do {(c)->extra_features |= 0x01;} while (0)
78 #define CAP_EXTRA_TWINSTAR_CLR(c)       do {(c)->extra_features &= ~0x01;} while (0)
79
80 #define KEYSIZE 16
81 struct capkey {
82         uint8_t k[KEYSIZE];
83 } PACKED;
84
85 #define EXTRAINFO_SIZE  24
86 struct extrainfo {
87         char            text[EXTRAINFO_SIZE];
88 } PACKED;
89
90 struct mpp_header {
91         uint16_t        len;
92         uint16_t        seq;
93         uint8_t         op;     /* MSB: 0 - to device, 1 - from device */
94 } PACKED;
95
96 enum mpp_ser_op {
97         SER_CARD_INFO_GET       = 0x1,
98         SER_STAT_GET            = 0x3,
99 /* Status bits */
100 #define SER_STAT_WATCHDOG_READY(s)      ((s) & 0x01)
101 #define SER_STAT_XPD_ALIVE(s)           ((s) & 0x02)
102 };
103
104 /* EEPROM_QUERY: i2cs(ID1, ID0) */
105 enum eeprom_type {
106         EEPROM_TYPE_NONE        = 0,
107         EEPROM_TYPE_SMALL       = 1,
108         EEPROM_TYPE_LARGE       = 2,
109         EEPROM_TYPE_UNUSED      = 3,
110 };
111
112 enum dev_dest {
113         DEST_NONE       = 0x00,
114         DEST_FPGA       = 0x01,
115         DEST_EEPROM     = 0x02,
116 };
117
118
119 /*---------------- PROTOCOL ------------------------*/
120 /* API */
121 struct mpp_device;
122
123 struct mpp_device *mpp_new(struct xusb_iface *iface);
124 void mpp_delete(struct mpp_device *dev);
125 struct xusb_iface *xubs_iface_of_mpp(struct mpp_device *mpp);
126 int mpp_status_query(struct mpp_device *mpp_dev);
127
128 enum eeprom_type mpp_eeprom_type(struct mpp_device *mpp_dev);
129
130 void show_eeprom(const struct eeprom_table *eprm, FILE *fp);
131 void show_capabilities(const struct capabilities *capabilities, FILE *fp);
132 void show_astribank_status(struct mpp_device *mpp_dev, FILE *fp);
133 void show_extrainfo(const struct extrainfo *extrainfo, FILE *fp);
134 int twinstar_show(struct mpp_device *mpp, FILE *fp);
135 int show_hardware(struct mpp_device *mpp_dev);
136
137 int mpp_renumerate(struct mpp_device *mpp_dev);
138 int mpp_send_start(struct mpp_device *mpp_dev, int dest, const char *ihex_version);
139 int mpp_send_end(struct mpp_device *mpp_dev);
140 int mpp_send_seg(struct mpp_device *mpp_dev, const uint8_t *data, uint16_t offset, uint16_t len);
141 int mpp_reset(struct mpp_device *mpp_dev, int full_reset);
142
143 int mpp_caps_get(struct mpp_device *mpp_dev,
144         struct eeprom_table *eeprom_table,
145         struct capabilities *capabilities,
146         struct capkey *key);
147 int mpp_caps_set(struct mpp_device *mpp_dev,
148         const struct eeprom_table *eeprom_table,
149         const struct capabilities *capabilities,
150         const struct capkey *key);
151
152 /*
153  * serial sub-protocol to FPGA
154  */
155 int mpps_card_info(struct mpp_device *mpp, int unit, uint8_t *card_type, uint8_t *card_status);
156 int mpps_stat(struct mpp_device *mpp, int unit, uint8_t *maincard_version, uint8_t *status);
157
158 /*
159  * Twinstar
160  */
161 int mpp_tws_watchdog(struct mpp_device *mpp);
162 int mpp_tws_setwatchdog(struct mpp_device *mpp, int yes);
163 int mpp_tws_powerstate(struct mpp_device *mpp);
164 int mpp_tws_portnum(struct mpp_device *mpp);
165 int mpp_tws_setportnum(struct mpp_device *mpp, uint8_t portnum);
166
167 const char *dev_dest2str(int dest);
168
169 #ifdef __cplusplus
170 }
171 #endif /* __cplusplus */
172
173 #endif  /* MPPTALK_H */