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

📄 obj_dfudesc.c

📁 at91rm9200的一级bootloader
💻 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 + -