亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? obj_svcudp.c

?? AT91rm9200的引導代碼
?? C
字號:
//*----------------------------------------------------------------------------
//*      ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : drv_usb.c
//* Object              : Send and receive funtions for USB device peripheral
//*
//* 1.0 20/06/01 	    : ODi Creation
//*----------------------------------------------------------------------------
#include "services/obj_buffer.h"
#include "services/obj_svcudp.h"
#include "periph/udp/lib_udp.h"

#ifdef DBG_OBJ_UDP
#include <assert.h>
const char *UdpErrMsg[] = {
	"(AT91_SvcUdp) Receive has failed",
	"(AT91_SvcUdp) Read buffer not ready"
	"(AT91_SvcUdp) Receive not allowed",
	"(AT91_SvcUdp) Write failed",
	"(AT91_SvcUdp) Write not ready",
	"(AT91_SvcUdp) Write aborted",
	"(AT91_SvcUdp) Unknown message"
};
#endif
//*----------------------------------------------------------------------------
//* Function Name       : OpenUdpService()
//* Object              :
//* Input Parameters    :
//* Output Parameters   : none
//*----------------------------------------------------------------------------
AT91PS_SvcComm AT91F_OpenSvcUdp(
	AT91PS_SvcUdp pSvcUdp,
	AT91PS_UDP   pUdp,
	char         epId,
	unsigned int epSize)
{
	AT91PS_SvcComm pSvcComm = &(pSvcUdp->parent);

#ifdef DBG_DRV_UDP
	assert(pSvcUdp);
	assert(pUdp);
	assert(pSvcComm);
#endif

	// Init AT91S_CommSvc base structure

	// Init methods
	pSvcComm->Reset        = (AT91PF_SvcCommReset)   0;
	pSvcComm->StartTx      = AT91F_SvcUdpStartTx;
	pSvcComm->StartRx      = AT91F_SvcUdpStartRx;
	pSvcComm->StopTx       = AT91F_SvcUdpStopTx;
	pSvcComm->StopRx       = AT91F_SvcUdpStopRx;
	pSvcComm->TxReady      = AT91F_SvcUdpTxReady;
	pSvcComm->RxReady      = AT91F_SvcUdpRxReady;

	// Init data
	pSvcComm->pChild       = (void *) pSvcUdp;
	pSvcComm->pBuffer      = (AT91PS_Buffer) 0;

	// Init AT91S_UdpEp structure
	pSvcUdp->HandleRx   = AT91F_SvcUdpControlHandleRx;
	pSvcUdp->HandleTx   = AT91F_SvcUdpControlHandleTx;
	pSvcUdp->pUdp       = pUdp;
	pSvcUdp->epId       = epId;
	pSvcUdp->epSize     = epSize;
	pSvcUdp->bank       = UDP_RCV_DATA_BANK0;
	pSvcUdp->operation  = AT91C_SVCUDP_CTL_RD;

	return pSvcComm;
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SvcUdpStartTx()
//* Object              : Send or receive a payload with the USB, update the
//*                       linked buffer structure
//* Input Parameters    : AT91PS_SvcComm
//* Output Parameters   : none
//*----------------------------------------------------------------------------
AT91S_SvcCommStatus AT91F_SvcUdpStartTx(AT91PS_SvcComm pSvcComm)
{
	AT91PS_Buffer  pBuffer  = (AT91PS_Buffer) pSvcComm->pBuffer;
	AT91S_BufferStatus status = AT91C_COMMSVC_SUCCESS;
	char const *pWrData;
	unsigned int bufSize;
	AT91PS_SvcUdp pSvcUdp  = (AT91PS_SvcUdp) pSvcComm->pChild;

	pSvcUdp->operation = AT91C_SVCUDP_CTL_RD;
	// Get how many bytes to send now
	status = pBuffer->GetWrBuffer(pBuffer, &pWrData, &bufSize);
	if (status )
		status = (AT91C_SVCUDP_WR_FAILED | status);
	// Send the first packet
	if (pSvcUdp->epSize < bufSize)
		AT91F_UdpEpWrite(pSvcUdp->pUdp, pSvcUdp->epId, pWrData, pSvcUdp->epSize);
	else if (bufSize)
		AT91F_UdpEpWrite(pSvcUdp->pUdp, pSvcUdp->epId, pWrData, bufSize);
	// Notify the end of write USB device peripheral
	AT91F_UdpEpEow(pSvcUdp->pUdp, pSvcUdp->epId);

	return AT91C_COMMSVC_SUCCESS;
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SvcUdpStoptTx()
//* Object              :
//* Input Parameters    : AT91PS_SvcComm
//* Output Parameters   : none
//*----------------------------------------------------------------------------
AT91S_SvcCommStatus AT91F_SvcUdpStopTx(AT91PS_SvcComm pSvcComm)
{
	AT91PS_SvcUdp pSvcUdp = (AT91PS_SvcUdp) pSvcComm->pChild;

	AT91F_UdpEpStall(pSvcUdp->pUdp, pSvcUdp->epId);
	return AT91C_COMMSVC_SUCCESS;
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SvcUdpStartRx()
//* Object              :
//* Input Parameters    : AT91PS_SvcComm
//* Output Parameters   : none
//*----------------------------------------------------------------------------
AT91S_SvcCommStatus AT91F_SvcUdpStartRx(AT91PS_SvcComm pSvcComm)
{
	AT91PS_SvcUdp pSvcUdp  = (AT91PS_SvcUdp) pSvcComm->pChild;

	pSvcUdp->operation = AT91C_SVCUDP_CTL_WR;

	return AT91C_COMMSVC_SUCCESS;
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SvcUdpStoptRx()
//* Object              :
//* Input Parameters    : AT91PS_SvcComm
//* Output Parameters   : none
//*----------------------------------------------------------------------------
AT91S_SvcCommStatus AT91F_SvcUdpStopRx(AT91PS_SvcComm pSvcComm)
{
	AT91PS_SvcUdp pSvcUdp = (AT91PS_SvcUdp) pSvcComm->pChild;

	AT91F_UdpEpStall(pSvcUdp->pUdp, pSvcUdp->epId);

	return AT91C_COMMSVC_SUCCESS;
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SvcUdpControlHandleRx()
//* Object              : Send or receive a payload with the USB, update the
//*                       linked buffer structure
//* Input Parameters    : AT91PS_SvcComm
//* Output Parameters   : none
//*----------------------------------------------------------------------------
AT91S_SvcCommStatus AT91F_SvcUdpControlHandleRx(AT91PS_SvcUdp pSvcUdp)
{
	AT91PS_SvcComm pService = (AT91PS_SvcComm) &(pSvcUdp->parent);
	AT91PS_Buffer  pBuffer  = (AT91PS_Buffer) pService->pBuffer;
	AT91S_BufferStatus status = AT91C_COMMSVC_SUCCESS;
	char *pRdData;
	char const *pWrData;
	unsigned int bufSize, bytesRcv;

	if (pSvcUdp->operation == AT91C_SVCUDP_CTL_RD) {
		// This is the STATUS OUT stage, it stops the transmition
		AT91F_UdpEpEor(pSvcUdp->pUdp, pSvcUdp->epId, UDP_RCV_DATA_BANK0);
		status = pBuffer->GetWrBuffer(pBuffer, &pWrData, &bufSize);
		if ( status )
			status = (AT91C_SVCUDP_WR_FAILED | status);

		// Free the remaining buffer
		if (bufSize) {
			status = pBuffer->EmptyWrBuffer(pBuffer, bufSize);
			status = ( status ) ? (AT91C_SVCUDP_WR_FAILED | status) : AT91C_SVCUDP_WR_ABORTED;
		}

		return status;
	}
	else {
		status = pBuffer->GetRdBuffer(pBuffer, &pRdData, &bufSize);
		if ( status )
			status = (AT91C_SVCUDP_RD_FAILED | status);

		// Determine how many bytes have been received
		bytesRcv = AT91F_UdpEpNbBytesRcv(pSvcUdp->pUdp, pSvcUdp->epId);

		// An unexpected packet length has been received, STALL it.
		if (bytesRcv > bufSize) {
			AT91F_UdpEpEor(pSvcUdp->pUdp, pSvcUdp->epId, UDP_RCV_DATA_BANK0);
			AT91F_UdpEpStall(pSvcUdp->pUdp, pSvcUdp->epId);
			status = AT91C_SVCUDP_RD_BUFFER_NOT_RDY;
		}
		// Accept the packet
		else {
			// Read the USB DPR
			AT91F_UdpEpRead(pSvcUdp->pUdp, pSvcUdp->epId, pRdData, bytesRcv);
			AT91F_UdpEpEor(pSvcUdp->pUdp, pSvcUdp->epId, UDP_RCV_DATA_BANK0);

			// Update the buffer
			status = pBuffer->FillRdBuffer(pBuffer, bytesRcv);
			if ( status )
				status = (AT91C_SVCUDP_RD_FAILED | status);
		}

		// Notify the call back if the buffer is full


	}
	return status;
}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_SvcUdpControlHandleTx()
//* Object              : Send or receive a payload with the USB, update the
//*                       linked buffer structure
//* Input Parameters    : AT91PS_SvcComm
//* Output Parameters   : none
//*----------------------------------------------------------------------------
AT91S_SvcCommStatus AT91F_SvcUdpControlHandleTx(AT91PS_SvcUdp pSvcUdp)
{
	AT91PS_SvcComm pService = (AT91PS_SvcComm) &(pSvcUdp->parent);
	AT91PS_Buffer  pBuffer  = (AT91PS_Buffer) pService->pBuffer;
	AT91S_BufferStatus status = AT91C_COMMSVC_SUCCESS;
	char const *pWrData;
	unsigned int bufSize;

	if (pSvcUdp->operation == AT91C_SVCUDP_CTL_RD) {
		// Free the buffer sent and ACKed
		status = pBuffer->EmptyWrBuffer(pBuffer, pSvcUdp->epSize);
		status = ( status ) ? (AT91C_SVCUDP_WR_FAILED | status) : AT91C_SVCUDP_WR_ABORTED;
		// Get how many bytes to send now
		status = pBuffer->GetWrBuffer(pBuffer, &pWrData, &bufSize);
		if (status )
			status = (AT91C_SVCUDP_WR_FAILED | status);
		// If required, send another packet
		if (bufSize) {
			if (pSvcUdp->epSize < bufSize)
				AT91F_UdpEpWrite(pSvcUdp->pUdp, pSvcUdp->epId, pWrData, pSvcUdp->epSize);
			else
				AT91F_UdpEpWrite(pSvcUdp->pUdp, pSvcUdp->epId, pWrData, bufSize);
			// Notify the end of write USB device peripheral
			AT91F_UdpEpEow(pSvcUdp->pUdp, pSvcUdp->epId);
		}
	}

	return status;
}



//*----------------------------------------------------------------------------
//* Function Name       : AT91F_UdpTxReady()
//* Object              : Return the status of the USB
//* Input Parameters    :
//* Output Parameters   : none
//*----------------------------------------------------------------------------
char AT91F_SvcUdpTxReady(AT91PS_SvcComm pService)
{
	AT91PS_SvcUdp pSvcUdp = (AT91PS_SvcUdp) pService->pChild;

	return (AT91F_UdpEpWok (pSvcUdp->pUdp, pSvcUdp->epId));

}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_UdpRxReady()
//* Object              : Return the status of the USB
//* Input Parameters    :
//* Output Parameters   : none
//*----------------------------------------------------------------------------
char AT91F_SvcUdpRxReady(AT91PS_SvcComm pSvcComm)
{
	AT91PS_SvcUdp pSvcUdp = (AT91PS_SvcUdp) pSvcComm->pChild;
	char status = AT91F_UdpEpRok(pSvcUdp->pUdp, pSvcUdp->epId);

	if ( status == UDP_RCV_DATA_BANK0 )
		pSvcUdp->bank = UDP_RCV_DATA_BANK0;
	else if ( status == UDP_RCV_DATA_BANK1 )
		pSvcUdp->bank = UDP_RCV_DATA_BANK1;
	return status;

}

//*----------------------------------------------------------------------------
//* Function Name       : AT91F_UdpGetError()
//* Object              : Return the read error message
//* Input Parameters    :
//* Output Parameters   :
//*----------------------------------------------------------------------------
#ifdef DBG_DRV_PERIPH
char const *AT91F_SvcUdpGetError(AT91S_SvcCommStatus errorNumber)
{

	switch (errorNumber & AT91C_SERVICE_ERROR)
	case AT91C_SVCUDP_RD_FAILED:         return (UdpErrMsg[1]);
	case AT91C_SVCUDP_RD_BUFFER_NOT_RDY: return (UdpErrMsg[2]);
	case AT91C_SVCUDP_RD_NOT_RDY:        return (UdpErrMsg[3]);
	case AT91C_SVCUDP_WR_FAILED:         return (UdpErrMsg[4]);
	case AT91C_SVCUDP_WR_NOT_RDY:        return (UdpErrMsg[5]);
	case AT91C_SVCUDP_WR_ABORTED:        return (UdpErrMsg[6]);
	default:                             return (UdpErrMsg[7]);
	}
}
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
奇米影视一区二区三区小说| 国产精品久久午夜夜伦鲁鲁| 三级欧美在线一区| 欧美另类变人与禽xxxxx| 免费一区二区视频| 久久综合网色—综合色88| 国产一区高清在线| 国产精品天天看| 日本韩国视频一区二区| 亚洲一区电影777| 日韩欧美国产成人一区二区| 丁香婷婷综合色啪| 一区二区三区四区激情| 日韩一区二区麻豆国产| 国产激情91久久精品导航 | 久久这里都是精品| 国产福利一区在线观看| 亚洲免费观看在线视频| 欧美一区二区三区免费在线看 | 日韩写真欧美这视频| 国产一区二区三区久久久| 自拍偷拍国产精品| 日韩欧美国产麻豆| 99久久久精品| 久久国产生活片100| 综合久久综合久久| 日韩欧美中文字幕精品| 99国产麻豆精品| 久久99深爱久久99精品| 亚洲伦理在线精品| 久久伊人蜜桃av一区二区| 91久久奴性调教| 国产一区二区免费在线| 亚洲一区二区三区四区不卡| 欧美精品一区二区高清在线观看| 91高清视频免费看| 国产精品1区二区.| 日韩电影在线免费看| 亚洲人成精品久久久久| 久久综合色综合88| 666欧美在线视频| 色一区在线观看| 成人伦理片在线| 精品一区二区三区免费毛片爱| 亚洲黄色免费网站| 国产精品麻豆一区二区| 久久综合99re88久久爱| 日韩一级片网址| 欧美性xxxxx极品少妇| 成人动漫av在线| 国产一区二区美女| 美女视频一区二区三区| 亚洲在线视频一区| 最新不卡av在线| 国产精品视频第一区| 久久综合99re88久久爱| 日韩欧美三级在线| 正在播放亚洲一区| 8v天堂国产在线一区二区| 欧洲精品一区二区三区在线观看| 成人国产精品免费网站| 国产夫妻精品视频| 国产成人自拍高清视频在线免费播放| 蜜臀久久久久久久| 日韩电影在线观看网站| 日韩国产一二三区| 亚洲超丰满肉感bbw| 亚洲午夜免费电影| 亚洲一区二区四区蜜桃| 一区二区三区精品视频在线| 亚洲欧美日韩精品久久久久| 最新日韩在线视频| 亚洲欧美怡红院| 亚洲人成精品久久久久| 亚洲精品免费在线| 亚洲精品国产一区二区精华液| 亚洲欧洲韩国日本视频| 综合色天天鬼久久鬼色| 一区二区三区中文免费| 亚洲一区二区成人在线观看| 午夜不卡在线视频| 热久久国产精品| 精品综合久久久久久8888| 国产一区二区视频在线播放| 国产一区二区伦理片| 国产aⅴ精品一区二区三区色成熟| 丁香亚洲综合激情啪啪综合| 成人国产在线观看| 欧美性xxxxxxxx| 日韩免费一区二区三区在线播放| 2017欧美狠狠色| 国产精品毛片久久久久久| 亚洲你懂的在线视频| 亚洲午夜私人影院| 麻豆国产精品777777在线| 国产成人高清视频| 91蜜桃网址入口| 欧美精品自拍偷拍| 国产亚洲精品超碰| 亚洲免费毛片网站| 日本vs亚洲vs韩国一区三区二区| 国内成人免费视频| 91麻豆.com| 日韩欧美电影在线| 国产精品久久三| 日韩中文字幕区一区有砖一区| 精品在线一区二区三区| 99久久婷婷国产精品综合| 欧美日韩免费电影| 久久久一区二区| 亚洲最新视频在线播放| 精品一区二区影视| 色综合久久久久久久久| 欧美一级一区二区| 亚洲欧洲在线观看av| 麻豆精品视频在线观看| 一本色道久久综合亚洲aⅴ蜜桃| 3atv在线一区二区三区| 中文字幕日韩精品一区| 蜜桃视频在线观看一区二区| 99re8在线精品视频免费播放| 7777精品伊人久久久大香线蕉经典版下载 | 亚洲少妇最新在线视频| 日韩不卡手机在线v区| av爱爱亚洲一区| 日韩精品中文字幕在线一区| 亚洲精品乱码久久久久| 国产一区三区三区| 欧美人与z0zoxxxx视频| 国产精品久久一级| 国产一区二区三区久久悠悠色av| 欧美日韩一区三区四区| 中文字幕欧美三区| 另类中文字幕网| 欧美美女直播网站| 亚洲另类色综合网站| 国产传媒日韩欧美成人| 日韩一二在线观看| 亚洲成人1区2区| 色菇凉天天综合网| 国产精品免费久久| 国产成人在线免费观看| 精品久久国产字幕高潮| 亚洲成a人v欧美综合天堂下载| 不卡一区二区在线| 久久综合九色综合97婷婷女人 | 精久久久久久久久久久| 欧美日韩高清一区二区不卡| 最近日韩中文字幕| av动漫一区二区| 亚洲国产精品t66y| 国产精品一区二区x88av| 精品处破学生在线二十三| 日本亚洲欧美天堂免费| 欧美精品久久天天躁| 亚洲一区二区三区爽爽爽爽爽| 93久久精品日日躁夜夜躁欧美| 中文字幕av一区二区三区高 | 日韩一区二区麻豆国产| 日韩中文字幕1| 欧美一级艳片视频免费观看| 午夜精品久久久久久不卡8050 | 欧美一区二区精品| 日韩影院免费视频| 777色狠狠一区二区三区| 日韩av电影一区| 91精品国产免费久久综合| 日韩高清一区二区| 精品噜噜噜噜久久久久久久久试看 | www.色综合.com| 中文字幕一区二区三区四区不卡| 国产精品中文字幕欧美| 欧美国产激情一区二区三区蜜月 | 94-欧美-setu| 有坂深雪av一区二区精品| 欧美性一级生活| 水蜜桃久久夜色精品一区的特点| 欧美人妖巨大在线| 久久精品二区亚洲w码| 久久久综合视频| 99这里只有精品| 性做久久久久久久久| 日韩欧美不卡在线观看视频| 国产综合色精品一区二区三区| 日本一区二区视频在线观看| 9人人澡人人爽人人精品| 亚洲一区二区三区四区中文字幕| 91精品国产综合久久香蕉麻豆| 精品影视av免费| 亚洲少妇中出一区| 91精品蜜臀在线一区尤物| 国产精品99久久久| 亚洲综合激情小说| 日韩一区二区不卡| 99久久综合精品| 日本不卡一区二区三区| 中文字幕精品一区| 欧美丰满少妇xxxxx高潮对白| 国产精品综合av一区二区国产馆| 综合色中文字幕|