#include "OTA_H.h" #include "eflash_drv.h" #include "uart.h" #include "bsp.h" #include "pit.h" #include "pit32_drv.h" #include "ioctrl_drv.h" #include "usb_drv.h" #include "usb_const.h" #include "meg.h" #include "Flash.h" #include "wdt_drv.h" /****************test************************/ extern unsigned int number1 ; unsigned int ota_lt7689(unsigned char * updata_p,unsigned int length , unsigned int flash_addr) { EFLASH_Init(g_sys_clk/1000); EFLASH_SetWritePermission(); EFLASH_Write(flash_addr,updata_p,length); EFLASH_ClrWritePermission(); return 0; } unsigned int ota_ui(unsigned int addr , unsigned char * ota_lt_buf , unsigned int length,unsigned short offset)//2048 一页 { // for(unsigned char i=0;i<1;i++) // { // pWrBuf = &(vcom_buf[id][i*2048]); // pageAddr = (vcom_rp[id].wrAddr+i*2048)/2048; W25N01GV_WritePageAddr_Data(ota_lt_buf,offset,addr,length); // } return 0; } /* Idle interrupt reception(SCI1) */ /*For debug */ uint8_t Rx_Buffer_short[512] = {0}; //256 uint8_t Rx_Buffer1_short[512] = {0}; //256 uint16_t Rx_Count_short = 0; #include "dmac_drv.h" #define Uart_Channel 2 //DMA channel DMA_CHANNEL_REG *sci_dma_channel[2][DMAC_CHNUM] = {{(DMA_CHANNEL_REG *)(DMA1_BASE_ADDR ),(DMA_CHANNEL_REG *)(DMA1_BASE_ADDR + 0x58 ), (DMA_CHANNEL_REG *)(DMA1_BASE_ADDR + 0xB0 ),(DMA_CHANNEL_REG *)(DMA1_BASE_ADDR + 0x108)}, {(DMA_CHANNEL_REG *)(DMA2_BASE_ADDR ),(DMA_CHANNEL_REG *)(DMA2_BASE_ADDR + 0x58 ), (DMA_CHANNEL_REG *)(DMA2_BASE_ADDR + 0xB0 ),(DMA_CHANNEL_REG *)(DMA2_BASE_ADDR + 0x108)}};//global struct variable for for Channel registers DMA_CONTROL_REG *sci_dma_control[2] = {(DMA_CONTROL_REG*)(DMA1_BASE_ADDR+0x2C0), (DMA_CONTROL_REG*)(DMA2_BASE_ADDR+0x2C0)};//global struct variable for for DMAC registers uint16_t dma_uartRX(UART_TypeDef *UARTx,uint8_t n, uint8_t *dest,uint32_t len) { uint8_t dmaNum = 0; uint16_t ret = 0; uint16_t temp = 0; if(UARTx == SCI2) { dmaNum =1; } else //SCI1 SCI3 { dmaNum =0; } sci_dma_control[dmaNum]->DMA_CHEN &= (~(CHANNEL_WRITE_ENABLE(n)|CHANNEL_ENABLE(n)));////DMA disable sci_dma_control[dmaNum]->DMA_CONFIG = 0; sci_dma_channel[dmaNum][n]->DMA_SADDR = (uint32_t)&UARTx->SCIDRL; sci_dma_channel[dmaNum][n]->DMA_DADDR = (uint32_t)dest; sci_dma_channel[dmaNum][n]->DMA_CTRL = DIEC|SNOCHG|P2M_DMA; sci_dma_channel[dmaNum][n]->DMA_CTRL_HIGH = len; sci_dma_control[dmaNum]->DMA_CONFIG = 1; sci_dma_channel[dmaNum][n]->DMA_CFG = (HS_SEL_SRC_HARD)|(HS_SEL_DST_SOFT)|(FIFO_EMPTY)|(CH_PRIOR2); if(UARTx == SCI1) { sci_dma_channel[dmaNum][n]->DMA_CFG_HIGH = (0xb<<7); } else if(UARTx == SCI2) { sci_dma_channel[dmaNum][n]->DMA_CFG_HIGH = (0x0<<7); } else { sci_dma_channel[dmaNum][n]->DMA_CFG_HIGH = (0xd<<7); } sci_dma_control[dmaNum]->DMA_CHEN |= (CHANNEL_WRITE_ENABLE(n)|CHANNEL_ENABLE(n)); return ret; } uint32_t DMA_uart_GetRecvLen(UART_TypeDef *UARTx,uint8_t n) { uint8_t dmaNum = 0; if(UARTx == SCI2) { dmaNum =1; } else //SCI1 SCI3 { dmaNum =0; } return sci_dma_channel[dmaNum][n]->DMA_CTRL_HIGH; } void SCI1_DMA_Init(unsigned int pclk,unsigned int bound) { uint32_t band_rate=0; NVIC_Init(0, 0, SCI1_IRQn, 2); SCI1->SCIBRDF=(((pclk*8/bound)+1)/2)&0x003f; band_rate =(pclk*4/bound)>>6; SCI1->SCIBDH =(uint8_t)((band_rate>>8)&0x00ff); SCI1->SCIBDL =(uint8_t)(band_rate&0x00ff); SCI1->SCICR1 &=~(1<<4); //Data frame??1+8+1 SCI1->SCICR1 &=~(1<<1); //No verification SCI1->SCIRXTOCTR = 64; SCI1->SCIFCR = 0; SCI1->SCIFCR |= (SCIFCR_RFEN|SCIFCR_RXFLSEL_1_8|SCIFCR_TXFLSEL_1_8); //RX FIFOenable SCI1->SCIFCR2 |= (SCIFCR2_RXFCLR|SCIFCR2_RXFTOE); //clean fifo , time over SCI1->SCICR1 |= SCICR1_ILT_MASK; //Idle frame starts from end bit SCI1->SCICR2 |= (SCICR2_TE_MASK|SCICR2_RE_MASK|SCICR2_ILIE_MASK); //Idle interrupt, receive, send enable // SCI3->SCICR2 |= SCICR2_RE_MASK; SCI1->SCIDCR |= SCIDCR_RXDMAE_MASK; //Uart_DMA enable dma_uartRX(SCI1,Uart_Channel, Rx_Buffer_short,256); } void SCI3_DMA_Init(unsigned int pclk,unsigned int bound) { uint32_t band_rate=0; NVIC_Init(0, 0, SCI3_IRQn, 2); SCI3->SCIBRDF=(((pclk*8/bound)+1)/2)&0x003f; band_rate =(pclk*4/bound)>>6; SCI3->SCIBDH =(uint8_t)((band_rate>>8)&0x00ff); SCI3->SCIBDL =(uint8_t)(band_rate&0x00ff); SCI3->SCICR1 &=~(1<<4); //Data frame??1+8+1 SCI3->SCICR1 &=~(1<<1); //No verification SCI3->SCIRXTOCTR = 64; SCI3->SCIFCR = 0; SCI3->SCIFCR |= (SCIFCR_RFEN|SCIFCR_RXFLSEL_1_8|SCIFCR_TXFLSEL_1_8); //RX FIFOenable SCI3->SCIFCR2 |= (SCIFCR2_RXFCLR|SCIFCR2_RXFTOE); //clean fifo , time over SCI3->SCICR1 |= SCICR1_ILT_MASK; //Idle frame starts from end bit SCI3->SCICR2 |= (SCICR2_TE_MASK|SCICR2_RE_MASK|SCICR2_ILIE_MASK); //Idle interrupt, receive, send enable // SCI3->SCICR2 |= SCICR2_RE_MASK; SCI3->SCIDCR |= SCIDCR_RXDMAE_MASK; //Uart_DMA enable dma_uartRX(SCI3,Uart_Channel, Rx_Buffer_short,256);//256 } //void SCI1_IRQHandler(void) //{ // uint16_t tmp,ret; // uint8_t clear_idle_flag; // UART_TypeDef *UARTx=SCI1; // //UART_Enter idle interrupt // if(UARTx->SCISR1 & SCISR1_IDLE_MASK) //The receiver is idle // { // //清除标志位 // while((UARTx->SCIFSR&SCIFSR_REMPTY_MASK) == 0) //FIFO not empty, Wait for the received data to be transmitted to DMA // { // if( UARTx->SCIFSR& (SCIFSR_RFULL_MASK|SCIFSR_RTOS_MASK) ) //FIFO overflow??receive time-out // { // break; // } // } // tmp = UARTx->SCIDRL; // UARTx->SCIFCR2 |= SCIFCR2_RXFCLR; // Rx_Count_short = DMA_uart_GetRecvLen(UARTx,Uart_Channel); //// gUsartRx.Flag = 1; // printf("len:%d\r\n",Rx_Count_short); // // SCI3->SCICR2 |= SCICR2_RE_MASK; // // SCI3->SCIDCR |= SCIDCR_RXDMAE_MASK; //Uart_DMA enable //// for(unsigned char i = 0 ; i < Rx_Count_short;i++ ) //// { //// printf(" %x ",Rx_Buffer_short[i]); //// } //// number1++; // dma_uartRX(UARTx,Uart_Channel, Rx_Buffer_short,256); // ota_lt7689_flag=1; // // clear_idle_flag = SCI1->SCIDRL; // clear_idle_flag = SCI1->SCISR1; // } //} unsigned char ui_buf[2050]; unsigned int ui_offset=0; unsigned short block = 0; unsigned int page = 0; unsigned int ui_addr =0x00000000; //extern unsigned short block1 = 512; //extern unsigned int ui_addr1 =0x00100000; //extern unsigned int page =64*512 32768 unsigned char last_flag = 0; unsigned char dma_flag = 0; // SCI3 DMA #if 0 void SCI3_IRQHandler(void) { uint16_t tmp,ret; uint8_t clear_idle_flag; UART_TypeDef *UARTx=SCI3; //UART_Enter idle interrupt if(UARTx->SCISR1 & SCISR1_IDLE_MASK) //The receiver is idle { //清除标志位 while((UARTx->SCIFSR&SCIFSR_REMPTY_MASK) == 0) //FIFO not empty, Wait for the received data to be transmitted to DMA { if( UARTx->SCIFSR& (SCIFSR_RFULL_MASK|SCIFSR_RTOS_MASK) ) //FIFO overflow??receive time-out { break; } } tmp = UARTx->SCIDRL; UARTx->SCIFCR2 |= SCIFCR2_RXFCLR; Rx_Count_short = DMA_uart_GetRecvLen(UARTx,Uart_Channel); // gUsartRx.Flag = 1; printf("len:%d\r\n",Rx_Count_short); clear_idle_flag = SCI1->SCIDRL; clear_idle_flag = SCI1->SCISR1; dma_uartRX(UARTx,Uart_Channel, Rx_Buffer_short,256);//256 212 // SCI3->SCICR2 |= SCICR2_RE_MASK; // SCI3->SCIDCR |= SCIDCR_RXDMAE_MASK; //Uart_DMA enable printf("R:"); for(unsigned char i = 0 ; i < Rx_Count_short;i++ ) { printf(" %x ",Rx_Buffer_short[i]); } printf("\r\n"); // number1+=Rx_Count_short; // ui_offset+=Rx_Count_short; // dma_flag++; // // dma_flag %= 2; // printf("dma_flag=%d\r\n",dma_flag); // if(dma_flag==0) // printf("\r\n**\r\n"); // for(unsigned char i = 0 ; i < Rx_Count_short; i++) // printf(" %x",Rx_Buffer_short[i]); // printf("\r\n %x \r\n",CalCheckSum(Rx_Buffer_short,Rx_Count_short-1)); ota_analysis(Rx_Buffer_short,Rx_Count_short); //双缓冲 // if(dma_flag==1) // dma_uartRX(UARTx,Uart_Channel, Rx_Buffer1_short,256); // if(Rx_Count_short<256) // { // last_flag = 1; // ota_lt7689_flag=1; // } // ota_lt7689_flag=1; // if(Rx_Count_short<256) // printf("number1=%d\r\n",number1); // for(unsigned char i =0;iSCISR1 & 0x20) == 0x20) { // Rx_Buffer_short[Rx_Count_short++]=SCI3->SCIDRL; // ui_buf[ui_offset++]=SCI3->SCIDRL; // number1++; // ch = SCI3->SCIDRL; // number1++; // if(ui_offset%256==0) // { // ota_lt7689_flag=1; // //// ui_buf_length=0; // } // else if(ui_offset>256) // { // ota_lt7689_flag=1; // } // printf("flag=%d %d\r\n",ota_lt7689_flag,number1); #if 1 //3-enhance unsigned char ch = SCI3->SCIDRL; // wifi_buf[mes_length++] =SCI3->SCIDRL; #if 1 //状态机接收 // printf("%d\r\n",rev_status); if(rev_status == 0) //A5 { if(ch==0xA5) { wifi_buf[mes_length++] = ch; rev_status = 1; } else { rev_status = 0; mes_length = 0; } } else if (rev_status == 1) //5A { if(ch==0x5A) { wifi_buf[mes_length++] = ch; rev_status = 2; } else { rev_status = 0; mes_length = 0; } } else if (rev_status == 2) // 01 { if(ch==0x01) { wifi_buf[mes_length++] = ch; rev_status = 3; } else { rev_status = 0; mes_length = 0; } } else if (rev_status == 3) // 包序号 { wifi_buf[mes_length++] = ch; rev_status = 4; } else if(rev_status==4) //消息类型 { // if(ch==0x20||ch==0x21||ch==0x03) wifi_buf[mes_length++] = ch; rev_status = 5; } else if(rev_status==5) //数据长度 { datalength =ch; wifi_buf[mes_length++] = datalength; rev_status = 6; } else if(rev_status==6) //命令 { wifi_buf[mes_length++] = ch; rev_status = 7; } else if(rev_status==7) //子命令 { wifi_buf[mes_length++] = ch; rev_status = 8; } else if(rev_status==8) //值或者校验码 { if((datalength-2)==0) //校验码 { wifi_buf[mes_length++] = ch; datalength =0; ota_lt7689_flag = 1; rev_status =0; } else //值 { wifi_buf[mes_length++] = ch; // printf("%d %d\r\n",mes_length,datalength + 6); if(mes_length == datalength + 6) // rev_status = 9; // printf("datalength=%d\r\n",datalength); } } else if(rev_status==9) //校验码 { wifi_buf[mes_length++] = ch; datalength =0; // printf("\r\nrev:%d",mes_length); // for(unsigned char i = 0 ; i < mes_length ; i++) // printf(" %x",wifi_buf[i]); // printf("\r\n"); // ota_analysis(wifi_buf,mes_length); // mes_length = 0; // rev_status =0; #if 1 //中断接收 app执行后续 ota_lt7689_flag = 1; rev_status =0; #endif } #endif #endif } #if 0 if((SCI3->SCISR1 & 0x10) == 0x10) //空闲中断 { //清除标志位 unsigned char clear_idle_flag; clear_idle_flag = SCI3->SCIDRL; clear_idle_flag = SCI3->SCISR1; // printf("ui_offset=%d\r\n",ui_offset); // if(ui_buf_length==2048) // { // ui_buf_length=0; // } // if(ui_offset==2048) // { // ui_offset=0; // } // printf("number1=%d\r\n",number1); /* ota_lt7689_flag=1; printf("R:"); for(unsigned char i = 0 ; i < mes_length;i++ ) { printf(" %x ",wifi_buf[i]); } printf("\r\n"); ota_analysis(wifi_buf,mes_length); */ // printf("rev:%d\r\n",mes_length); // for(unsigned char i = 0 ; i < mes_length;i++ ) // { // printf(" %x ",wifi_buf[i]); // } // printf("\r\n"); ota_analysis(wifi_buf,mes_length); mes_length = 0; } #endif // printf("flag %d\r\n",ota_lt7689_flag); } #endif /* 3-enhance OTA 接口*/ #if 1 unsigned char inf_wifi_buf[20] = {0}; unsigned char inf_wifi_buf_length = 0; unsigned char pkg_seq = 0; unsigned char wifi_buf[256] = {0}; unsigned char mes_length = 0; unsigned char rev_status = 0; unsigned char rev_datalength=0; //判断消息接收长度 unsigned char datalength=0; //缓存消息长度 unsigned short ota_seq = 0; //分析报文 unsigned char ota_analysis(unsigned char * rev_wifi_buf,unsigned short len) { // unsigned char check_number = CalCheckSum( inf_wifi_buf, len); //校验码不正确 printf("check:%x\r\n",CalCheckSum( (char *)rev_wifi_buf, len-1)); if(rev_wifi_buf[len-1]!= CalCheckSum( (char *)rev_wifi_buf, len-1)) { printf("%x check_number_erro!\r\n",CalCheckSum( (char *)rev_wifi_buf, len-1)); // return 1; } if((rev_wifi_buf[0]!=0xA5)&&(rev_wifi_buf[1]!=0x5A)&&(rev_wifi_buf[2]!=0x01)) { printf("illegal_new!\r\n"); // return 2; } pkg_seq = rev_wifi_buf[3]; // unsigned char send_length=inf_wifi_ack(inf_wifi_buf,pkg_seq); inf_wifi_buf[send_length] = CalCheckSum( (char *)inf_wifi_buf,send_length); send_length++; //发送ACK send_meg_wifi(inf_wifi_buf,send_length); printf("S:"); for(unsigned char i = 0 ; i < send_length;i++) { printf(" %x",inf_wifi_buf[i]); } printf("\r\n"); inf_wifi_buf_length = 0; // printf("send_wifi!\r\n"); return 0; } // 通知WIFI 数据包校验错误 unsigned char inf_wifi_data_check_error(unsigned char * inf_wifi_buf,unsigned char pkg_seq) { //封装协议 inf_wifi_buf[inf_wifi_buf_length++] = 0xa5; inf_wifi_buf[inf_wifi_buf_length++] = 0x5a; inf_wifi_buf[inf_wifi_buf_length++] = 0x01; // pkg_seq++; inf_wifi_buf[inf_wifi_buf_length++] = 0x01;//pkg_seq; inf_wifi_buf[inf_wifi_buf_length++] = 0x21; inf_wifi_buf[inf_wifi_buf_length++] = 0x02; inf_wifi_buf[inf_wifi_buf_length++] = 0x01; inf_wifi_buf[inf_wifi_buf_length++] = 0x01; inf_wifi_buf[inf_wifi_buf_length++] = 0x26; return inf_wifi_buf_length; } //通知WiFi固件校验错误 unsigned char inf_wifi_bin_check_error(unsigned char * inf_wifi_buf,unsigned char pkg_seq) { //封装协议 inf_wifi_buf[inf_wifi_buf_length++] = 0xa5; inf_wifi_buf[inf_wifi_buf_length++] = 0x5a; inf_wifi_buf[inf_wifi_buf_length++] = 0x01; // pkg_seq++; inf_wifi_buf[inf_wifi_buf_length++] = 0x01;// pkg_seq; inf_wifi_buf[inf_wifi_buf_length++] = 0x21; inf_wifi_buf[inf_wifi_buf_length++] = 0x02; inf_wifi_buf[inf_wifi_buf_length++] = 0x01; inf_wifi_buf[inf_wifi_buf_length++] = 0x02; inf_wifi_buf[inf_wifi_buf_length++] = 0x27; return inf_wifi_buf_length; } //通知WIFI OTA 完成 unsigned char inf_wifi_ota_suc(unsigned char * inf_wifi_buf,unsigned char pkg_seq) { //封装协议 inf_wifi_buf[inf_wifi_buf_length++] = 0xa5; inf_wifi_buf[inf_wifi_buf_length++] = 0x5a; inf_wifi_buf[inf_wifi_buf_length++] = 0x01; // pkg_seq++; inf_wifi_buf[inf_wifi_buf_length++] = 0x01;//pkg_seq; inf_wifi_buf[inf_wifi_buf_length++] = 0x21; inf_wifi_buf[inf_wifi_buf_length++] = 0x02; inf_wifi_buf[inf_wifi_buf_length++] = 0x02; inf_wifi_buf[inf_wifi_buf_length++] = 0x01; inf_wifi_buf[inf_wifi_buf_length++] = 0x27; return inf_wifi_buf_length; } //通知 WIFI 开始发送固件内容 unsigned char inf_wifi_ota_start(unsigned char * inf_wifi_buf,unsigned char pkg_seq) { //封装协议 inf_wifi_buf[inf_wifi_buf_length++] = 0xa5; inf_wifi_buf[inf_wifi_buf_length++] = 0x5a; inf_wifi_buf[inf_wifi_buf_length++] = 0x01; // pkg_seq++; inf_wifi_buf[inf_wifi_buf_length++] = 0x01; inf_wifi_buf[inf_wifi_buf_length++] = 0x21; inf_wifi_buf[inf_wifi_buf_length++] = 0x02; inf_wifi_buf[inf_wifi_buf_length++] = 0x03; inf_wifi_buf[inf_wifi_buf_length++] = 0x01; inf_wifi_buf[inf_wifi_buf_length++] = 0x28; return inf_wifi_buf_length; } // 用于确认 收到的消息 unsigned char inf_wifi_ack(unsigned char * inf_wifi_buf,unsigned char pkg_seq) { //封装协议 inf_wifi_buf[inf_wifi_buf_length++] = 0xa5; inf_wifi_buf[inf_wifi_buf_length++] = 0x5a; inf_wifi_buf[inf_wifi_buf_length++] = 0x01; // pkg_seq++; inf_wifi_buf[inf_wifi_buf_length++] = pkg_seq; inf_wifi_buf[inf_wifi_buf_length++] = 0x03; inf_wifi_buf[inf_wifi_buf_length++] = 0x00; // inf_wifi_buf[inf_wifi_buf_length++] = 0x02; // inf_wifi_buf[inf_wifi_buf_length++] = 0x01; // // inf_wifi_buf[inf_wifi_buf_length++] = 0x27; return inf_wifi_buf_length; } unsigned char CalCheckSum( char * buf,unsigned short len) { int checkSum=0; char *pBuf=(buf); //jump to len byte unsigned short bufLen=len; // printf ("Start cal checksum: "); for (int i=0;iSCISR1 & 0x40) == 0x00) { }; SCI3->SCIDRL = send_buf[i];//(uint8_t)ch; //SCI1->SCIDRL = (uint8_t)data; } return 0 ; } #endif