?? obj_dfudesc.c
字號:
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);
}
}
/* ============================================================================ */
/* ============================================================================ */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -