📄 mn80main.c
字号:
#ifndef PM_ONPC
#ifdef __cplusplus
extern "C"{
#endif
#include "phs_def.h"
// #pragma section area m_data
#include "mn80.h"
#include "mn80ext.h"
#ifdef SIMU_ON_PC
#include <string.h>
#include "dbgtrace.h"
#endif
extern void RfInit(void);
// #pragma section code mp_code
#ifdef _ON_SANYO_
void Mn_SMain(void)
#else
void Mn_SMain(void* mbox)
#endif
{
U1* p;
MN_EVENTREC *pEvtTbl;
#ifndef _ON_SANYO_
memcpy ((void *) mn_syswork.in_evt, (const void *)(((EV_BUF_ST *)mbox)->event), sizeof (mn_syswork.in_evt));
#endif
non_stop |= NSTOP_MG;
#ifdef SIMU_ON_PC
// SendUart2L1( SIMTSKDTW , NSTP , 0 , &non_stop , 1); //Because L1 only set it ,and it's readed only in MN
#endif
Mn_InEvtCod[0] = (U1)SYS_WORK->in_evt[0];
//Debug By Chenwei
// if(0x82 == Mn_InEvtCod[0]) ProtocolTrace(2,"!!!Mn Recv Time out\n");
switch (Mn_InEvtCod[0])
{
case ECC: /* CC */
case EMM: /* MM */
case ERT: /* RT */
Mn_InEvtCod[1] = (U1)MN_IN_EVT(L3_MN_EVT)->pri_cod;
break;
case PM_MNG: /* UAP */
Mn_InEvtCod[1] = MN_IN_EVT(PM_MN_EVT)->msg_adr->msg[1];
#ifdef SIMU_ON_PC
if(Mn_InEvtCod[1] == 0x10)
ProtocolTrace(10,"!!!mn main received paging response %d %d \n",Mn_state.common_mod,Mn_InEvtCod[1]);
#endif
break;
default:
Mn_InEvtCod[1] = 0x00;
break;
}
/*根据状态得到事件*/
pEvtTbl = COMM_STATE[Mn_state.common_mod];
if(!Mn_SSchEvTbl(&pEvtTbl))/*执行事件对应函数*/
Mn_SSeparate(&pEvtTbl);/*在另一个状态表中取得事件,并且执行事件对应函数*/
p = Mn_GetSpecState(phs_mode);
if(NULL == p)
return;
if(((phs_mode == PHS_PUBLIC_STS) || (phs_mode == PHS_PRIVATE_STS)) &&
(!*p) &&
(non_stop & NSTOP_MG) &&
(SLEEP_STS[*p] == ON))
{
p = Mn_GetSpecState((BYTE)!phs_mode);
if(NULL == p)
return;
if(!*p)
{
slp_t_req(0xFFFF-4 , 0);
Sleep_Control(BSLPFORV);
#ifdef PROT_TEST
HisOut(0x00,0xfe,0x01,0x00,0x00);
#endif
}
}
}
/*************************************************************************************
FUNCTION: Mn_SSchEvTbl
DESCRIPTION:
MN Search event table to call the corresponding function
ARGUMENTS PASSED:
MN_EVENTREC** ppEvtTbl : The address of the pointer of the specified event table
Exten input : Mn_InEvtCod[2]
RETURN VALUE:
TRUE: Have found the Event or END, END
FALSE: Not found , set ppEvtTbl with next table pointer
Revision History:
Modification Tracking
Author Date Number Description of Changes
------------------------- ------------ ---------- ------------------------------
Chen Xiangli 08/22/2003 Initial version.
**************************************************************************************/
_BOOL Mn_SSchEvTbl(MN_EVENTREC** ppEvtTbl)
{
MN_EVENTREC *p;
for(p = *ppEvtTbl ; ; p++)
{
if((p->evt_code == Mn_InEvtCod[0]) &&
(p->pri_code == Mn_InEvtCod[1]))
{
p->Module();
break;
}
if(p->evt_code == END)
{
if(p->pri_code == SRCH)
{
*ppEvtTbl = (MN_EVENTREC*)p->Module;
return FALSE;
}
if(ReaVal == 0)
ReaVal = SEQERR;
if(Mn_InEvtCod[0] == PM_MNG)
{err_dsp( MN_IN_EVT(PM_MN_EVT)->msg_adr );}
else
{err_dsp((M_MSB*)0);}
//Modify By chenwei in 2003/9/19
break;
}
}
return TRUE;
}
/*************************************************************************************
FUNCTION: Mn_SSeparate
DESCRIPTION:
MN Process event Separatly
ARGUMENTS PASSED:
MN_EVENTREC** ppEvtTbl : The address of the pointer of the specified event table
Exten input : Mn_InEvtCod[2]
RETURN VALUE:
NONE
Revision History:
Modification Tracking
Author Date Number Description of Changes
------------------------- ------------ ---------- ------------------------------
Chen Xiangli 08/22/2003 Initial version.
**************************************************************************************/
void Mn_SSeparate(MN_EVENTREC** ppEvtTbl)
{
U1 *p;
switch (Mn_InEvtCod[0])
{
case TICCHSHT: //Timer event
case TICCHEST:
case TICCHMON:
case TICSYNC:
case TIACCALL:
case TIACLOC:
case TITC309P:
case TITCHFRE:
case TIHANDOV:
case TIRETRY:
case TIPAGE:
case TIWMONIT1 :
phs_mode = (U1) MN_IN_EVT(MN_TIMER_EVT)->tim_info[0];
break;
case PM_MNG:
phs_mode = NONE;
for (p = UAPOUT ; *p != END ; p++)
{
if ( *p != Mn_InEvtCod[1])
{
continue;
}
//searched
switch( MN_IN_EVT(PM_MN_EVT)->msg_adr->msg[0] & 0x0F )
{
case OPUBLIC :
phs_mode = PHS_PUBLIC_STS;
break;
default :
ReaVal = PRIERR;
err_dsp( MN_IN_EVT(PM_MN_EVT)->msg_adr ) ; //MN_IUAPBUFP);
return;
}
break;
}
if (phs_mode == NONE)
{
if (CallChanel == 0xFF)
{
ReaVal = SEQERR;
err_dsp( MN_IN_EVT(PM_MN_EVT)->msg_adr );
return;
}
phs_mode = CallChanel;
}
break;
case ERCHINFO:
case ESYSINFO:
case ESY2INFO:
case ESY3INFO:
case EPCH:
case ESCCH:
phs_mode = PHS_PUBLIC_STS;
break;
case ECCH_MON:
if (CCHInfo.Moni != 0xFF)
{
phs_mode = CCHInfo.Moni;
break;
}
case EPHDTDSP: /*L1->L3(L3C)->MNG*/
case EDLUDTDSP:
case EDLDTDSP:
case EDLDTRS:
case EDLSETRS:
case EDLSETDSP:
case EDLFREDSP:
case ETXOFF:
if (CallChanel != 0xFF)
{
phs_mode = CallChanel;
}
else
phs_mode = NONE;
break;
case ECC: /* CC */
case EMM: /* MM */
case ERT: /* RT */
default:
if (CallChanel != 0xFF)
{
phs_mode = CallChanel;
break;
}
phs_mode = NONE;
}
switch (phs_mode)
{
case PHS_PUBLIC_STS:
*ppEvtTbl = PUB_PRV_STATE[Mn_state.public_mod];
break;
default:
if (ReaVal == 0)
{
ReaVal = SEQERR;
}
err_dsp((M_MSB *)0);
return;
break;
}
if(!Mn_SSchEvTbl(ppEvtTbl))
Mn_SSchEvTbl(ppEvtTbl);
}
void Mn_PSNumMake(U1 start, U1 oct, U1 *psno , U1 mode)
{
U1 keta,
len,
i;
U2 base;
U1 ia5_psno[16];
keta = pm_bcd_to_ia5(start, oct, psno, ia5_psno);
len = ((keta > 4) ? 4 : keta);
PSNum[mode] = 0;
base = 1;
for ( i = 0; i < len; i++ )
{
PSNum[mode] += (ia5_psno[(keta-1) - i] - 0x30) * base;
base *= 10;
}
}
void Sleep_Pch_Select(void)
{
// U1 psno[7];
//Debug By Chenwei 2004-2
if(NPCH(phs_mode) == 0 || NGROUP(phs_mode) == 0)
{
#ifdef SIMU_ON_PC
ProtocolTrace(2,"!!!!!!!!!Sleep_pch_select err\n");
#endif
return ;
}
IncGroup[phs_mode] = PSNum[phs_mode] % (NPCH(phs_mode) * NGROUP(phs_mode)
* (CNTCRY(phs_mode) == 0x02 ? 2 : 1)) + 1;
if(Sys_initdl1[24] & SLEEP_MASK)
{
if( (phs_mode == PHS_PUBLIC_STS) &&
(CNTCRY(PHS_PUBLIC_STS) == 0x02 && Sys_prinfo[7] & 0x010))
{
Frame_cnt[phs_mode] = NSUB(phs_mode)* (((IncGroup[phs_mode] - 1) / 2) / NPCH(phs_mode))
+ (NSUB(phs_mode) - NPCH(phs_mode))
+ (((IncGroup[phs_mode] - 1) / 2) % NPCH(phs_mode));
}
else
{
Frame_cnt[phs_mode] = NSUB(phs_mode) * ((IncGroup[phs_mode] - 1) / NPCH(phs_mode))
+ (NSUB(phs_mode) - NPCH(phs_mode))
+ ((IncGroup[phs_mode] - 1) % NPCH(phs_mode));
}
}
}
void Sleep_Pch_Set(U1 frame_cnt)
{
if(!(Sys_initdl1[24] & SLEEP_MASK))
{
return;
}
own_pch_req(frame_cnt);
if (CCHShortTim[phs_mode])
{
m_stptim(T1S, TICCHSHT, phs_mode);
CCHShortTim[phs_mode] = OFF;
}
if(frame_cnt == SLEEP_OFF)
{
SLEEP_STS[phs_mode] = OFF;
Mn_settim(TICCHSHT);
Mn_PCsyncCountStart();
}
else
{
SLEEP_STS[phs_mode] = HOLD;
Mn_PCsyncTimerClear();
}
}
void Sleep_Control(U1 id)
{
// U2 tim;
#ifdef PROT_TEST
U1 temp[4];
temp[0] = id;
temp[1] = SLEEP_STS[phs_mode];
temp[2] = Sys_initdl1[24] & SLEEP_MASK;
temp[3] = 0x00;
HisOut(0x04,0xff,0x03,0x00, temp);
#endif
if((id == BSLPREL) && (SLEEP_STS[phs_mode] != OFF))
{
non_stop |= BIT1;
#ifdef SIMU_ON_PC
// SendUart2L1( SIMTSKDTW , NSTP , 0 , &non_stop , 1);//L1 only set it while not use it
#endif
if(Sys_initdl1[24] & SLEEP_MASK)
{
Sleep_Pch_Set(SLEEP_OFF);
}
slp_c_req(OFF);
SLEEP_STS[phs_mode] = OFF;
}
else if(id == BSLPFORV)
{
if(SLEEP_STS[phs_mode] == OFF)
{
Sleep_Pch_Set((U1)Frame_cnt[phs_mode]);
}
SLEEP_STS[phs_mode] = ON;
if(SLEEP_STS[PHS_PUBLIC_STS] == ON)
{
#ifdef SIMU_ON_PC
// SendUart2L1( SIMTSKDTW , NSTP , 0 , &non_stop , 1); //L1 only set it while not use it
#endif
non_stop &= ~BIT1;
}
if (CCHShortTim[phs_mode])
{
m_stptim(T1S, TICCHSHT, phs_mode);
CCHShortTim[phs_mode] = OFF;
}
Mn_PCsyncTimerClear();
}
}
void Mn_MInitial(void)
{
RadioFlag[PHS_PUBLIC_STS] = ON;
CallChanel = 0xFF;
CallMode = 0xFF;
CCHFact[PHS_PUBLIC_STS] = 0xFF;
CCHInfo.Moni = 0xFF;
CCHInfo.Main = 0xFF;
SLEEP_STS[PHS_PUBLIC_STS] = ON;
move_up_b(&Sys_pbsid[7], PAREADEF, sizeof(PAREADEF));
Source = 0x03;
SYS_WORK->msg_adr = (M_MSB*)m_hntbuf();
SYS_WORK->msg_adr->msg[0] = NONE; //Don't care
SYS_WORK->msg_adr->msg[1] = MINITEND; //Power up initialization completion
SYS_WORK->msg_adr->msg[2] = 0x04;
SYS_WORK->msg_adr->msg[3] = 0x00; //BBIC1 OK
SYS_WORK->msg_adr->msg[4] = 0x00; //BBIC2 OK
SYS_WORK->msg_adr->msg[5] = 0x01;
SYS_WORK->msg_adr->msg[6] = 0x01;
exec_uap(SYS_WORK->msg_adr);
Mn_state.common_mod = ST_CMN_WAIT;
}
/*************************************************************************************
FUNCTION: Mn_MInitData2
DESCRIPTION:
MMI Read the data stored in flash ROM , Flash address : 0x300 . from MMI->PM->MN
ARGUMENTS PASSED:
NONE
RETURN VALUE:
NONE
Revision History:
Modification Tracking
Author Date Number Description of Changes
------------------------- ------------ ---------- ------------------------------
Chen Xiangli 08/22/2003
**************************************************************************************/
void Mn_MInitData2(void) //Direction : PM_MNG
{
PM_MN_EVT* pInEvt;
pInEvt = (PM_MN_EVT*)SYS_WORK->in_evt;
if(pInEvt->msg_adr->msg[2] != 0x3F) //change from 0x38->0x3F for seamless feature,changed by Qian Aidong
{
ReaVal = PRIERR;
err_dsp(pInEvt->msg_adr);
return;
}
move_up_b(Sys_psid ,(U1*) &pInEvt->msg_adr->msg[3] , 4); //PS-ID
Sys_psid[3] &= 0x0F;
#ifdef SIMU_ON_PC
SendUart2L1( SIMTSKDTW , SYSPSID , 0 , Sys_psid , 4);
#endif
Sys_cartrsh[0] = pInEvt->msg_adr->msg[7];
#ifdef SIMU_ON_PC
SendUart2L1( SIMTSKDTW , SYSCARTRSH , 0 , &Sys_cartrsh[0] , 1); //Send to L1 together following
#endif
Sys_cchtim[0] = pInEvt->msg_adr->msg[8];
Sys_csynctim[0] = pInEvt->msg_adr->msg[9];
move_up_b(Sys_pbsid ,(U1*) &pInEvt->msg_adr->msg[10] , 7); //PBS Infomation
move_up_b(Sys_thresh ,(U1*) &pInEvt->msg_adr->msg[17] , 2);
#ifdef SIMU_ON_PC
SendUart2L1( SIMTSKDTW , SYSTHRESH , 0 , &Sys_thresh[0] , 2);
#endif
Sys_montim[0] = pInEvt->msg_adr->msg[19];
move_up_b(Sys_hodat , (U1*)&pInEvt->msg_adr->msg[20] , 3); //Send to L1 in next lines
move_up_b(Sys_initdl1 , (U1*)&pInEvt->msg_adr->msg[23] , 43);
#ifdef SIMU_ON_PC
SendUart2L1( SIMTSKDTW , SYSINIT , 0 , Sys_initdl1 , 43);
#endif
m_frebuf((U1*)pInEvt->msg_adr);
Sys_hodat[6] = ON;
#ifdef SIMU_ON_PC
SendUart2L1( SIMTSKDTW , SYSHODAT , 0, Sys_hodat , 7);
#endif
move_up_b(&Sys_pbsid[7],Sys_thresh,2);
CCHs_CSlev = Sys_thresh[0];
CCHh_CSlev = Sys_thresh[1];
TCHs_CSlev = Sys_thresh[1];
TCHh_CSlev = Sys_thresh[0];
if (cmp_up_b(Sys_pbsid, CLSCSID, 6))
{
Mn_PAreaBitMask();
}
Ich_end_monF = 0;
set_up_b(LocNgCS, 0, 6);
A_short = OFF;
exe_reg_cs_id = 1;
l1_slope = Sys_initdl1[26];
#ifdef SIMU_ON_PC
SendUart2L1(SIMTSKDTW , L1SLOPE , 0 , &l1_slope , 1);
#endif
l1_ofs = Sys_initdl1[27];
#ifdef SIMU_ON_PC
SendUart2L1(SIMTSKDTW , L1OFS , 0 , &l1_ofs , 1);
#endif
RfInit();
if ((InitData |= BIT1) == 0x03)
{
/* #dcm1-MNG17 07->0f */
/* #SD 0f->1f */
Mn_state.common_mod = ST_CMN_NORMAL;
slp_t_req(0xffff,0);
ph_ini_req();
}
}
/*************************************************************************************
FUNCTION: Mn_MInitData1
DESCRIPTION:
MMI Read the data stored in flash ROM ,Flash address : 0x340 , MMI->PM->MN
ARGUMENTS PASSED:
NONE
RETURN VALUE:
NONE
Revision History:
Modification Tracking
Author Date Number Description of Changes
------------------------- ------------ ---------- ------------------------------
Chen Xiangli 08/22/2003
**************************************************************************************/
void Mn_MInitData1(void) //Direction : PM_MNG
{
U1 n , i , j ;
PM_MN_EVT* pInEvt;
pInEvt = (PM_MN_EVT*)SYS_WORK->in_evt;
if(pInEvt->msg_adr->msg[2] == 0) //length of message
goto fre_lab;
if(Mn_InfChk(&CHKTBL[10] , (U1*) &pInEvt->msg_adr->msg[4] ,(BYTE)(pInEvt->msg_adr->msg[2]-1))) //don't care the msg[3] , at the same time ,decrease the length of message
{
ReaVal = PRIERR;
err_dsp(pInEvt->msg_adr);
return;
}
for (n = 4 ; n < pInEvt->msg_adr->msg[2]-1 ; ) //The message data readed from FlashROM (FlashData[])
{
switch(pInEvt->msg_adr->msg[n])
{
case IPSNUMBR: //PS Number
move_up_b(Sys_psno , (U1*)&pInEvt->msg_adr->msg[n+1] , 7);
n += 8;
break;
case ISODATA:
for(i=n ; (i-n) < pInEvt->msg_adr->msg[2]-9 ; )
{
j = 0;
switch(pInEvt->msg_adr->msg[i])
{
case ICARINF:
if(pInEvt->msg_adr->msg[i+1])
{
Sys_carrier[0] = pInEvt->msg_adr->msg[i+1] / 2;
move_up_b(&Sys_carrier[1] ,
(U1*)&pInEvt->msg_adr->msg[i+2],
pInEvt->msg_adr->msg[i+1]);
}
j = (pInEvt->msg_adr->msg[i+1] + 2);
break;
case IANSKEY:
move_up_b(Sys_pin , (U1*)&pInEvt->msg_adr->msg[i+1] , 8);
j = 9;
break;
case IPRIORT:
Sys_pri = pInEvt->msg_adr->msg[i+1];
j = 2;
break;
case IREWTKY:
move_up_b(Sys_rwtkey , (U1*)&pInEvt->msg_adr->msg[i+1] , 8);
j = 9;
break;
case IREADKY:
move_up_b(Sys_readkey , (U1*)&pInEvt->msg_adr->msg[i+1] , 8);
j = 9;
break;
default:
break;
}
i += j;
}
n += i;
break;
default:
break;
}
}
Mn_PSNumMake(1 , 7 , Sys_psno, PHS_PUBLIC_STS);
fre_lab :
m_frebuf((U1*)pInEvt->msg_adr);
if ((InitData |= BIT2) == 0x03)
{
#ifdef SIMU_ON_PC
DBG_TRACE( 0 , "\n-- Initdata ok!\n");
#endif
Mn_state.common_mod = ST_CMN_NORMAL;
slp_t_req(0xffff,0);
ph_ini_req();
}
}
void Mn_PAreaBitMask(void)
{
U1 i , j , k;
set_up_b(BitMask, 0, sizeof(BitMask));
if ((Sys_pbsid[6] & 0x0F) < 8)
{
i = (Sys_pbsid[6] & 0x0F) * 2 + 2;
}
else
{
i = (Sys_pbsid[6] & 0x0F) + 9;
}
if( i < 8 )
{
BitMask[1] = (U1)(0xFF80 >> i ) ;
BitMask[1] &= 0x7F;
}
else
{
j = (i-7)>>3;
if( (i-7) & 0x07 )
{
BitMask[j+2] = (U1)(0xFF80 >> (((i-7)&0x07)-1));
}
for( k = j+1 ; k>0 ; k--)
{
if( k == 1 )
{
BitMask[k] = 0x7F;
}
else
{
BitMask[k] = 0xFF;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -