From d8bdfe8d82cf7c57b2a4061fc03b6e0a863064e1 Mon Sep 17 00:00:00 2001 From: tzafrir Date: Tue, 28 Nov 2006 13:36:03 +0000 Subject: r1557@boole: tzafrir | 2006-11-06 20:12:16 +0200 Merging xpp driver release 1.2 (rev. 2569), originally team/tzafrir/xpp_1.2 * Should build well. Almost final. * genzaptelconf: Also work when zap_autoreg=0 * README.Astribank updated for rev. 1.2. * xpp/utils/Makefile: Use $< with cc -c * Get xpp/utils configuration from autoconf (without changesin top dir) git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.2@1648 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- xpp/xproto.h | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 71 insertions(+), 12 deletions(-) (limited to 'xpp/xproto.h') 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 +#include #include #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); -- cgit v1.2.3