1*99c2aa15SArnd Bergmann /* 2*99c2aa15SArnd Bergmann * hdlc.h -- General purpose ISDN HDLC decoder. 3*99c2aa15SArnd Bergmann * 4*99c2aa15SArnd Bergmann * Implementation of a HDLC decoder/encoder in software. 5*99c2aa15SArnd Bergmann * Necessary because some ISDN devices don't have HDLC 6*99c2aa15SArnd Bergmann * controllers. 7*99c2aa15SArnd Bergmann * 8*99c2aa15SArnd Bergmann * Copyright (C) 9*99c2aa15SArnd Bergmann * 2009 Karsten Keil <keil@b1-systems.de> 10*99c2aa15SArnd Bergmann * 2002 Wolfgang Mües <wolfgang@iksw-muees.de> 11*99c2aa15SArnd Bergmann * 2001 Frode Isaksen <fisaksen@bewan.com> 12*99c2aa15SArnd Bergmann * 2001 Kai Germaschewski <kai.germaschewski@gmx.de> 13*99c2aa15SArnd Bergmann * 14*99c2aa15SArnd Bergmann * This program is free software; you can redistribute it and/or modify 15*99c2aa15SArnd Bergmann * it under the terms of the GNU General Public License as published by 16*99c2aa15SArnd Bergmann * the Free Software Foundation; either version 2 of the License, or 17*99c2aa15SArnd Bergmann * (at your option) any later version. 18*99c2aa15SArnd Bergmann * 19*99c2aa15SArnd Bergmann * This program is distributed in the hope that it will be useful, 20*99c2aa15SArnd Bergmann * but WITHOUT ANY WARRANTY; without even the implied warranty of 21*99c2aa15SArnd Bergmann * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22*99c2aa15SArnd Bergmann * GNU General Public License for more details. 23*99c2aa15SArnd Bergmann * 24*99c2aa15SArnd Bergmann * You should have received a copy of the GNU General Public License 25*99c2aa15SArnd Bergmann * along with this program; if not, write to the Free Software 26*99c2aa15SArnd Bergmann * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 27*99c2aa15SArnd Bergmann */ 28*99c2aa15SArnd Bergmann 29*99c2aa15SArnd Bergmann #ifndef __ISDNHDLC_H__ 30*99c2aa15SArnd Bergmann #define __ISDNHDLC_H__ 31*99c2aa15SArnd Bergmann 32*99c2aa15SArnd Bergmann struct isdnhdlc_vars { 33*99c2aa15SArnd Bergmann int bit_shift; 34*99c2aa15SArnd Bergmann int hdlc_bits1; 35*99c2aa15SArnd Bergmann int data_bits; 36*99c2aa15SArnd Bergmann int ffbit_shift; /* encoding only */ 37*99c2aa15SArnd Bergmann int state; 38*99c2aa15SArnd Bergmann int dstpos; 39*99c2aa15SArnd Bergmann 40*99c2aa15SArnd Bergmann u16 crc; 41*99c2aa15SArnd Bergmann 42*99c2aa15SArnd Bergmann u8 cbin; 43*99c2aa15SArnd Bergmann u8 shift_reg; 44*99c2aa15SArnd Bergmann u8 ffvalue; 45*99c2aa15SArnd Bergmann 46*99c2aa15SArnd Bergmann /* set if transferring data */ 47*99c2aa15SArnd Bergmann u32 data_received:1; 48*99c2aa15SArnd Bergmann /* set if D channel (send idle instead of flags) */ 49*99c2aa15SArnd Bergmann u32 dchannel:1; 50*99c2aa15SArnd Bergmann /* set if 56K adaptation */ 51*99c2aa15SArnd Bergmann u32 do_adapt56:1; 52*99c2aa15SArnd Bergmann /* set if in closing phase (need to send CRC + flag) */ 53*99c2aa15SArnd Bergmann u32 do_closing:1; 54*99c2aa15SArnd Bergmann /* set if data is bitreverse */ 55*99c2aa15SArnd Bergmann u32 do_bitreverse:1; 56*99c2aa15SArnd Bergmann }; 57*99c2aa15SArnd Bergmann 58*99c2aa15SArnd Bergmann /* Feature Flags */ 59*99c2aa15SArnd Bergmann #define HDLC_56KBIT 0x01 60*99c2aa15SArnd Bergmann #define HDLC_DCHANNEL 0x02 61*99c2aa15SArnd Bergmann #define HDLC_BITREVERSE 0x04 62*99c2aa15SArnd Bergmann 63*99c2aa15SArnd Bergmann /* 64*99c2aa15SArnd Bergmann The return value from isdnhdlc_decode is 65*99c2aa15SArnd Bergmann the frame length, 0 if no complete frame was decoded, 66*99c2aa15SArnd Bergmann or a negative error number 67*99c2aa15SArnd Bergmann */ 68*99c2aa15SArnd Bergmann #define HDLC_FRAMING_ERROR 1 69*99c2aa15SArnd Bergmann #define HDLC_CRC_ERROR 2 70*99c2aa15SArnd Bergmann #define HDLC_LENGTH_ERROR 3 71*99c2aa15SArnd Bergmann 72*99c2aa15SArnd Bergmann extern void isdnhdlc_rcv_init(struct isdnhdlc_vars *hdlc, u32 features); 73*99c2aa15SArnd Bergmann 74*99c2aa15SArnd Bergmann extern int isdnhdlc_decode(struct isdnhdlc_vars *hdlc, const u8 *src, 75*99c2aa15SArnd Bergmann int slen, int *count, u8 *dst, int dsize); 76*99c2aa15SArnd Bergmann 77*99c2aa15SArnd Bergmann extern void isdnhdlc_out_init(struct isdnhdlc_vars *hdlc, u32 features); 78*99c2aa15SArnd Bergmann 79*99c2aa15SArnd Bergmann extern int isdnhdlc_encode(struct isdnhdlc_vars *hdlc, const u8 *src, 80*99c2aa15SArnd Bergmann u16 slen, int *count, u8 *dst, int dsize); 81*99c2aa15SArnd Bergmann 82*99c2aa15SArnd Bergmann #endif /* __ISDNHDLC_H__ */ 83