?? ppp.c
字號:
** 調用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2004年4月23日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void PPPIllegalEvent(uint8 *DataBuf, uint8 Q)
{
DataBuf = DataBuf;
Q = Q;
}
/*********************************************************************************************************
** 函數名稱: PPP_UpLayer()
** 功能描述: This-Layer-Up
** 動作給自動進入打開階段的上邊的層做指示。
** 典型的,該動作被LCP用于對一個NCP發送向上的事件信號,或者鏈路質量協議,或者可以被一個NCP用于顯示該鏈路可用于它的網絡層往來。
** 或者可以被一個NCP用于顯示該鏈路可用于它的網絡層往來。
** 輸 入: DataBuf :接收到的數據包
** Q :接收到的消息(本函數沒有用到)
** 輸 出: 無
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2004年4月23日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void PPP_UpLayer(uint8 *DataBuf, uint8 Q)
{
NCPGetFrame(&PPPData, DataBuf, Q);
}
/*********************************************************************************************************
** 函數名稱: PPPDriverInit()
** 功能描述: PPP驅動接收初始化
** 輸 入: 無
** 輸 出: 無
** 全局變量: PPPData
** 調用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2004年4月23日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 PPPDriverInit(void)
{
PPPData.HardDrive = NULL;
PPPData.Event = OSQCreate(PPPData.QBuf, PPP_DRIVER_Q_BUF_LEN);
if (PPPData.Event == NULL)
{
return FALSE;
}
else
{
return TRUE;
}
}
uint8 PPPLowLayerUpQ[1];
uint8 PPPLowLayerDownQ[1];
uint8 PPPOpenQ[1];
uint8 PPPCloseQ[1];
uint8 PPPLowLayerUp(void)
{
#if OS_TASK_CREATE_EN > 0
#if OS_STK_GROWTH > 0
OSTaskCreate(PPPReviceTask, NULL, Stk[1] + PPP_DRIVER_TASK_STK_SIZE - 1,
PPP_DRIVER_TASK_PRIO + 1);
#else
OSTaskCreate(PPPReviceTask, NULL, Stk[1], PPP_DRIVER_TASK_PRIO + 1);
#endif
#else
#if OS_STK_GROWTH > 0
OSTaskCreateExt(PPPReviceTask, NULL, Stk[1] + PPP_DRIVER_TASK_STK_SIZE - 1,
PPP_DRIVER_TASK_PRIO + 1, PPP_DRIVER_TASK_PRIO + 1, Stk[1],
PPP_DRIVER_TASK_STK_SIZE, NULL, 0);
#else
OSTaskCreateExt(PPPReviceTask, NULL, Stk[1], PPP_DRIVER_TASK_PRIO + 1,
PPP_DRIVER_TASK_PRIO + 1, Stk[1] + PPP_DRIVER_TASK_STK_SIZE - 1,
PPP_DRIVER_TASK_STK_SIZE, NULL, 0);
#endif
#endif
PPPLowLayerUpQ[0] = PPP_EVENT_LOWER_UP;
OSQPost(PPPData.Event, (void *)PPPLowLayerUpQ);
return 0;
}
uint8 PPPLowLayerDown(void)
{
PPPLowLayerDownQ[0] = PPP_EVENT_LOWER_DOWN;
OSQPost(PPPData.Event, (void *)PPPLowLayerDownQ);
OSTaskDel(PPP_DRIVER_TASK_PRIO + 1);
return 0;
}
uint8 PPPOpen(void)
{
PPPOpenQ[0] = PPP_EVENT_OPEN;
OSQPost(PPPData.Event, (void *)PPPOpenQ);
return 0;
}
uint8 PPPClose(void)
{
PPPCloseQ[0] = PPP_EVENT_CLOSE;
OSQPost(PPPData.Event, (void *)PPPCloseQ);
return 0;
}
uint8 PPPCreate(NetHardDrivesSocket *HardDrive)
{
if (PPPData.HardDrive == NULL && HardDrive != NULL)
{
PPPData.HardDrive = HardDrive;
HardDrive->ThisLayerUp = PPPLowLayerUp;
HardDrive->ThisLayerDown = PPPLowLayerDown;
PPPData.MaxTerminate = 3 * OS_TICKS_PER_SEC;
PPPData.MaxConfigure = 2 * OS_TICKS_PER_SEC;
PPPData.MaxFailure = 10;
PPPData.DelayTime = 0;
PPPData.OverTimeSum = 0;
PPPData.State = PPP_STATE_INITIAL;
PPPData.FramID = 0;
#if OS_TASK_CREATE_EN > 0
#if OS_STK_GROWTH > 0
OSTaskCreate(PPPDriverTask, NULL, Stk[0] + PPP_DRIVER_TASK_STK_SIZE - 1,
PPP_DRIVER_TASK_PRIO);
#else
OSTaskCreate(PPPDriverTask, NULL, Stk[0], PPP_DRIVER_TASK_PRIO);
#endif
#else
#if OS_STK_GROWTH > 0
OSTaskCreateExt(PPPDriverTask, NULL, Stk[0] + PPP_DRIVER_TASK_STK_SIZE - 1,
PPP_DRIVER_TASK_PRIO, PPP_DRIVER_TASK_PRIO, Stk[0],
PPP_DRIVER_TASK_STK_SIZE, NULL, 0);
#else
OSTaskCreateExt(PPPDriverTask, NULL, Stk[0], PPP_DRIVER_TASK_PRIO,
PPP_DRIVER_TASK_PRIO, Stk[0] + PPP_DRIVER_TASK_STK_SIZE - 1,
PPP_DRIVER_TASK_STK_SIZE, NULL, 0);
#endif
#endif
return TRUE;
}
else
{
return FALSE;
}
}
/*********************************************************************************************************
** 函數名稱: PPPDriveWrite()
** 功能描述: 使用PPP協議發送一個數據包,調用此函數前必須調用PPPDriveGetSendBuf獲取數據緩沖
** 輸 入: HardDrive :發送的硬件驅動
** Buf :指向發送的數據
** NByte:發送的字節數
** 輸 出: TRUE :函數調用成功
** FALSE:函數調用失敗
** 全局變量: PPPUseHardDrive,PPPFcs16
** 調用模塊:
**
** 作 者: 陳明計
** 日 期: 2004年4月23日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 PPPDriveWrite(NetHardDrivesSocket *HardDrive, uint8 *Buf, uint16 Nbyte)
{
uint16 Fcs;
uint8 Temp;
if (HardDrive != NULL)
if (HardDrive->GetFlag != NULL)
if (HardDrive->GetFlag() == NET_HARD_OPEN)
if (HardDrive->Putch != NULL)
{
Fcs = PPPFcs16(PPP_HARD_FCS16, Buf, Nbyte);
Fcs = ~Fcs;
/* 取得信號量 */
HardDrive->Putch(PPP_HARD_CHAR);
HardDrive->Putch(PPP_ADDR_CHAR);
HardDrive->Putch(PPP_DLE_CHAR);
HardDrive->Putch(PPP_CTR_CHAR ^ PPP_DLE_XOR_CHAR);
while (Nbyte--)
{
Temp = *Buf;
if ((Temp == PPP_HARD_CHAR) || (Temp == PPP_DLE_CHAR) || (Temp < 0x20))
{
HardDrive->Putch(PPP_DLE_CHAR);
HardDrive->Putch(Temp ^ PPP_DLE_XOR_CHAR);
}
else
{
HardDrive->Putch(*Buf);
}
Buf++;
}
Temp = Fcs % 256;
if ((Temp == PPP_HARD_CHAR) || (Temp == PPP_DLE_CHAR) || (Temp < 0x20))
{
HardDrive->Putch(PPP_DLE_CHAR);
HardDrive->Putch(Temp ^ PPP_DLE_XOR_CHAR);
}
else
{
HardDrive->Putch(Temp);
}
Temp = Fcs / 256;
if ((Temp == PPP_HARD_CHAR) || (Temp == PPP_DLE_CHAR) || (Temp < 0x20))
{
HardDrive->Putch(PPP_DLE_CHAR);
HardDrive->Putch(Temp ^ PPP_DLE_XOR_CHAR);
}
else
{
HardDrive->Putch(Temp);
}
HardDrive->Putch(PPP_HARD_CHAR);
/* 發送信號量 */
return TRUE;
}
return FALSE;
}
/*********************************************************************************************************
** 函數名稱: PPPGetch()
** 功能描述: 接收一個字節
** 輸 入: 無
** 輸 出: 接收到的數據
** 全局變量: PPPUseHardDrive
** 調用模塊: OSTaskSuspend
**
** 作 者: 陳明計
** 日 期: 2004年4月23日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 PPPGetch(NetHardDrivesSocket *HardDrive)
{
uint8 Temp,err;
while (1)
{
err = HardDrive->Getch(&Temp);
if (err == NO_ERR)
{
break;
}
}
return Temp;
}
/*********************************************************************************************************
** 函數名稱: PPPDriverGetFrame()
** 功能描述: PPP驅動接收到數據幀處理
** 輸 入: Fram :數據幀的起始地址
** NByte:數據幀大小
** 輸 出: 無
** 全局變量: FramType
** 調用模塊: PPPFcs16,IPReviceFram,ICPCReviceFram,PAPReviceFram,LCPReviceFram
**
** 作 者: 陳明計
** 日 期: 2004年4月23日
**-------------------------------------------------------------------------------------------------------
** 修改人:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -