tpam_crcpc.c

来自「优龙2410linux2.6.8内核源代码」· C语言 代码 · 共 163 行

C
163
字号
/* $Id: tpam_crcpc.c,v 1.1.2.2 2001/09/23 22:25:03 kai Exp $ * * Turbo PAM ISDN driver for Linux. (Kernel Driver - CRC encoding) * * Copyright 1998-2000 AUVERTECH T閘閏om * Copyright 2001 Stelian Pop <stelian.pop@fr.alcove.com>, Alc魐e * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. * * For all support questions please contact: <support@auvertech.fr> * *//*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Module Name:    crcpc.cAbstract:    Modem HDLC coding    Software HDLC coding / decodingRevision History:---------------------------------------------------------------------------*/#include <linux/crc-ccitt.h>#include "tpam.h"#define  HDLC_CTRL_CHAR_CMPL_MASK	0x20	/* HDLC control character complement mask */#define  HDLC_FLAG			0x7E	/* HDLC flag */#define  HDLC_CTRL_ESC			0x7D	/* HDLC control escapr character */#define  HDLC_LIKE_FCS_INIT_VAL		0xFFFF	/* FCS initial value (0xFFFF for new equipment or 0) */#define  HDLC_FCS_OK			0xF0B8	/* This value is the only valid value of FCS */#define TRUE	1#define FALSE	0static u8 ap_t_ctrl_char_complemented[256]; /* list of characters to complement */static void ap_hdlc_like_ctrl_char_list (u32 ctrl_char) {	int i;	for (i = 0; i < 256; ++i)		ap_t_ctrl_char_complemented[i] = FALSE;	for (i = 0; i < 32; ++i)		if ((ctrl_char >> i) & 0x0001)			ap_t_ctrl_char_complemented [i] = TRUE;	ap_t_ctrl_char_complemented[HDLC_FLAG] = TRUE;	ap_t_ctrl_char_complemented[HDLC_CTRL_ESC] = TRUE;		}void init_CRC(void) {	ap_hdlc_like_ctrl_char_list(0xffffffff);}void hdlc_encode_modem(u8 *buffer_in, u32 lng_in,		       u8 *buffer_out, u32 *lng_out) {	u16 fcs;	register u8 data;	register u8 *p_data_out = buffer_out;	fcs = HDLC_LIKE_FCS_INIT_VAL;	/*	 *   Insert HDLC flag at the beginning of the frame	 */	*p_data_out++ = HDLC_FLAG;#define ESCAPE_CHAR(data_out, data) \	if (ap_t_ctrl_char_complemented[data]) { \		*data_out++ = HDLC_CTRL_ESC; \		*data_out++ = data ^ 0x20; \	} \	else \		*data_out++ = data;	while (lng_in--) {		data = *buffer_in++;		/*		 *   FCS calculation		 */		fcs = crc_ccitt_byte(fcs, data);		ESCAPE_CHAR(p_data_out, data);	}	/*	 *  Add FCS and closing flag	 */	fcs ^= 0xFFFF;  // Complement	data = (u8)(fcs & 0xff);	/* LSB */	ESCAPE_CHAR(p_data_out, data);	data = (u8)((fcs >> 8));	/* MSB */	ESCAPE_CHAR(p_data_out, data);#undef ESCAPE_CHAR	*p_data_out++ = HDLC_FLAG;	*lng_out = (u32)(p_data_out - buffer_out);}void hdlc_no_accm_encode(u8 *buffer_in, u32 lng_in, 			 u8 *buffer_out, u32 *lng_out) {	u16 fcs;	register u8 data;	register u8 *p_data_out = buffer_out;	/*	 *   Insert HDLC flag at the beginning of the frame	 */	fcs = HDLC_LIKE_FCS_INIT_VAL;	while (lng_in--) {		data = *buffer_in++;		/* calculate FCS */		fcs = crc_ccitt_byte(fcs, data);		*p_data_out++ = data;	}	/*	 *  Add FCS and closing flag	 */	fcs ^= 0xFFFF;  // Complement	data = (u8)(fcs);    	*p_data_out++ = data;	data =(u8)((fcs >> 8));   // revense MSB / LSB	*p_data_out++ = data; 	*lng_out = (u32)(p_data_out - buffer_out);}u32 hdlc_no_accm_decode(u8 *buffer_in, u32 lng_in) {	u16 fcs;	u32 lng = lng_in;	register u8 data;	/*	 *   Insert HDLC flag at the beginning of the frame	 */	fcs = HDLC_LIKE_FCS_INIT_VAL;	while (lng_in--) {		data = *buffer_in++;		/* calculate FCS */		fcs = crc_ccitt_byte(fcs, data);	}	if (fcs == HDLC_FCS_OK) 		return (lng-2);	else 		return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?