📄 ppp_framer.c
字号:
/*****************************************************************************
* 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:
* ---------
* ppp_framer.c
*
* Project:
* --------
* Maui_Software
*
* Description:
* ------------
* The PPP framer driver.
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
#include "kal_release.h"
#include "drv_comm.h"
#include "drvpdn.h"
#include "reg_base.h"
#include "intrCtrl.h"
#include "gpt_sw.h"
#if !defined(__L1_STANDALONE__) // for basic environment compiling happy
// add \ps\ppp\include into make\drv\drv.inc
#include "stack_common.h"
#include "stack_msgs.h"
#include "app_ltlcom.h" /* Task message communiction */
#include "syscomp_config.h"
#include "task_config.h" /* Task creation */
#include "stacklib.h" /* Basic type for dll, evshed, stacktimer */
#include "stack_timer.h" /* Stack timer */
#include "event_shed.h" /* Timer handler */
#include "gprs_flc_kal.h" /* Flow control */
/* trace and log */
#include "kal_trace.h"
#include "ppp_trc.h"
/* MCD */
#include "mcd_l3_inc_gprs_struct.h"
#include "l3_inc_local.h"
/* SAP & Enums */
#include "tcm2sm_struct.h"
#include "tcm2ppp_struct.h"
#include "ppp2tcm_struct.h"
#include "mmi_l3_enums.h"
#include "ppp_l4_enums.h"
#include "ppp2l4c_struct.h"
#include "l4c2ppp_struct.h"
/* PPP local include */
#include "ppp_types.h"
#include "ppp_buff_mgr.h"
#include "ppp_fsm.h"
#include "ppp_lcp.h"
#include "ppp_ipcp.h"
#include "ppp_main.h"
#include "ppp_statistic.h"
#include "ppp_read_in.h"
#include "ppp_write_out.h"
#include "ppp_framer.h"
void PFC_Initialize(void);
kal_bool ppp_frame_decode_hw(ppp_buff_head_struct *dst, ppp_buff_head_struct *src, ahdlc_state_struct *state, kal_uint8 id);
kal_bool ppp_frame_encode_hw(ppp_buff_head_struct *dst, ppp_buff_head_struct* src, ahdlc_state_struct* state, kal_uint8 id);
pfc_manage_stuct pfc_man;
#if defined(MT6228) || defined(MT6229) || defined(MT6230)
pfc_dcb_struct pfc_dcb;
#endif
// ppp framer management: only id = 0 will have the right to use hw ppp framer(MT6228)
/*************************************************************************
* FUNCTION
* ppp_frame_open
*
* DESCRIPTION
* This function is to get an id for further usage.
*
* PARAMETERS
* owner: owner of the ppp framer
*
* RETURNS
* id: return id to the caller
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint8 ppp_frame_open(pfc_owner_id_enum owner)
{
kal_uint8 id;
ENTER_CRITICAL();
for(id=0;id<PFC_MAX_ID;id++)
{
if((pfc_man.handler & (1<<id))== 0)
break;
}
if(id == PFC_MAX_ID)
ASSERT(0);
pfc_man.handler |= (1<<id);
EXIT_CRITICAL();
pfc_man.owner[id] = owner;
#if defined(MT6228) || defined(MT6229) || defined(MT6230)
if(pfc_dcb.gpt_handle == 0)
{
PFC_Initialize();
#if defined(MT6229) || defined(MT6230)
pfc_man.mutex = kal_create_sem("PFC_MUTEX",PFC_SEM_COUNT);
#endif
}
#endif
return id;
}
/*************************************************************************
* FUNCTION
* ppp_frame_close
*
* DESCRIPTION
* This function is release the ownership of ppp framer.
*
* PARAMETERS
* id: owner of the ppp framer to be released
*
* RETURNS
* none
*
* GLOBALS AFFECTED
*
*************************************************************************/
void ppp_frame_close(kal_uint32 id)
{
ENTER_CRITICAL();
pfc_man.handler &= ~(1<<id);
EXIT_CRITICAL();
}
/*************************************************************************
* FUNCTION
* ppp_frame_encode_all
*
* DESCRIPTION
* This function is to encode a ppp framer.
* The caller don't care which one shall use hw and which one shall use sw
*
* PARAMETERS
* id: owner of the ppp framer.
*
* RETURNS
* KAL_TRUE: a packet is encoded completely
* KAL_FALSE: a packet is not encoded completely
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_bool ppp_frame_encode_all(ppp_buff_head_struct *dst,
ppp_buff_head_struct* src, ahdlc_state_struct* state, kal_uint8 id)
{
kal_bool status;
#if defined(MT6228)
ASSERT(id & pfc_man.handler);
if(id == 0)
{
status = ppp_frame_encode_hw(dst, src, state, id);
}
else
{
status = ppp_frame_encode(dst, src, state);
}
#elif defined(MT6229)|| defined(MT6230)
kal_take_sem(pfc_man.mutex, KAL_INFINITE_WAIT);
pfc_man.active_id = id;
status = ppp_frame_encode_hw(dst, src, state, id);
kal_give_sem(pfc_man.mutex);
#else
status = ppp_frame_encode(dst, src, state);
#endif
return status;
}
/*************************************************************************
* FUNCTION
* ppp_frame_decode_all
*
* DESCRIPTION
* This function is to decode a ppp framer.
* The caller don't care which one shall use hw and which one shall use sw
*
* PARAMETERS
* id: owner of the ppp framer to be released
*
* RETURNS
* KAL_TRUE: a packet is encoded completely
* KAL_FALSE: a packet is not encoded completely
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_bool ppp_frame_decode_all(ppp_buff_head_struct *dst,
ppp_buff_head_struct *src, ahdlc_state_struct *state, kal_bool * is_ath ,kal_uint8 id)
{
kal_bool status;
#if defined(MT6228)
ASSERT(id & pfc_man.handler);
if(id == 0)
{
status = ppp_frame_decode_hw(dst, src, state,id);
}
else
{
status = ppp_frame_decode(dst, src, state, is_ath);
}
#elif defined(MT6229) || defined(MT6230)
kal_take_sem(pfc_man.mutex, KAL_INFINITE_WAIT);
pfc_man.active_id = id;
status = ppp_frame_decode_hw(dst, src, state, id);
kal_give_sem(pfc_man.mutex);
#else
status = ppp_frame_decode(dst, src, state,is_ath);
#endif
return status;
}
/*************************************************************************
* FUNCTION
* PFC_TimeOutHandler
*
* DESCRIPTION
* This function the timeout handler .
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void PFC_TimeOutHandler(void* param)
{
#if defined(MT6228) || defined(MT6229) || defined(MT6230)
//PFC_RESET();
DRVPDN_Enable(DRVPDN_CON0,DRVPDN_CON0_PFC,PDN_PFC);
pfc_dcb.is_timeout = KAL_TRUE;
kal_print("PFC Timeout!!\r\n");
#endif
}
#if defined(MT6228)
/*************************************************************************
* FUNCTION
* PFC_Reset
*
* DESCRIPTION
* This function is to reset the PFC.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
static void PFC_Reset(void)
{
PFC_DECODE_RESET();
PFC_ENCODE_RESET();
pfc_dcb.decode_state = PFC_DECODE_READY;
pfc_dcb.encode_state = PFC_ENCODE_READY;
pfc_dcb.state = PFC_READY_STATE;
}
/*************************************************************************
* FUNCTION
* PFC_RemoveEsc
*
* DESCRIPTION
* remove the escape characters
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
static kal_uint32 PFC_RemoveEsc(kal_uint8 *cp )
{
kal_uint32 i,esc_count;
kal_bool flag;
pfc_decode_cfg_struct *p = &pfc_dcb.decode_cfg;
kal_uint8 *dst, *index = p->daccm_index;
esc_count = 0;
if(p->daccm != p->daccm_pre)
{
p->daccm_pre = p->daccm;
for(i=0;i<32;i++)
{
if(p->daccm & (1<<i))
index[i]=1;
}
}
dst = cp;
// skip the first 0x7E
i = (pfc_dcb.decode_state == PFC_DECODE_READY && cp[0] == PFC_FLAG )?(1):(0);
dst += i;
for(;i<p->src_len;i++)
{
flag = KAL_FALSE;
if(cp[i] < 32)
{
if(index[cp[i]] == 1)
{
esc_count++;
flag = KAL_TRUE;
}
}
if(flag == KAL_FALSE)
{
*dst++ = cp[i];
if(cp[i] == PFC_FLAG)
{
i++;
break;
}
}
}
p->esc_count = esc_count;
return i;
}
/*************************************************************************
* FUNCTION
* PFC_DecodeStart
*
* DESCRIPTION
* This function is to decode a ppp frame
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
static kal_int32 PFC_DecodeStart(pfc_decode_cfg_struct *p)
{
kal_uint16 start;
kal_uint32 len2;
ASSERT(pfc_dcb.state == PFC_READY_STATE);
pfc_dcb.state = PFC_DECODE_STATE;
DRVPDN_Disable(DRVPDN_CON0,DRVPDN_CON0_PFC,PDN_PFC);
if(p->reset == KAL_TRUE)
PFC_DECODE_RESET();
DRV_WriteReg32(PFC_CON,(p->control));
if(p->dst != NULL)
{
DRV_WriteReg32(PFC_DST_SRC, p->dst);
DRV_WriteReg32(PFC_LEN,p->dst_len);
DRV_WriteReg32(PFC_START,PFC_START_DUPDEL);
DRV_WriteReg32(PFC_START,PFC_START_RESET_VALUE);
}
if(p->daccm != 0)
{
len2 = PFC_RemoveEsc((kal_uint8*)p->src);
kal_prompt_trace(MOD_PPP,"esc_count = %d",p->esc_count);
}
start = PFC_START_ENABLE;
//if(p->src != NULL)
{
DRV_WriteReg32(PFC_DST_SRC, p->src);
if(p->esc_count != 0)
DRV_WriteReg32(PFC_LEN,(len2-p->esc_count));
else
DRV_WriteReg32(PFC_LEN,(p->src_len));
start |= PFC_START_DUPSRL;
}
if(KAL_TRUE == p->df7e)
{
start |= PFC_START_DF7E;
}
if(KAL_TRUE == p->dset7e)
{
start |= PFC_START_DSET7E;
}
DRV_WriteReg32(PFC_START,start);
PFC_START_TIMER();
#if defined(PFC_USE_INT)
{
kal_uint32 flags;
kal_retrieve_eg_events(pfc_dcb.event,PFC_EVENT ,KAL_AND_CONSUME,&flags,KAL_SUSPEND);
}
#else
PFC_WAIT_COMPLETE();
#endif
PFC_STOP_TIMER();
DRV_WriteReg32(PFC_START,PFC_START_RESET_VALUE);
p->src = DRV_Reg32(PFC_DCSRC);
p->dst = DRV_Reg32(PFC_DCDES);
if(p->esc_count !=0)
p->src_len -= len2;
else
p->src_len = DRV_Reg(PFC_DUSLEN);
p->dst_len = DRV_Reg(PFC_DUWBLEN);
if(pfc_dcb.status == PFC_STAT_OK)
{
if (p->control & PFC_CON_DPFC)
p->protocol = DRV_Reg(PFC_DPTC)&0xff;
else
p->protocol = DRV_Reg(PFC_DPTC);
//kal_prompt_trace(MOD_PPP,"protocol =%x",p->protocol);
}
pfc_dcb.state = PFC_READY_STATE;
DRVPDN_Enable(DRVPDN_CON0,DRVPDN_CON0_PFC,PDN_PFC);
return (kal_int32)pfc_dcb.status;
}
/*************************************************************************
* FUNCTION
* PFC_EncodeStart
*
* DESCRIPTION
* This function is to start encode a ppp frame.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
static pfc_status_enum PFC_EncodeStart(pfc_encode_cfg_struct *p)
{
kal_uint16 start;
ASSERT(pfc_dcb.state == PFC_READY_STATE);
pfc_dcb.state = PFC_ENCODE_STATE;
DRVPDN_Disable(DRVPDN_CON0,DRVPDN_CON0_PFC,PDN_PFC);
//if(p->is_update)
{
DRV_WriteReg32(PFC_CON,p->control);
DRV_WriteReg32(PFC_EACCM,p->eaccm);
DRV_WriteReg32(PFC_EPTC,p->protocol);
}
start = PFC_START_ENABLE;
//if(p->dst != NULL)
{
DRV_WriteReg32(PFC_DST_SRC, p->dst);
DRV_WriteReg32(PFC_LEN,p->dst_len);
DRV_WriteReg32(PFC_START,PFC_START_EUPDEL);
DRV_WriteReg32(PFC_START,PFC_START_RESET_VALUE);
}
//if(p->src != NULL)
{
DRV_WriteReg32(PFC_DST_SRC, p->src);
DRV_WriteReg32(PFC_LEN,p->src_len);
start |= PFC_START_EUPSRL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -