@@ -339,6 +339,147 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(esp_set_native_code_location_obj, esp_set_nativ
339
339
340
340
#endif
341
341
342
+ /*
343
+ #include <stdarg.h>
344
+ int mp_vprintf(const mp_print_t *print, const char *fmt, va_list args);
345
+ STATIC void _strncat(char *data, const char *str, size_t len){
346
+ int len_data = strlen(data);
347
+ memcpy(&data[len_data], str, len);
348
+ data[len_data+len] = 0;
349
+ }
350
+
351
+ STATIC int _sprintf(char *_buf, const char *fmt, ...) {
352
+ mp_print_t buf = {(void*)_buf, _strncat};
353
+ va_list ap;
354
+ va_start(ap, fmt);
355
+ int ret = mp_vprintf(&buf, fmt, ap);
356
+ va_end(ap);
357
+ return ret;
358
+ }
359
+
360
+ STATIC void showMemory(char *ptr, size_t size){
361
+ char buf[16];
362
+ for(int x=0; x<size;){
363
+ buf[0] = 0;
364
+ _sprintf(&buf[0], "%02x ", ptr[x++]);
365
+ if(x%32==0)_sprintf(&buf[0], "\r\n");
366
+ else if(x%16==0)_sprintf(&buf[0], " ");
367
+ else if(x%8==0)_sprintf(&buf[0], " ");
368
+ mp_hal_stdout_tx_str(&buf[0]);
369
+ ets_loop_iter();
370
+ }
371
+ mp_hal_stdout_tx_str("\r\n");
372
+ }
373
+ STATIC mp_obj_t esp_showMemory(mp_obj_t _start, mp_obj_t _size) {
374
+ showMemory((char*)mp_obj_get_int(_start), mp_obj_get_int(_size));
375
+ return mp_const_none;
376
+ }
377
+ STATIC MP_DEFINE_CONST_FUN_OBJ_2(esp_showMemory_obj, esp_showMemory);
378
+ */
379
+ #ifdef MICROPY_DFU
380
+ uint16_t dfu_blks [256 ];
381
+ uint16_t dfu_offs [256 ];
382
+ int dfu_nblks = -1 ;
383
+ uint32_t dfu_fwsize = 0 ;
384
+
385
+ /* Firmware update codes must be put into IRAM, or will crash while flashing halfway! */
386
+ void MP_FASTCODE (erase_sector )(int sector ) {
387
+ char * ptr = FLASH_START + sector * FLASH_SEC_SIZE ;
388
+ for (char * PTR = ptr + FLASH_SEC_SIZE ; ptr < PTR ; ptr ++ ) {
389
+ if (* ptr != 0xff ) {
390
+ SPIEraseSector (sector );
391
+ break ;
392
+ }
393
+ }
394
+ }
395
+ void MP_FASTCODE (DFU )(char * dfu_buf , int n_fwblks , int n_erase ) {
396
+ for (int x = 0 ; x < n_fwblks ; x ++ ) {
397
+ erase_sector (x );
398
+ // uart_tx_one_char(0, 'E');
399
+ }
400
+
401
+ int cur_write_pos = 0 ;
402
+ int cur_write_sz ;
403
+ int remaining_sz = dfu_fwsize ;
404
+
405
+ for (int x = 0 ; x < dfu_nblks && remaining_sz > 0 ; x ++ ) {
406
+ cur_write_sz = FLASH_SEC_SIZE - dfu_offs [x ];
407
+ if (remaining_sz < cur_write_sz ) {
408
+ cur_write_sz = remaining_sz ;
409
+ }
410
+
411
+ Cache_Read_Disable_2 ();
412
+ SPIRead (1048576 + FLASH_SEC_SIZE * dfu_blks [x ] + dfu_offs [x ], (uint32_t * )dfu_buf , cur_write_sz );
413
+ Cache_Read_Enable_2 ();
414
+ // uart_tx_one_char(0, 'R');
415
+ if (x == 0 ) {
416
+ dfu_buf [3 ] = 64 ;
417
+ }
418
+ SPIWrite (cur_write_pos , (uint32_t * )dfu_buf , cur_write_sz );
419
+ // uart_tx_one_char(0, 'W');
420
+
421
+ cur_write_pos += cur_write_sz ;
422
+ remaining_sz -= cur_write_sz ;
423
+ wdt_feed ();
424
+ }
425
+
426
+ for (int x = n_fwblks ; x < n_erase ; x ++ ) {
427
+ erase_sector (x );
428
+ // uart_tx_one_char(0, 'E');
429
+ }
430
+
431
+ asm ("memw" );
432
+ asm ("isync" );
433
+ // rom_phy_reset_req();
434
+ system_restart_core ();
435
+ // return cur_write_pos;
436
+ }
437
+ STATIC mp_obj_t esp_DFU (mp_obj_t erase_all ) {
438
+ extern char flashchip ;
439
+ SpiFlashChip * flash = (SpiFlashChip * )(& flashchip + 4 );
440
+ char * buf = malloc (FLASH_SEC_SIZE );
441
+ if (buf == NULL ) {
442
+ mp_raise_OSError (MP_ENOMEM );
443
+ return mp_const_none ;
444
+ }
445
+
446
+ ets_wdt_disable ();
447
+ disable_irq ();
448
+ DFU (buf , dfu_fwsize / FLASH_SEC_SIZE + (dfu_fwsize % FLASH_SEC_SIZE ?1 :0 ), mp_obj_is_true (erase_all )?(flash -> chip_size / FLASH_SEC_SIZE ):0 );
449
+
450
+ // It will NEVER reach here even if flash failed
451
+ // enable_irq(state);
452
+ // ets_wdt_enable();
453
+
454
+ return mp_const_none ;
455
+ }
456
+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (esp_DFU_obj , esp_DFU );
457
+
458
+ STATIC mp_obj_t esp_set_dfu (mp_obj_t counter , mp_obj_t fsize ) {
459
+ dfu_nblks = mp_obj_get_int (counter );
460
+ dfu_fwsize = mp_obj_get_int (fsize );
461
+ return mp_const_none ;
462
+ }
463
+ STATIC MP_DEFINE_CONST_FUN_OBJ_2 (esp_set_dfu_obj , esp_set_dfu );
464
+
465
+ STATIC mp_obj_t esp_get_blks () {
466
+ if (dfu_nblks <= 0 ) {
467
+ return mp_obj_new_list (0 , NULL ), mp_obj_new_list (0 , NULL );
468
+ }
469
+ mp_obj_t ret1 = mp_obj_new_list (0 , NULL );
470
+ mp_obj_t ret2 = mp_obj_new_list (0 , NULL );
471
+ for (int x = 0 ; x < dfu_nblks ; x ++ ) {
472
+ mp_obj_list_append (ret1 , mp_obj_new_int (dfu_blks [x ]));
473
+ mp_obj_list_append (ret2 , mp_obj_new_int (dfu_offs [x ]));
474
+ }
475
+ mp_obj_t ret = mp_obj_new_list (0 , NULL );
476
+ mp_obj_list_append (ret , ret1 );
477
+ mp_obj_list_append (ret , ret2 );
478
+ return ret ;
479
+ }
480
+ STATIC MP_DEFINE_CONST_FUN_OBJ_0 (esp_get_blks_obj , esp_get_blks );
481
+ #endif
482
+
342
483
STATIC const mp_rom_map_elem_t esp_module_globals_table [] = {
343
484
{ MP_ROM_QSTR (MP_QSTR___name__ ), MP_ROM_QSTR (MP_QSTR_esp ) },
344
485
@@ -351,6 +492,14 @@ STATIC const mp_rom_map_elem_t esp_module_globals_table[] = {
351
492
{ MP_ROM_QSTR (MP_QSTR_flash_erase ), MP_ROM_PTR (& esp_flash_erase_obj ) },
352
493
{ MP_ROM_QSTR (MP_QSTR_flash_size ), MP_ROM_PTR (& esp_flash_size_obj ) },
353
494
{ MP_ROM_QSTR (MP_QSTR_flash_user_start ), MP_ROM_PTR (& esp_flash_user_start_obj ) },
495
+
496
+ #ifdef MICROPY_DFU
497
+ { MP_ROM_QSTR (MP_QSTR_DFU ), MP_ROM_PTR (& esp_DFU_obj ) },
498
+ // { MP_ROM_QSTR(MP_QSTR_showMemory), MP_ROM_PTR(&esp_showMemory_obj) },
499
+ { MP_ROM_QSTR (MP_QSTR_set_dfu ), MP_ROM_PTR (& esp_set_dfu_obj ) },
500
+ { MP_ROM_QSTR (MP_QSTR_get_blks ), MP_ROM_PTR (& esp_get_blks_obj ) },
501
+ #endif
502
+
354
503
#if MICROPY_ESP8266_APA102
355
504
{ MP_ROM_QSTR (MP_QSTR_apa102_write ), MP_ROM_PTR (& esp_apa102_write_obj ) },
356
505
#endif
0 commit comments