⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lap.h

📁 MTK平台绝密核心代码之 外设管理(红外线)
💻 H
字号:
/*****************************************************************************
*  Copyright Statement:
*  --------------------
*  This software is protected by Copyright and the information contained
*  herein is confidential. The software may not be copied and the information
*  contained herein may not be used or disclosed except with the written
*  permission of MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/

/*****************************************************************************
 *
 * Filename:
 * ---------    
 *    LAP.H
 *
 * Project:
 * --------
 *   Maui_Software
 *
 * Description:
 * ------------
 *   This file is inended for IRDA LAP protocol
 *
 * Author:
 * -------
 * -------
 *
 *****************************************************************************/
/* secondary IrDA LAP protocol header file */
#ifndef __LAP_H__
#define __LAP_H__
#include "irconfig.h"

#define DEFAULT_CONNECTION_ADDRESS 0x56


/* disconnect reason codes passed to indication callback functions */

#define USER_REQUESTED		0x01
#define LOST_LAP_CON		   0x03
#define UNSPECIFIED_REASON	0xff

/* misc error codes */

#define MEDIA_IS_BUSY 1
#define CONTENTION_BAUD		9600
#define CONNECT_PARAMS_SIZE 22  
#define MAX_DECODE_FRAMES	30 /* max lap decode_q size */
#define MAX_LAP_WINDOWS		8  /* 7 + 1 */
#define I_FRAME_OVERHEAD 	8  /* frame overhead bytes for I frame */ 
#define MAXLAPDESC  		   6  /* max number of I frame descriptors */
#define MAX_WINDOW_SIZE 	1  /* max number of I frames transmitted without ack */

				/* make it on a 4 byte boundary */
#define FBUF_HEAD 		((sizeof(FBUF)+3)&~3) 
#define LAP_HEAD		2
#define LAP_CRC			2 /* LAP CRC */
#define I_TX_PACKET_HEAD	2
#define I_RX_PACKET_HEAD	2
#define I_TX_PACKET_OFFSET	FBUF_HEAD+I_TX_PACKET_HEAD
#define I_RX_PACKET_OFFSET FBUF_HEAD+I_RX_PACKET_HEAD
/* start of I frame during tx ops */
#define I_TX_DATA_PACKET_OFFSET	I_TX_PACKET_OFFSET+2
#define I_RX_OPCODE_OFFSET	FBUF_HEAD+I_RX_PACKET_HEAD+2
#define BSIZE 			(IRLAP_FRAME_SIZE+FBUF_HEAD) 

/* descriptor struct */

typedef struct fbuf{
    struct fbuf  * next;	/* ptr to next frame */
    kal_int16 size;			/* current known size of frame */
    kal_uint8 type;			/* frame type: data, control,... */ 
    kal_uint8 stat;	     		/* current frame state */
} FBUF;

struct DECODE_Q{		
	FBUF  * frame[MAX_DECODE_FRAMES];
	kal_uint8  head;
	kal_uint8  tail;
};

struct LAP_REQUEST_Q{		
	FBUF  * frame[MAX_REQUEST];
	kal_uint8  head;
	kal_uint8  tail;
};

struct CTRL_BUFF_Q{		
	peer_buff_struct*  frame[MAX_TTP_FRAMES];
	kal_uint8  head;
	kal_uint8  tail;
};

struct REC_CTRL_BUFF_Q{		
	FBUF *  frame[MAX_REC_TTP];
	kal_uint8  head;
	kal_uint8  tail;
};

/* frames states */
#define B_ALLOC 	0x55
#define B_FREE  	0xaa

#define PRIMARY     	1
#define SECONDARY   	2
#define PEER   		3

/*These are used to detect S/U/I frame in lap*/
#define S_FRAME_HEAD  1
#define U_FRAME_HEAD  3
#define I_FRAME_HEAD  0


/* primary irlap COMMANDs sent to secondarys*/
#define SNRM_COMMAND  0x93
#define DISC_COMMAND  0x53
#define UI_COMMAND    0x13
#define XID_COMMAND   0x3f
#define TEST_COMMAND  0xf3
#define RR_COMMAND    0x11 /* p bit set */
#define I_COMMAND     0x01 

/* COMMAND and RESPONSE for UI data */
#define UI_COMRES     0x03

/* s commands */
#define RNR_COMMAND   0x15 /* p bit set */
#define REJ_COMMAND   0x19 /* p bit set */
#define SREJ_COMMAND  0x1d /* p bit set */

/* primary irlap COMMANDs */
/* secondary irlap COMMANDs sent to primaries*/
#define RNRM_RESPONSE  0x93
#define UA_RESPONSE    0x73
#define FRMR_RESPONSE  0x97
#define DM_RESPONSE    0x1f
#define RD_RESPONSE    0x53
#define UI_RESPONSE    0x13
#define XID_RESPONSE   0xbf
#define TEST_RESPONSE  0xf3

/* s response */
#define RNR_RESPONSE   0x15 /* f bit set */
#define RR_RESPONSE    0x11 /* f bit set */
#define REJ_RESPONSE   0x19 /* f bit set */
#define SREJ_RESPONSE  0x1d /* f bit set */

/* timeouts */

/* indications */
#define CONNECTION_INDICATION 	1 
#define CONNECT_CONFIRM 	      2
#define DISCONNECT_INDICATION 	10 

/* buffer types */
#define  NO_TYPE			   0  /* raw untyped frame */ 
#define  I_FRAME_TYPE		1  /* I frame to be transmitted */ 
#define  RX_DATA_TYPE 		2  /* received I frame */
#define  CONTROL_TYPE 		3  /* control frame */
#define	LRQ_TYPE		      4  /* lm_rx_q */
#define	LOQ_TYPE		      5  /* lm_out_q */
#define	DCQ_TYPE		      6  /* rx decode q */
#define	WAC_TYPE		      7  /* waq queue */
#define	TX_TYPE			   8  /* tx queue */
#define	RXDECODE_TYPE		9  /* rx decoding q */
#define TEST_FRAME_TYPE		10 /* test frame */
#define	RX_TYPE			   11 /* rx framer */
#define	IAS_P_TYPE		   12 /* IAS data frame */
#define	USER_TYPE		   13 /* User defined buffer */

#define CONN_ADDRESS_OFFSET 	10
#define DEST_ADDRESS_OFFSET 	2 
#define DEFAULT_WINDOW_SIZE 	1

#define CONTENTION_BOFS		11
#define IRLAP_VERSION 		0 /* current version number for irlap protocol */
#define DISCOVERY_FLAGS_OFFSET 	11 /* offset to disc. flag in frame */

/* LAP states */
/* link init states */
#define IRLAP_OFFLINE	10
#define IRLAP_ONLINE		11

/* states */
#define IRLAP_NDM		   20
#define IRLAP_QUERY		21
#define IRLAP_REPLY		22
#define IRLAP_CONN		23
#define IRLAP_NRMS		24
#define IRLAP_SCLOSE		25
#define IRLAP_SETUP		26
#define IRLAP_NRMP		27
#define IRLAP_XMIT		28
#define IRLAP_PCLOSE		29

/* Change LAP Primary to Secondary*/

#define ENABLE_PRIMARY_STACK()		stack=1		
#define ENABLE_SECONDARY_STACK()	   stack=0		

#define LINK_DISCONNECT_CALLBACK(reason) { LAP_discon_code=reason; LAP_user_disconnect_cb(); }
#define REMOTE_IS_BUSY()  remote_busy==1
#define REMOTE_IS_FREE()  remote_busy==0


#define SET_CONNECT_CONFIRM()         irp_connect=CONNECT_CONFIRM
#define IRLAP_CONNECT_CONFIRM()       irp_connect == CONNECT_CONFIRM
#define IRLAP_CONNECT_INDICATION()    irp_connect == CONNECTION_INDICATION
#define IRLAP_DISCONNECT_INDICATION() irp_connect == DISCONNECT_INDICATION

#define INIT_Q( q_name,maxsize ) \
	{ kal_uint8 v_init_q; \
	   for(v_init_q=0;v_init_q<maxsize;v_init_q++) \
        	q_name.frame[v_init_q]=0; \
	   q_name.head=q_name.tail=0; \
	}

/*Queue function*/
#define FRAME_IN_QUEUE(q_name) (q_name.tail!=q_name.head)

#define QUEUE_FULL(q_name,maxsize) (((q_name.head+1)%maxsize)==q_name.tail)

#define QUEUE_ADD(q_name,ptr,maxsize) \
        ASSERT(!QUEUE_FULL(q_name,maxsize)); \
        q_name.frame[q_name.head]=ptr; \
        q_name.head=(q_name.head+1)%maxsize; 

#define QUEUE_REMOVE(q_name,ptr,maxsize) \
        ptr=q_name.frame[q_name.tail]; \
        q_name.frame[q_name.tail]=0;\
        q_name.tail=(q_name.tail+1)%maxsize; 

#define QUEUE_PEAK(q_name,ptr) \
        ptr=q_name.frame[q_name.tail];
        
#define QUEUE_FLUSH( q_name, maxsize ) \
	while (q_name.tail != q_name.head){ \
	   if(q_name.frame[q_name.tail]->stat==B_ALLOC) \
		Freebuf(q_name.frame[q_name.tail]); \
        	q_name.tail=(q_name.tail+1)%maxsize; \
	}

#define QUEUE_AVAIL( q_name, number, maxsize ) \
	   if(q_name.head>=q_name.tail) \
	   	number=q_name.head-q_name.tail; \
	   else \
	   	number=maxsize-q_name.tail+q_name.head; \

#define ADD_TO_FRONT_OF_QUEUE(q_name,ptr,maxsize) \
        if (q_name.tail==0 ) \
        	q_name.tail=maxsize-1; \
	else \
        	q_name.tail--; \
        q_name.frame[q_name.tail]=ptr; 

#define FLUSH_ALL() \
	QUEUE_FLUSH(lap_request_q,MAX_REQUEST); \
	QUEUE_FLUSH(decode_q,MAX_DECODE_FRAMES); \
	if (unacked_frame){ \
		Freebuf((FBUF*)(unacked_frame)); \
		unacked_frame=0; \
	}


                      
