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

📄 obj_dfudesc.c

📁 AT91RM9200的引到程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	AT91PS_DfuDesc  pDfu,    /* DFU handler */
	AT91PS_UsbSetup pSetup)  /* Descriptor type */
{
	register char           bRequest = pSetup->bRequest;
	register unsigned short wLength  = pSetup->wLength;
	register char           bitMask = bmAttributes(pDfu->pDfuFDesc);

	/* ==== Event: Receipt of the AT91C_DFU_DNLOAD request wLength > 0 and bitCanDnload = 1 ==== */
	if ((bRequest == AT91C_DFU_DNLOAD) && (wLength > 0) && (bitMask & 0x1)) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuDNLOAD_SYNC;
		pDfu->blockComplete = 0;
		pDfu->Download(pDfu, wLength, AT91F_DfuDescDownload);
		//AT91F_DfuDescSuccess(pDfu);
	}
	/* ==== Event: Receipt of the AT91C_DFU_DNLOAD request wLength = 0 or bitCanDnload = 0 ==== */
	else if ((bRequest == AT91C_DFU_DNLOAD) && ((wLength == 0) || !(bitMask & 0x1))) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuERROR;
		AT91F_DfuDescError(pDfu);
	}
	/* ==== Event: Receipt of the AT91C_DFU_UPLOAD request and bitCanUpload = 1 ==== */
	else if ((bRequest == AT91C_DFU_UPLOAD) && (bitMask & 0x2)) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuUPLOAD_IDLE;
		pDfu->Upload(pDfu, wLength);
	}
	/* ==== Event: Receipt of the AT91C_DFU_UPLOAD request and bitCanUpload = 0 ==== */
	else if ((bRequest == AT91C_DFU_UPLOAD) && (!(bitMask & 0x2))) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuERROR;
		AT91F_DfuDescError(pDfu);
	}
	/* ==== Event: Receipt of the AT91C_DFU_ABORT request  ==== */
	else if (bRequest == AT91C_DFU_ABORT) {
		/* Does nothing */
		pDfu->dfuStatus.bState = AT91C_DFU_dfuIDLE;
	}
	/* ==== Event: Receipt of the AT91C_DFU_GETSTATUS request ==== */
	else if (bRequest == AT91C_DFU_GETSTATUS) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuIDLE;
		AT91F_DfuDescGetStatus(pDfu);
	}
	/* ==== Event: Receipt of the AT91C_DFU_GETSTATE request ==== */
	else if (bRequest == AT91C_DFU_GETSTATE) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuIDLE;
		AT91F_DfuDescGetState(pDfu);
	}
	/* ==== Event: Receipt of any other DFU class-specific request ==== */
	else {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuERROR;
		AT91F_DfuDescError(pDfu);
	}
}

/* ************************************************************ */
/* **** dfuState3: Handle requests in dfuDNLOAD_SYNC state **** */
/* ************************************************************ */
void AT91F_DfuDescState3(
	AT91PS_DfuDesc  pDfu,    /* DFU handler */
	AT91PS_UsbSetup pSetup)  /* Descriptor type */
{
	register char         bRequest = pSetup->bRequest;
	unsigned int timeout;

	/* ==== Event: Receipt of the AT91C_DFU_GETSTATUS request. Bloc tx in progress ==== */
	if ( (bRequest == AT91C_DFU_GETSTATUS) && !(pDfu->blockComplete)) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuDNBUSY;
		AT91F_DfuDescGetStatus(pDfu);
		timeout = bwPollTimeout(&(pDfu->dfuStatus));
		pDfu->tempo.Start(&(pDfu->tempo), timeout, 0, AT91F_DfuDescStatusPollTimeOut, pDfu);
	}
	/* ==== Event: Receipt of the AT91C_DFU_GETSTATUS request. Bloc tx complete ==== */
	//if ((bRequest == AT91C_DFU_GETSTATUS) && (!pMem || pMem->dnloadComplete)) {
	else if ( (bRequest == AT91C_DFU_GETSTATUS) && pDfu->blockComplete ) {
		// !!!!! To be modified !!!!!!
		pDfu->dfuStatus.bStatus = AT91C_DFU_OK;
		pDfu->dfuStatus.bState = AT91C_DFU_dfuDNLOAD_IDLE;
		AT91F_DfuDescGetStatus(pDfu);
	}
	/* ==== Event: Receipt of the AT91C_DFU_GETSTATE request ==== */
	else if (bRequest == AT91C_DFU_GETSTATE) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuDNLOAD_SYNC;
		AT91F_DfuDescGetState(pDfu);
	}
	/* ==== Event: Receipt of any other DFU class-specific request ==== */
	else {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuERROR;
		AT91F_DfuDescError(pDfu);
	}
}

