summaryrefslogtreecommitdiff
path: root/xpp/xproto.h
diff options
context:
space:
mode:
Diffstat (limited to 'xpp/xproto.h')
-rw-r--r--xpp/xproto.h83
1 files changed, 71 insertions, 12 deletions
diff --git a/xpp/xproto.h b/xpp/xproto.h
index 7255e09..377c06e 100644
--- a/xpp/xproto.h
+++ b/xpp/xproto.h
@@ -26,6 +26,7 @@
#ifdef __KERNEL__
#include <linux/list.h>
+#include <linux/proc_fs.h>
#include <zaptel.h>
#endif
@@ -38,6 +39,8 @@
*/
#define XPD_TYPE_FXS 3 // TO_PHONE
#define XPD_TYPE_FXO 4 // TO_PSTN
+#define XPD_TYPE_BRI_TE 6 // TO_PSTN
+#define XPD_TYPE_BRI_NT 7 // TO_PHONE
#define XPD_TYPE_NOMODULE 15
typedef byte xpd_type_t;
@@ -52,6 +55,7 @@ typedef byte xpd_type_t;
typedef struct xpd_addr {
byte unit:UNIT_BITS;
byte subunit:SUBUNIT_BITS;
+ byte reserved:(8-UNIT_BITS-SUBUNIT_BITS);
} PACKED xpd_addr_t;
bool valid_xpd_addr(const xpd_addr_t *addr);
@@ -100,15 +104,16 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num);
#define PACKET_LEN(p) \
((p)->datalen + sizeof(xpd_addr_t) + 1)
-#define XENTRY(card,op) \
- [ XPROTO_NAME(card,op) ] = { \
- .handler = XPROTO_HANDLER(card,op), \
- .datalen = RPACKET_DATALEN(card,op), \
+#define XENTRY(prototab,module,op) \
+ [ XPROTO_NAME(module,op) ] = { \
+ .handler = XPROTO_HANDLER(module,op), \
+ .datalen = RPACKET_DATALEN(module,op), \
.name = #op, \
- .table = &PROTO_TABLE(card) \
+ .table = &PROTO_TABLE(prototab) \
}
+
#define XPACKET_INIT(p, card, op) \
do { \
p->content.opcode = XPROTO_NAME(card,op); \
@@ -124,6 +129,57 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num);
xpd_set_addr(&p->content.addr, to); \
} while(0);
+/*--------------------------- register handling --------------------------------*/
+/*
+ * After the opcode, there are always:
+ * * A size (in bytes) of the rest. Only 6 bits are counted:
+ * - The MSB signifies a multibyte write (to BRI fifo)
+ * - The MSB-1 signifies end of frame to multibyte writes in BRI.
+ * A normal register command (not multibyte) than contains:
+ * * A channel selector byte:
+ * - ALL_CHANS (currently 31) is a broadcast request to set a
+ * register for all channels.
+ * - Smaller numbers (0-30) represent the addressed channel number.
+ * - The MSB signifies:
+ * 1 - register [R]ead request
+ * 0 - register [W]rite request
+ * * Register number
+ * * Subregister number -- 0 when there is no subregister
+ * * Data low
+ * * Data high -- 0 for single byte registers (direct registers)
+ * A multibyte register command than contains a sequence of bytes.
+ */
+
+#define MULTIBYTE_MAX_LEN 5 /* FPGA firmware limitation */
+
+typedef struct reg_cmd {
+ byte bytes:6;
+ byte eoframe:1; /* For BRI -- end of frame */
+ byte multibyte:1; /* For BRI -- fifo data */
+ union {
+ struct {
+ byte chipsel:CHAN_BITS; /* chip select */
+ byte reserved:1;
+ byte do_subreg:1;
+ byte read_request:1;
+ byte regnum;
+ byte subreg;
+ byte data_low;
+ byte data_high;
+ } PACKED r;
+ /* For Write-Multibyte commands in BRI */
+ struct {
+ byte xdata[MULTIBYTE_MAX_LEN];
+ } PACKED d;
+ } PACKED alt;
+} PACKED reg_cmd_t;
+
+/* Shortcut access macros */
+#define REG_FIELD(regptr,member) ((regptr)->alt.r.member)
+#define REG_XDATA(regptr) ((regptr)->alt.d.xdata)
+
+/*--------------------------- protocol tables ----------------------------------*/
+
typedef struct xproto_entry xproto_entry_t;
typedef struct xproto_table xproto_table_t;
@@ -157,9 +213,9 @@ struct xops {
int (*SYNC_SOURCE)(xbus_t *xbus, xpd_t *xpd, bool setit, bool is_master);
int (*PCM_WRITE)(xbus_t *xbus, xpd_t *xpd, xpp_line_t offhook, volatile byte *buf);
- int (*CHAN_ENABLE)(xbus_t *xbus, xpd_t *xpd, xpp_line_t lines, bool on);
- int (*CHAN_CID)(xbus_t *xbus, xpd_t *xpd, int pos);
- int (*RING)(xbus_t *xbus, xpd_t *xpd, int pos, bool on);
+ int (*XPD_STATE)(xbus_t *xbus, xpd_t *xpd, bool on);
+ int (*CHAN_CID)(xbus_t *xbus, xpd_t *xpd, lineno_t chan);
+ int (*RING)(xbus_t *xbus, xpd_t *xpd, lineno_t chan, bool on);
int (*RELAY_OUT)(xbus_t *xbus, xpd_t *xpd, byte which, bool on);
};
@@ -177,7 +233,7 @@ struct xproto_table {
xpd_type_t type;
const char *name;
bool (*packet_is_valid)(xpacket_t *pack);
- void (*packet_dump)(xpacket_t *pack);
+ void (*packet_dump)(const char *msg, xpacket_t *pack);
};
#include "card_global.h"
@@ -188,12 +244,15 @@ enum opcodes {
XPROTO_NAME(GLOBAL, NULL_REPLY) = 0xFE,
XPROTO_NAME(GLOBAL, DESC_REQ) = 0x04,
XPROTO_NAME(GLOBAL, DEV_DESC) = 0x05,
+ XPROTO_NAME(GLOBAL, REGISTER_REQUEST) = 0x0F,
/**/
XPROTO_NAME(GLOBAL, PCM_WRITE) = 0x11,
XPROTO_NAME(GLOBAL, PCM_READ) = 0x12,
/**/
XPROTO_NAME(GLOBAL, SYNC_SOURCE) = 0x19,
XPROTO_NAME(GLOBAL, SYNC_REPLY) = 0x1A,
+/**/
+ XPROTO_NAME(GLOBAL, ERROR_CODE) = 0x22,
};
@@ -209,14 +268,13 @@ struct xpacket_raw {
MEMBER(GLOBAL, PCM_WRITE);
MEMBER(GLOBAL, PCM_READ);
MEMBER(GLOBAL, SYNC_REPLY);
+ MEMBER(GLOBAL, ERROR_CODE);
MEMBER(FXS, SIG_CHANGED);
- MEMBER(FXS, SLIC_REPLY);
- MEMBER(FXS, SLIC_WRITE);
+ MEMBER(FXS, REGISTER_REPLY);
MEMBER(FXO, SIG_CHANGED);
MEMBER(FXO, DAA_REPLY);
- MEMBER(FXO, DAA_WRITE);
byte data[0];
};
@@ -230,6 +288,7 @@ struct xpacket {
};
void dump_packet(const char *msg, xpacket_t *packet, bool print_dbg);
+void dump_reg_cmd(const char msg[], reg_cmd_t *regcmd);
int packet_receive(xbus_t *xbus, xpacket_t *pack);
int xproto_register(const xproto_table_t *proto_table);
void xproto_unregister(const xproto_table_t *proto_table);