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

📄 ppp.c

📁 uCOS移植后的一些应用举例:gpio、pwm、modem、i2c、ppp、spi、uart等
💻 C
📖 第 1 页 / 共 4 页
字号:
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 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 + -