/* ******************************************************* */
/* **** dfuState4: Handle requests in dfuDNBUSY state **** */
/* ******************************************************* */
void AT91F_DfuDescState4(
	AT91PS_DfuDesc  pDfu,    /* DFU handler */
	AT91PS_UsbSetup pSetup)  /* Descriptor type */
{
	/* ==== Event: Receipt of any other DFU class-specific request ==== */
	pDfu->dfuStatus.bState = AT91C_DFU_dfuERROR;
	AT91F_DfuDescError(pDfu);
}

/* ************************************************************ */
/* **** dfuState5: Handle requests in dfuDNLOAD_IDLE state **** */
/* ************************************************************ */
void AT91F_DfuDescState5(
	AT91PS_DfuDesc  pDfu,    /* DFU handler */
	AT91PS_UsbSetup pSetup)  /* Descriptor type */
{
	register char           bRequest = pSetup->bRequest;
	register unsigned short wLength  = pSetup->wLength;

	/* ==== Event: Receipt of the AT91C_DFU_DNLOAD request wLength > 0 ==== */
	if ((bRequest == AT91C_DFU_DNLOAD) && (wLength > 0)) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuDNLOAD_SYNC;
		pDfu->blockComplete = 0;
		pDfu->Download(pDfu, wLength, AT91F_DfuDescDownload);
		//AT91F_DfuDescSuccess(pDfu);
	}
	/* ==== Event: Receipt of the AT91C_DFU_DNLOAD request wLength = 0 ==== */
	else if ((bRequest == AT91C_DFU_DNLOAD) && (wLength == 0)) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuMANIFEST_SYNC;
		AT91F_DfuDescSuccess(pDfu);
	}
	/* ==== Event: Receipt of the AT91C_DFU_ABORT request  ==== */
	else if (bRequest == AT91C_DFU_ABORT) {
		/* Host is terminating teh current download transfer */
		pDfu->dfuStatus.bState = AT91C_DFU_dfuIDLE;
	}
	/* ==== Event: Receipt of the AT91C_DFU_GETSTATUS request ==== */
	else if (bRequest == AT91C_DFU_GETSTATUS) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuDNLOAD_IDLE;
		AT91F_DfuDescGetStatus(pDfu);
	}
	/* ==== Event: Receipt of the AT91C_DFU_GETSTATE request ==== */
	else if (bRequest == AT91C_DFU_GETSTATE) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuDNLOAD_IDLE;
		AT91F_DfuDescGetState(pDfu);
	}
	/* ==== Event: Receipt of any other DFU class-specific request ==== */
	else {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuERROR;
		AT91F_DfuDescError(pDfu);
	}
}

/* ************************************************************** */
/* **** dfuState6: Handle requests in dfuMANIFEST_SYNC state **** */
/* ************************************************************** */
void AT91F_DfuDescState6(
	AT91PS_DfuDesc  pDfu,    /* DFU handler */
	AT91PS_UsbSetup pSetup)  /* Descriptor type */
{
	register char           bRequest = pSetup->bRequest;
	unsigned int timeout;

	/* ==== Event: Receipt of the AT91C_DFU_GETSTATUS request before manifest ==== */
	if ((bRequest == AT91C_DFU_GETSTATUS) && (pDfu->manifestComplete == 0)) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuMANIFEST;
		AT91F_DfuDescGetStatus(pDfu);
		timeout = bwPollTimeout(&(pDfu->dfuStatus));
		pDfu->tempo.Start(&(pDfu->tempo), timeout, 0, AT91F_DfuDescStatusPollTimeOut, pDfu);
	}

	/* ==== Event: Receipt of the AT91C_DFU_GETSTATUS request after manifest ==== */
	else if ((bRequest == AT91C_DFU_GETSTATUS) &&
	    (pDfu->manifestComplete == 1) &&
	    (pDfu->pDfuFDesc->bmAttributes & (1 << 2))) { // bitManifestationTolerant
		pDfu->manifestComplete = 0;
		pDfu->dfuStatus.bState = AT91C_DFU_dfuIDLE;
		AT91F_DfuDescGetStatus(pDfu);
	}

	/* ==== Event: Receipt of the AT91C_DFU_GETSTATE request ==== */
	else if (bRequest == AT91C_DFU_GETSTATE) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuMANIFEST_SYNC;
		AT91F_DfuDescGetState(pDfu);
	}
	/* ==== Event: Receipt of any other DFU class-specific request ==== */
	else {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuERROR;
		AT91F_DfuDescError(pDfu);
	}
}

