3838static volatile u32 userAppAddr = USER_CODE_RAM ; /* default RAM user code location */
3939static volatile u32 userAppEnd = RAM_END ;
4040static volatile DFUStatus dfuAppStatus ; /* includes state */
41- static volatile bool userFlash = FALSE ;
41+ volatile dfuUploadTypes_t userUploadType = DFU_UPLOAD_NONE ;
4242volatile bool dfuBusy = FALSE;
4343
4444static volatile u8 recvBuffer [wTransferSize ] __attribute__((aligned (4 )));
@@ -61,7 +61,7 @@ void dfuInit(void) {
6161 thisBlockLen = 0 ;;
6262 userAppAddr = USER_CODE_RAM ; /* default RAM user code location */
6363 userAppEnd = RAM_END ;
64- userFlash = FALSE ;
64+ userUploadType = DFU_UPLOAD_RAM ;
6565 code_copy_lock = WAIT ;
6666 dfuBusy = FALSE;
6767}
@@ -83,19 +83,34 @@ bool dfuUpdateByRequest(void) {
8383 if (pInformation -> USBwLengths .w > 0 ) {
8484 userFirmwareLen = 0 ;
8585 dfuAppStatus .bState = dfuDNLOAD_SYNC ;
86-
87- if (pInformation -> Current_AlternateSetting == 1 ) {
88- userAppAddr = USER_CODE_FLASH ;
89- userFlash = TRUE;
90-
91- /* make sure the flash is setup properly, unlock it */
92- setupFLASH ();
93- flashUnlock ();
94-
95- } else {
96- userAppAddr = USER_CODE_RAM ;
97- userFlash = FALSE;
98- }
86+ switch (pInformation -> Current_AlternateSetting )
87+ {
88+ case 0 :
89+ userAppAddr = USER_CODE_RAM ;
90+ userUploadType = DFU_UPLOAD_RAM ;
91+ break ;
92+ case 1 :
93+ userAppAddr = USER_CODE_FLASH0X8005000 ;
94+ userUploadType = DFU_UPLOAD_FLASH_0X8005000 ;
95+
96+ /* make sure the flash is setup properly, unlock it */
97+ setupFLASH ();
98+ flashUnlock ();
99+ // Clear lower memory so that we can check on cold boot, whether the last upload was to 0x8002000 or 0x8005000
100+ flashErasePage ((u32 )USER_CODE_FLASH0X8002000 );
101+ break ;
102+ case 2 :
103+ userUploadType = DFU_UPLOAD_FLASH_0X8002000 ;
104+ userAppAddr = USER_CODE_FLASH0X8002000 ;
105+ /* make sure the flash is setup properly, unlock it */
106+ setupFLASH ();
107+ flashUnlock ();
108+ break ;
109+ default :
110+ userAppAddr = USER_CODE_RAM ;
111+ userUploadType = DFU_UPLOAD_RAM ;
112+ break ;
113+ }
99114 } else {
100115 dfuAppStatus .bState = dfuERROR ;
101116 dfuAppStatus .bStatus = errNOTDONE ;
@@ -108,13 +123,24 @@ bool dfuUpdateByRequest(void) {
108123 thisBlockLen = uploadBlockLen ; /* for this first block as well */
109124 /* calculate where the data should be copied from */
110125 userFirmwareLen = uploadBlockLen * pInformation -> USBwValue ;
111- if (pInformation -> Current_AlternateSetting == 1 ) {
112- userAppAddr = USER_CODE_FLASH ;
113- userAppEnd = FLASH_END ;
114- } else {
115- userAppAddr = USER_CODE_RAM ;
116- userAppEnd = RAM_END ;
117- }
126+ switch (pInformation -> Current_AlternateSetting )
127+ {
128+ case 0 :
129+ userAppAddr = USER_CODE_RAM ;
130+ userAppEnd = RAM_END ;
131+ case 1 :
132+ userAppAddr = USER_CODE_FLASH0X8005000 ;
133+ userAppEnd = FLASH_END ;
134+ break ;
135+ case 2 :
136+ userAppAddr = USER_CODE_FLASH0X8002000 ;
137+ userAppEnd = FLASH_END ;
138+ break ;
139+ default :
140+ userAppAddr = USER_CODE_RAM ;
141+ userAppEnd = RAM_END ;
142+ break ;
143+ }
118144 } else if (pInformation -> USBbRequest == DFU_ABORT ) {
119145 dfuAppStatus .bState = dfuIDLE ;
120146 dfuAppStatus .bStatus = OK ; /* are we really ok? we were just aborted */
@@ -132,7 +158,7 @@ bool dfuUpdateByRequest(void) {
132158
133159 if (pInformation -> USBbRequest == DFU_GETSTATUS ) {
134160 /* todo, add routine to wait for last block write to finish */
135- if (userFlash ) {
161+ if (userUploadType == DFU_UPLOAD_RAM ) {
136162 if (code_copy_lock == WAIT ) {
137163 code_copy_lock = BEGINNING ;
138164 dfuAppStatus .bwPollTimeout0 = 0x20 ; /* 32 ms */
@@ -358,15 +384,25 @@ void dfuCopyBufferToExec() {
358384 int i ;
359385 u32 * userSpace ;
360386
361- if (!userFlash ) {
387+ if (userUploadType == DFU_UPLOAD_RAM )
388+ {
362389 userSpace = (u32 * )(USER_CODE_RAM + userFirmwareLen );
363390 /* we dont need to handle when thisBlock len is not divisible by 4,
364391 since the linker will align everything to 4B anyway */
365392 for (i = 0 ; i < thisBlockLen ; i = i + 4 ) {
366393 * userSpace ++ = * (u32 * )(recvBuffer + i );
367394 }
368- } else {
369- userSpace = (u32 * )(USER_CODE_FLASH + userFirmwareLen );
395+ }
396+ else
397+ {
398+ if (userUploadType == DFU_UPLOAD_FLASH_0X8005000 )
399+ {
400+ userSpace = (u32 * )(USER_CODE_FLASH0X8005000 + userFirmwareLen );
401+ }
402+ else
403+ {
404+ userSpace = (u32 * )(USER_CODE_FLASH0X8002000 + userFirmwareLen );
405+ }
370406
371407 flashErasePage ((u32 )(userSpace ));
372408
@@ -394,7 +430,7 @@ bool dfuUploadStarted() {
394430
395431void dfuFinishUpload () {
396432 while (1 ) {
397- if (userFlash ) {
433+ if (userUploadType == DFU_UPLOAD_RAM ) {
398434 if (code_copy_lock == BEGINNING ) {
399435 code_copy_lock = MIDDLE ;
400436 strobePin (LED_BANK , LED , 2 , 0x1000 );
0 commit comments