/*Timer */

#define START_WD_TIMER()   stack_start_timer(&irda_context.wd_timer, WD_TIMER_INDEX, 500);
#define STOP_WD_TIMER()    stack_stop_timer(&irda_context.wd_timer);
#define START_F_TIMER()    stack_start_timer(&irda_context.f_timer, F_TIMER_INDEX, 100);
#define STOP_F_TIMER()     stack_stop_timer(&irda_context.f_timer);
#define START_P_TIMER()    Do_quick_p_timer(); //stack_start_timer(&irda_context.p_timer, P_TIMER_INDEX, (p_timeout>>2));
#define STOP_P_TIMER()     stack_stop_timer(&irda_context.p_timer);
#define START_SLOT_TIMER() stack_start_timer(&irda_context.slot_timer, SLOT_TIMER_INDEX, 20);
#define STOP_SLOT_TIMER()  stack_stop_timer(&irda_context.slot_timer);
#define START_MEDIA_BUSY_TIMER()  stack_start_timer(&irda_context.media_timer, MEDIA_TIMER_INDEX, 100);
#define STOP_MEDIA_BUSY_TIMER()   stack_stop_timer(&irda_context.media_timer);


#define INVALID_NR()  ( ( (Nr==Vs)||((unacked_frame!=0)&&(Nr==As)) )? 0 : 1 ) 
#define INVALID_NR7() ( (Nr==Vs)? 0 : 1 ) 
#define SEND_S_COMMAND()  Send_S_Packet(1)
#define SEND_S_RESPONSE() Send_S_Packet(0)

/* typedefs */
typedef struct log {
	kal_uint32 addr;
	kal_uint8  conflict;
	kal_uint8 info[23];
} LOG;

/*Function*/
extern void Cleanbufs( void );
extern void Do_quick_p_timer ( void );
extern void LAP_user_disconnect_cb( void );
extern void LAP_disconnect_reset ( kal_uint8 reason );

extern kal_uint8  Do_XID_response ( FBUF  * frame );
extern kal_uint8 IrLAP_LINK_init( void );
extern void Display_lap_status (void);
extern FBUF  * Getbuf ( void );
extern void Freebuf ( FBUF  * buf );
extern FBUF  * IR_Getbuf ( void );
extern void IR_Freebuf ( FBUF  * buf );
extern void InitBuf ( void );
extern void Check_WD_Timer ( void );
extern void Init_connection_state( kal_uint8 state );
extern void   Set_default     ( void );
extern kal_uint8  IRLAP_frame_decode ( FBUF  * frame );
extern void   Send_NRM_Response( void );
extern void   Send_NRM_Response( void );
extern FBUF  * Format_packet ( kal_uint8 cr,kal_uint8 type);
extern void   Do_s_frame_p ( kal_uint8  * frame );
extern void   Do_u_frame_p ( kal_uint8  * frame );
extern void   Do_i_frame_p ( FBUF  * frame );
extern void   Do_s_frame_s ( kal_uint8  * frame );
extern void   Do_u_frame_s ( kal_uint8  * frame );
extern void   Do_i_frame_s ( FBUF  * frame );
extern void   Apply_default_connection_params( void );
extern void   WD_timer_expired (void );
extern kal_uint8 * GetIbuf( void );
extern kal_uint8 IrLAP_DATA_request ( FBUF  * buf );
extern void  IrLAP_CONNECT_response ( kal_uint8  * frame  );
extern void  IrLAP_DISCONNECT_request_p( void );
extern void  IrLAP_DISCONNECT_request_s( void );
extern kal_uint8 IrLAP_DISCOVERY_request ( void );
extern LOG * IrLAP_DISCOVERY_confirm( void );
extern kal_uint8 IrLAP_CONNECT_request ( kal_uint32 dev_addr );
extern void  IrLAP_DISCONNECT_request (  void );
extern void   Test_primary_query_status ( void );
extern void   Log_response_info( kal_uint8 * frame );
extern void   Clear_log( void );
extern void   Generate_rand_connadr( void );
extern void   Apply_connection_params( kal_uint8 * frame );
extern void   Send_NRM_Command ( void );
extern void   Send_S_Packet( kal_uint8 type );
extern void   Process_Nr ( void );
extern void   Check_P_Timer ( void );
extern void   Check_F_Timer ( void );
extern void IrLAP_I_frame_timer_enable(kal_bool enable);
extern void IrLAP_I_frame_timeout(void );
extern FBUF   * Format_I_Packet ( kal_uint8 cr, 
			kal_uint8 pf, 
			FBUF  * frame, 
			kal_uint16 size );
extern FBUF  * Format_T_packet ( kal_uint8 addr, 
			 kal_uint8 cr,
			 FBUF  * dframe, 
			 kal_uint8 flag );
extern void IrDA_Task(void);

/*call from isrentry.c*/
extern kal_uint32 random32(void);			 
#endif

⌨️ 快捷键说明

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