/* ************************************************************** */
/* **** dfuState7: Handle requests in dfuMANIFEST_SYNC state **** */
/* ************************************************************** */
void AT91F_DfuDescState7(
	AT91PS_DfuDesc  pDfu,    /* DFU handler */
	AT91PS_UsbSetup pSetup)  /* Descriptor type */
{
	/* ==== Event: Receipt of any other DFU class-specific request ==== */
	pDfu->dfuStatus.bState = AT91C_DFU_dfuERROR;
	AT91F_DfuDescError(pDfu);
}

/* ******************************************************************** */
/* **** dfuState8: Handle requests in dfuMANIFEST_WAIT_RESET state **** */
/* ******************************************************************** */
void AT91F_DfuDescState8(
	AT91PS_DfuDesc  pDfu,    /* DFU handler */
	AT91PS_UsbSetup pSetup)  /* Descriptor type */
{
	/* ==== Event: Receipt of any other DFU class-specific request ==== */
	pDfu->dfuStatus.bState = AT91C_DFU_dfuMANIFEST_WAIT_RESET;
}

/* ************************************************************ */
/* **** dfuState9: Handle requests in dfuUPLOAD_IDLE state **** */
/* ************************************************************ */
void AT91F_DfuDescState9(
	AT91PS_DfuDesc  pDfu,    /* DFU handler */
	AT91PS_UsbSetup pSetup)  /* Descriptor type */
{
	register char           bRequest = pSetup->bRequest;
	register unsigned short wLength  = pSetup->wLength;
	//register USBDfuMem      *pMem    = pDfu->pMem;

	/* ==== Event: Receipt of the AT91C_DFU_UPLOAD request wLength > 0 ==== */
	if ((bRequest == AT91C_DFU_UPLOAD) && (wLength > 0)) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuUPLOAD_IDLE;
		pDfu->Upload(pDfu, wLength);
	}
	/* ==== Event: Receipt of the AT91C_DFU_ABORT request  ==== */
	else if (bRequest == AT91C_DFU_ABORT) {
		/* Host is terminating teh current download transfer */
		pDfu->dfuStatus.bState = AT91C_DFU_dfuIDLE;
	}
	/* ==== Event: Receipt of the AT91C_DFU_GETSTATUS request ==== */
	else if (bRequest == AT91C_DFU_GETSTATUS) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuUPLOAD_IDLE;
		AT91F_DfuDescGetStatus(pDfu);
	}
	/* ==== Event: Receipt of the AT91C_DFU_GETSTATE request ==== */
	else if (bRequest == AT91C_DFU_GETSTATE) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuUPLOAD_IDLE;
		AT91F_DfuDescGetState(pDfu);
	}
	/* ==== Event: Receipt of any other DFU class-specific request ==== */
	else {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuERROR;
		AT91F_DfuDescError(pDfu);
	}
}

/* ******************************************************* */
/* **** dfuState10: Handle requests in dfuERROR state **** */
/* ******************************************************* */
void AT91F_DfuDescState10(
	AT91PS_DfuDesc  pDfu,    /* DFU handler */
	AT91PS_UsbSetup pSetup)  /* Descriptor type */
{
	register char           bRequest = pSetup->bRequest;

	/* ==== Event: Receipt of the AT91C_DFU_GETSTATUS request ==== */
	if (bRequest == AT91C_DFU_GETSTATUS) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuERROR;
		AT91F_DfuDescGetStatus(pDfu);
	}
	/* ==== Event: Receipt of the AT91C_DFU_GETSTATE request ==== */
	else if (bRequest == AT91C_DFU_GETSTATE) {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuERROR;
		AT91F_DfuDescGetState(pDfu);
	}
	/* ==== Event: Receipt of the AT91C_DFU_CLRSTATUS request  ==== */
	else if (bRequest == AT91C_DFU_CLRSTATUS) {
		pDfu->dfuStatus.bStatus = AT91C_DFU_OK;
		pDfu->dfuStatus.bState  = AT91C_DFU_dfuIDLE;
	}
	/* ==== Event: Receipt of any other DFU class-specific request ==== */
	else {
		pDfu->dfuStatus.bState = AT91C_DFU_dfuERROR;
		AT91F_DfuDescError(pDfu);
	}
}

/* ============================================================================ */
/* ============================================================================ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -