📄 lap.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 + -