From 38400a2e06ecd969119e7c7f8ef91075e0a8eb0f Mon Sep 17 00:00:00 2001 From: Sergey Date: Sun, 5 Apr 2020 09:12:23 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A7=D0=B8=D1=81=D1=82=D0=BA=D0=B0,=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B5?= =?UTF-8?q?=D1=81=D1=81=D0=B0=20=D0=BD=D0=B0=20=D1=8D=D0=BA=D1=80=D0=B0?= =?UTF-8?q?=D0=BD,=20=D0=B8=D0=BC=D1=8F=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= =?UTF-8?q?=20=D0=B2=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=B5=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/module/mks_wifi/mks_wifi.cpp | 27 ++---- Marlin/src/module/mks_wifi/mks_wifi.h | 1 - .../src/module/mks_wifi/mks_wifi_gcodes.cpp | 10 +- Marlin/src/module/mks_wifi/mks_wifi_sd.cpp | 94 +++++++++++-------- Marlin/src/module/mks_wifi/mks_wifi_sd.h | 3 + .../PlatformIO/scripts/mks_robin_nano.py | 4 + 6 files changed, 72 insertions(+), 67 deletions(-) diff --git a/Marlin/src/module/mks_wifi/mks_wifi.cpp b/Marlin/src/module/mks_wifi/mks_wifi.cpp index 6b58ca0c96..c0cd267170 100644 --- a/Marlin/src/module/mks_wifi/mks_wifi.cpp +++ b/Marlin/src/module/mks_wifi/mks_wifi.cpp @@ -23,7 +23,7 @@ void mks_wifi_init(void){ SET_OUTPUT(MKS_WIFI_IO_RST); WRITE(MKS_WIFI_IO_RST, LOW); - ui.set_status((const char *)"WIFI init",false); + ui.set_status((const char *)"WIFI: waiting... ",false); safe_delay(1000); WRITE(MKS_WIFI_IO_RST, HIGH); @@ -61,11 +61,6 @@ void mks_wifi_set_param(void){ mks_wifi_send(esp_packet, packet_size); } -/* Тестовая функция на обработчик EXTI прерывания */ -void mks_wifi_io0_irq(void){ - INFO("IO0 Irq"); -} - /* Получает данные из всех функций, как только есть перевод строки 0x0A, формирует пакет для @@ -79,12 +74,11 @@ void mks_wifi_out_add(uint8_t *data, uint32_t size){ if(*data == 0x0a){ //Переводы строки внутри формирования пакета //Перевод строки => сформировать пакет, отправить, сбросить индекс - esp_frame.type=ESP_TYPE_FILE_FIRST; + esp_frame.type=ESP_TYPE_FILE_FIRST; //Название типа из прошивки MKS. Смысла не имееет. esp_frame.dataLen=strnlen((char *)mks_out_buffer,ESP_PACKET_DATA_MAX_SIZE); esp_frame.data=mks_out_buffer; packet_size=mks_wifi_build_packet(esp_packet,&esp_frame); - //DEBUG("Send %s",mks_out_buffer); //выпихнуть в uart mks_wifi_send(esp_packet, packet_size); //очистить буфер @@ -112,8 +106,6 @@ uint8_t mks_wifi_input(uint8_t data){ static uint16_t payload_size=ESP_PACKET_DATA_MAX_SIZE; uint8_t ret_val=1; - - if(data == ESP_PROTOC_HEAD){ payload_size = ESP_PACKET_DATA_MAX_SIZE; packet_start_flag=1; @@ -193,8 +185,11 @@ void mks_wifi_parse_packet(ESP_PROTOC_FRAME *packet){ break; case ESP_TYPE_FILE_FIRST: DEBUG("[FILE_FIRST]"); - //WRITE(MKS_WIFI_IO4, HIGH); - mks_wifi_start_file_upload(packet); + //Передача файла останавливает все процессы, + //поэтому печать в этот момент не возможна. + if (!CardReader::isPrinting()){ + mks_wifi_start_file_upload(packet); + } break; case ESP_TYPE_FILE_FRAGMENT: DEBUG("[FILE_FRAGMENT]"); @@ -209,14 +204,6 @@ void mks_wifi_parse_packet(ESP_PROTOC_FRAME *packet){ } } -/* -Функция парсер пакета: - //Получить размер фрагмента - //получить номер фрагмента - //Сохранить данные в файл - //Если последний фрагмент - вернуть флаг -*/ - void mks_wifi_print_var(uint8_t count, ...){ va_list args; diff --git a/Marlin/src/module/mks_wifi/mks_wifi.h b/Marlin/src/module/mks_wifi/mks_wifi.h index 7749c21bcf..62d0f46021 100644 --- a/Marlin/src/module/mks_wifi/mks_wifi.h +++ b/Marlin/src/module/mks_wifi/mks_wifi.h @@ -50,7 +50,6 @@ typedef struct void mks_wifi_init(void); -void mks_wifi_io0_irq(void); void mks_wifi_set_param(void); uint8_t mks_wifi_input(uint8_t data); diff --git a/Marlin/src/module/mks_wifi/mks_wifi_gcodes.cpp b/Marlin/src/module/mks_wifi/mks_wifi_gcodes.cpp index 54ec364198..09780d7ae5 100644 --- a/Marlin/src/module/mks_wifi/mks_wifi_gcodes.cpp +++ b/Marlin/src/module/mks_wifi/mks_wifi_gcodes.cpp @@ -44,7 +44,7 @@ void mks_m105(void){ void mks_m997(void){ - static uint8_t call_cnt=0; +// static uint8_t call_cnt=0; if(CardReader::isPrinting()){ mks_wifi_out_add((uint8_t *)m997_printing,strlen(m997_printing)); @@ -54,10 +54,10 @@ void mks_m997(void){ mks_wifi_out_add((uint8_t *)m997_idle,strlen(m997_idle)); } - if(call_cnt == 0){ - call_cnt=1; - mks_wifi_send((uint8_t *)pak, 4); //Внутри +1 - } + // if(call_cnt == 0){ + // call_cnt=1; + // mks_wifi_send((uint8_t *)pak, 4); //Внутри +1 + // } } diff --git a/Marlin/src/module/mks_wifi/mks_wifi_sd.cpp b/Marlin/src/module/mks_wifi/mks_wifi_sd.cpp index f9820c8a60..c89f3794da 100644 --- a/Marlin/src/module/mks_wifi/mks_wifi_sd.cpp +++ b/Marlin/src/module/mks_wifi/mks_wifi_sd.cpp @@ -7,14 +7,11 @@ FRESULT result; FATFS FATFS_Obj; FIL upload_file; - -volatile uint8_t __attribute__ ((aligned (4))) dma_buff1[1030]; -volatile uint8_t __attribute__ ((aligned (4))) dma_buff2[1030]; +volatile uint8_t __attribute__ ((aligned (4))) dma_buff1[ESP_PACKET_SIZE]; +volatile uint8_t __attribute__ ((aligned (4))) dma_buff2[ESP_PACKET_SIZE]; +volatile uint8_t *dma_buff[] = {dma_buff1,dma_buff2}; volatile uint8_t dma_buff_index=0; -volatile uint8_t *dma_buff_ptr; -volatile uint32_t dma_timeout; -volatile uint8_t *save; -volatile uint16_t data_size; +volatile uint8_t *buff; void mks_wifi_sd_init(void){ CardReader::release(); @@ -44,7 +41,8 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ uint32_t file_size, file_inc_size, file_size_writen; uint32_t dma_count; uint32_t usart1_brr; - + uint32_t dma_timeout; + uint16_t data_size; FRESULT res; mks_wifi_sd_init(); @@ -68,10 +66,14 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ //открыть файл для записи f_open((FIL *)&upload_file,str,FA_CREATE_ALWAYS | FA_WRITE); + ui.set_status((const char *)"Upload file...",true); + ui.update(); + //Выключить прием по UART RX, включить через DMA, изменить скорость, Выставить флаг приема по DMA USART1->CR1 = 0; safe_delay(100); + //Сохранение делителя, чтобы потом восстановить usart1_brr = USART1->BRR; USART1->CR1 = USART_CR1_UE; @@ -80,11 +82,13 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ USART1->CR3 = USART_CR3_DMAR; USART1->CR1 |= USART_CR1_RE; - dma_buff_ptr=(uint8_t*)&dma_buff1; dma_buff_index=0; + memset((uint8_t*)dma_buff[0],0,ESP_PACKET_SIZE); + memset((uint8_t*)dma_buff[1],0,ESP_PACKET_SIZE); /* - Прием пакета начинается примерно через 2 секунды + Прием пакета с данными начинается примерно через 2 секунды + после переключения скорости. Без этой тупой задержки, UART успевает принять мусор, до пакета с данными и все ломается */ @@ -92,8 +96,8 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ DMA1_Channel5->CCR = DMA_CCR_PL|DMA_CCR_MINC; DMA1_Channel5->CPAR = (uint32_t)&USART1->DR; - DMA1_Channel5->CMAR = (uint32_t)dma_buff_ptr; - DMA1_Channel5->CNDTR = 1024; + DMA1_Channel5->CMAR = (uint32_t)dma_buff[dma_buff_index]; + DMA1_Channel5->CNDTR = ESP_PACKET_SIZE; DMA1->IFCR = DMA_IFCR_CGIF5|DMA_IFCR_CTEIF5|DMA_IFCR_CHTIF5|DMA_IFCR_CTCIF5; DMA1_Channel5->CCR |= DMA_CCR_EN; @@ -103,52 +107,55 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ file_size_writen = 0; //Счетчик записанных в файл данных dma_timeout = DMA_TIMEOUT; //Тайм-аут, на случай если передача зависла. - while(dma_timeout > 0){ + + while(dma_timeout-- > 0){ if(DMA1->ISR & DMA_ISR_TCIF5){ DMA1->IFCR = DMA_IFCR_CGIF5|DMA_IFCR_CTEIF5|DMA_IFCR_CHTIF5|DMA_IFCR_CTCIF5; + //Указатель на полученный буфер + buff=dma_buff[dma_buff_index]; + //переключить индекс + dma_buff_index = (dma_buff_index) ? 0 : 1; + DMA1_Channel5->CCR = DMA_CCR_PL|DMA_CCR_MINC; DMA1_Channel5->CPAR = (uint32_t)&USART1->DR; - if(dma_buff_index == 0){ - dma_buff_index=1; - dma_buff_ptr=(uint8_t*)&dma_buff2; - save=(uint8_t*)&dma_buff1; - }else{ - dma_buff_index=0; - dma_buff_ptr=(uint8_t*)&dma_buff1; - save=(uint8_t*)&dma_buff2; - } - DMA1_Channel5->CMAR = (uint32_t)dma_buff_ptr; - DMA1_Channel5->CNDTR = 1024; + DMA1_Channel5->CMAR = (uint32_t)dma_buff[dma_buff_index]; + DMA1_Channel5->CNDTR = ESP_PACKET_SIZE; DMA1_Channel5->CCR |= DMA_CCR_EN; - WRITE(MKS_WIFI_IO4, HIGH); + WRITE(MKS_WIFI_IO4, HIGH); //Остановить передачу от ESP + + if(*buff != ESP_PROTOC_HEAD){ + ERROR("Wrong packet head"); + break; + } + + data_size = (*(buff+3) << 8) | *(buff+2); + file_inc_size += (data_size - 4); //4 байта с номером сегмента и флагами - data_size = (*(save+3) << 8) | *(save+2); - file_inc_size += (data_size - 4); DEBUG("[%d]Save %d bytes (%d of %d) ",dma_count,data_size,file_inc_size,file_size); - - res=f_write((FIL *)&upload_file,(uint8_t*)(save+8),(data_size-4),&bytes_writen); + res=f_write((FIL *)&upload_file,(uint8_t*)(buff+8),(data_size-4),&bytes_writen); if(res){ ERROR("Write err %d",res); break; } + file_size_writen+=bytes_writen; + f_sync((FIL *)&upload_file); - sprintf(str,"%ld/%ld",file_inc_size,file_size); - ui.set_status((const char *)str,false); + sprintf(str,"Upload %ld%%",file_inc_size*100/file_size); + ui.set_status((const char *)str,true); + ui.update(); - file_size_writen+=bytes_writen; + WRITE(MKS_WIFI_IO4, LOW); //Записано, сигнал ESP продолжать - f_sync((FIL *)&upload_file); - WRITE(MKS_WIFI_IO4, LOW); - - if(*(save+7) == 0x80){ + + if(*(buff+7) == 0x80){ DEBUG("Last packet"); break; } - memset((uint8_t*)save,0,1024); + memset((uint8_t*)buff,0,ESP_PACKET_SIZE); dma_count++; dma_timeout = DMA_TIMEOUT; } @@ -156,27 +163,29 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ if(DMA1->ISR & DMA_ISR_TEIF5){ ERROR("DMA Error"); } - - dma_timeout=dma_timeout-1; + } f_close((FIL *)&upload_file); if( (file_size == file_inc_size) && (file_size == file_size_writen) ){ - ui.set_status((const char *)"Upload done",false); + ui.set_status((const char *)"Upload done",true); + ui.update(); DEBUG("Upload ok"); }else{ - ui.set_status((const char *)"Upload failed",false); + ui.set_status((const char *)"Upload failed",true); DEBUG("Upload failed: %d; Recieve %d; SD write %d",file_size,file_inc_size,file_size_writen); } + //Восстановить USART1 USART1->CR1 = 0; USART1->CR1 = (USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE); USART1->CR3 = 0; USART1->BRR = usart1_brr; USART1->CR1 |= USART_CR1_UE; + //Выключить DMA DMA1->IFCR = DMA_IFCR_CGIF5|DMA_IFCR_CTEIF5|DMA_IFCR_CHTIF5|DMA_IFCR_CTCIF5; DMA1_Channel5->CCR = 0; DMA1_Channel5->CPAR = 0; @@ -184,6 +193,9 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ DMA1_Channel5->CNDTR = 0; mks_wifi_sd_deinit(); + + WRITE(MKS_WIFI_IO4, LOW); //Включить передачу от ESP + DEBUG("Settings restored"); } diff --git a/Marlin/src/module/mks_wifi/mks_wifi_sd.h b/Marlin/src/module/mks_wifi/mks_wifi_sd.h index f22dc2fe59..b685cf4168 100644 --- a/Marlin/src/module/mks_wifi/mks_wifi_sd.h +++ b/Marlin/src/module/mks_wifi/mks_wifi_sd.h @@ -7,6 +7,9 @@ #include "../../sd/cardreader.h" #include "small_cmsis.h" + +#define ESP_PACKET_SIZE 1024 + void mks_wifi_sd_init(void); void mks_wifi_sd_deinit(void); void sd_delete_file(char *filename); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_nano.py b/buildroot/share/PlatformIO/scripts/mks_robin_nano.py index a68fd308d4..f19e28e1ff 100755 --- a/buildroot/share/PlatformIO/scripts/mks_robin_nano.py +++ b/buildroot/share/PlatformIO/scripts/mks_robin_nano.py @@ -18,6 +18,7 @@ for i, flag in enumerate(env["LINKFLAGS"]): # Encrypt ${PROGNAME}.bin and save it as 'Robin_nano.bin' def encrypt(source, target, env): import sys + import shutil key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] @@ -37,4 +38,7 @@ def encrypt(source, target, env): finally: firmware.close() robin.close() + source = target[0].dir.path +'/Robin_nano.bin' + destination = target[0].dir.path +'/Robin_nano35.bin' + shutil.copyfile(source, destination) env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt);