1462 lines
		
	
	
		
			41 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			1462 lines
		
	
	
		
			41 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //#include <stdint.h>
 | |
| #include "dcBL.h"
 | |
| #include <QDebug>
 | |
| //#include "tabFw.h"
 | |
| #include "sendWRcmd.h"
 | |
| 
 | |
| 
 | |
| // File sits "behind" the HWapi and in front of "PI", so all necessary Bootloader functions can be called from HWapi
 | |
| 
 | |
| 
 | |
| 
 | |
| uint16_t ucharTOuint(uint8_t Highbyte, uint8_t Lowbyte)
 | |
| {
 | |
|     uint16_t uitmp;
 | |
|     uitmp=0;
 | |
|     uitmp |= uint8_t(Highbyte);
 | |
|     uitmp<<=8;
 | |
|     uitmp |= uint8_t(Lowbyte);
 | |
|     return uitmp;
 | |
| }
 | |
| 
 | |
| #define GETLOWBYTE      0
 | |
| #define GETHIGHBYTE     1
 | |
| 
 | |
| uint8_t uintTOuchar(uint16_t uival, uint8_t getHighB)
 | |
| {
 | |
|     // getHighB: low=GetLowByte
 | |
|     uint16_t uitmp=uival;
 | |
|     if (getHighB==0)
 | |
|         return uint8_t(uitmp);
 | |
|     uitmp>>=8;
 | |
|     return uint8_t(uitmp);
 | |
| 
 | |
| }
 | |
| 
 | |
| //#define GETLOWBYTE      0
 | |
| //#define GETHIGHBYTE     1
 | |
| #define GETMIDLOWBYTE      2
 | |
| #define GETMIDHIGHBYTE     3
 | |
| 
 | |
| uint8_t ulongTOuchar(uint32_t ulval, uint8_t whichByte)
 | |
| {
 | |
| 
 | |
|     uint32_t ultmp=ulval;
 | |
|     if (whichByte==GETLOWBYTE)
 | |
|         return uint8_t(ultmp);
 | |
|     ultmp>>=8;
 | |
|     if (whichByte==GETMIDLOWBYTE)
 | |
|         return uint8_t(ultmp);
 | |
|     ultmp>>=8;
 | |
|     if (whichByte==GETMIDHIGHBYTE)
 | |
|         return uint8_t(ultmp);
 | |
|     ultmp>>=8;
 | |
|     if (whichByte==GETHIGHBYTE)
 | |
|         return uint8_t(ultmp);
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| void strclr(uint8_t *buf, uint8_t clrsign, uint8_t len)
 | |
| {
 | |
|     uint16_t nn;
 | |
| 
 | |
|     for (nn=0; nn<len; nn++)
 | |
|         buf[nn]=clrsign;
 | |
| 
 | |
| }
 | |
| 
 | |
| // -----------------------------------------------------------------------------------------------
 | |
| // communication with this particular DeviceController's Bootloader ---------------------------------
 | |
| // -----------------------------------------------------------------------------------------------
 | |
| 
 | |
| uint16_t dcBL_calcCrcCcitt(uint32_t BufLength, uint8_t *buf)
 | |
| {
 | |
|     // CRC16 / CCITT-FALSE
 | |
|     uint8_t  nn, B15H, element;
 | |
|     uint16_t crc = 0x84cf;
 | |
| 
 | |
| 
 | |
|     while (BufLength--)
 | |
|     {
 | |
|         element = *buf++;
 | |
|         for (nn = 0; nn < 8; nn++)
 | |
|         {
 | |
|             B15H = 0;
 | |
|             if(crc & 0x8000)
 | |
|                 B15H = 1;
 | |
|             crc = (crc << 1) | ((element >> (7 - nn)) & 0x01);
 | |
|             if (B15H)
 | |
|             {
 | |
|                 crc ^= 0x1021;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     for (nn = 0; nn < 16; nn++)
 | |
|     {
 | |
|         B15H = 0;
 | |
|         if(crc & 0x8000)
 | |
|         B15H = 1;
 | |
|         crc = (crc << 1) | 0x00;
 | |
|         if (B15H)
 | |
|         {
 | |
|             crc ^= 0x1021;
 | |
|         }
 | |
|     }
 | |
|     return crc;
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| #define     SEND_STX    2
 | |
| #define     SEND_ETX    3
 | |
| #define     SEND_ESC    0x1B
 | |
| 
 | |
| static uint8_t dcBL_LastBLcmd;   // stored the last sent cmd in order to analys response
 | |
|                             // cmd echo'ed: error       cmd or'ed with 0x80: OK
 | |
| 
 | |
| uint8_t dcBL_prepareDC_BLcmd(uint8_t Cmd, uint8_t SendDataLength, uint8_t *sendData, uint8_t *outBuf)
 | |
| {
 | |
|     // make BL protocol, retval = outbuf length (5...133)
 | |
|     // bring data in correct form: start always with 0x02   finish with 0x03 and append checksum
 | |
|     // 0x02 Cmd < ...sendData ..>  CRC  CRC 0x03
 | |
|     // Data length = 0...64
 | |
|     // special conversion: if data contain 2 or 3 (STX, ETX) then write two bytes:  0x1B (=ESC) and data|0x80
 | |
|     // so maxlength = 5 + 2 x 64 (if all data are 2 or 3)  without 2,3: maxlength = 5 + 64
 | |
| 
 | |
|     // 26.01.2021: noch einen Fehler gefunden: die "special conversion" fehlt bei der angehaengten Checksumme!!!
 | |
| 
 | |
|     uint8_t  myBuf[140], pp=0, HB, LB;
 | |
|     uint8_t  crcBuf[140], mm=0;
 | |
|     uint8_t  nn, uctmp, currLen=0;
 | |
|     uint16_t calcCrc;
 | |
| 
 | |
|     strclr(myBuf, 0, 140);
 | |
|     strclr(crcBuf, 0, 140); // extra Puffer because STX must not be caculated
 | |
| 
 | |
|     myBuf[pp++]=SEND_STX;
 | |
|     myBuf[pp++]=Cmd;
 | |
|     crcBuf[mm++]=Cmd;
 | |
|     dcBL_LastBLcmd=Cmd;
 | |
| 
 | |
|     // append data:
 | |
|     for (nn=0; nn<SendDataLength; nn++)
 | |
|     {
 | |
|         uctmp=sendData[nn];
 | |
|         if (uctmp==SEND_STX || uctmp==SEND_ETX || uctmp==SEND_ESC)       // ESC, STX or ETX in payload
 | |
|         {
 | |
|             myBuf[pp++]=SEND_ESC;
 | |
|             //crcBuf[mm++]=SEND_ESC;        // so wäre die Berechnung NACH der Umwandlung, ist aber falsch
 | |
|             myBuf[pp++]=uctmp | 0x80;
 | |
|             //crcBuf[mm++]=uctmp | 0x80;    // so wäre die Berechnung NACH der Umwandlung, ist aber falsch
 | |
|             crcBuf[mm++]=uctmp;         // crc VOR umwandlung berechnen!
 | |
|         } else
 | |
|         {
 | |
|             myBuf[pp++]=uctmp;
 | |
|             crcBuf[mm++]=uctmp;
 | |
|         }
 | |
|     }
 | |
|     currLen=mm;
 | |
| 
 | |
|     // calc crc: (over cmd and data, without STX)
 | |
|     //qDebug() << "calc crc: anzahl  " <<mm;
 | |
|     //qDebug() << crcBuf;
 | |
|     calcCrc=dcBL_calcCrcCcitt(uint32_t(currLen), crcBuf);
 | |
|     //qDebug() << calcCrc;
 | |
| 
 | |
| //    myBuf[pp++]=uintTOuchar(calcCrc, GETHIGHBYTE);
 | |
| //    myBuf[pp++]=uintTOuchar(calcCrc, GETLOWBYTE);
 | |
| //    myBuf[pp++]=SEND_ETX;
 | |
| 
 | |
|     // 26.01.2021: die "special conversion" auch für die angehaengte Checksumme:
 | |
|     HB=uintTOuchar(calcCrc, GETHIGHBYTE);
 | |
|     LB=uintTOuchar(calcCrc, GETLOWBYTE);
 | |
|     uctmp=HB;
 | |
|     if (uctmp==SEND_STX || uctmp==SEND_ETX || uctmp==SEND_ESC)       // ESC, STX or ETX in payload
 | |
|     {
 | |
|         myBuf[pp++]=SEND_ESC;
 | |
|         myBuf[pp++]=uctmp | 0x80;
 | |
|         crcBuf[mm++]=uctmp;
 | |
|     } else
 | |
|     {
 | |
|         myBuf[pp++]=uctmp;
 | |
|         crcBuf[mm++]=uctmp;
 | |
|     }
 | |
|     uctmp=LB;
 | |
|     if (uctmp==SEND_STX || uctmp==SEND_ETX || uctmp==SEND_ESC)       // ESC, STX or ETX in payload
 | |
|     {
 | |
|         myBuf[pp++]=SEND_ESC;
 | |
|         myBuf[pp++]=uctmp | 0x80;
 | |
|         crcBuf[mm++]=uctmp;
 | |
|     } else
 | |
|     {
 | |
|         myBuf[pp++]=uctmp;
 | |
|         crcBuf[mm++]=uctmp;
 | |
|     }
 | |
|     myBuf[pp++]=SEND_ETX;
 | |
| 
 | |
|     currLen=pp;
 | |
| 
 | |
|     for (nn=0; nn<currLen; nn++)
 | |
|         outBuf[nn]=myBuf[nn];
 | |
| 
 | |
|     if (outBuf[currLen-1] !=3)
 | |
|     {
 | |
|         qDebug()<<"protocol error no ETX, len="<< currLen << " data: " << myBuf;
 | |
|     }
 | |
|     return currLen;
 | |
| }
 | |
| 
 | |
| // some special commands (right out of bootloader manual)
 | |
| uint8_t dcBL_readBLversion(uint8_t *sendData)
 | |
| {
 | |
|     // minimum size of sendData-buffer: 5byte  retval: length
 | |
|     uint8_t myBuf[2];
 | |
|     strclr(myBuf, 0, 2);
 | |
|     return dcBL_prepareDC_BLcmd(0x11, 0, myBuf, sendData);
 | |
| }
 | |
| 
 | |
| uint8_t dcBL_readFWversion(uint8_t *sendData)
 | |
| {
 | |
|     // minimum size of sendData-buffer: 5byte  retval: length
 | |
|     uint8_t myBuf[2];
 | |
|     strclr(myBuf, 0, 2);
 | |
|     return dcBL_prepareDC_BLcmd(0x12, 0, myBuf, sendData);
 | |
| }
 | |
| 
 | |
| uint8_t dcBL_exitBL(uint8_t *sendData)
 | |
| {
 | |
|     // minimum size of sendData-buffer: 5byte  retval: length
 | |
|     uint8_t myBuf[2];
 | |
|     strclr(myBuf, 0, 2);
 | |
|     return dcBL_prepareDC_BLcmd(0x18, 0, myBuf, sendData);
 | |
| }
 | |
| 
 | |
| uint8_t dcBL_sendFlashStartAddr2BL(uint32_t startAddr, uint8_t *sendData)
 | |
| {
 | |
|     // minimum size of sendData-buffer: 13byte    retval: length (9...13)
 | |
|     uint8_t myBuf[5];
 | |
| 
 | |
|     myBuf[0]=ulongTOuchar(startAddr, GETHIGHBYTE);
 | |
|     myBuf[1]=ulongTOuchar(startAddr, GETMIDHIGHBYTE);
 | |
|     myBuf[2]=ulongTOuchar(startAddr, GETMIDLOWBYTE);
 | |
|     myBuf[3]=ulongTOuchar(startAddr, GETLOWBYTE);
 | |
|     myBuf[4]=0;
 | |
| 
 | |
|     return dcBL_prepareDC_BLcmd(0x21, 4, myBuf, sendData);
 | |
| }
 | |
| 
 | |
| uint8_t dcBL_writeLastPage(uint8_t *sendData)
 | |
| {
 | |
|     // return the necessary command to tell the BL "finish writing" =write last page even if not full
 | |
|     // minimum size of sendData-buffer: 5byte  retval: length
 | |
|     uint8_t myBuf[2];
 | |
|     strclr(myBuf, 0, 2);
 | |
|     return dcBL_prepareDC_BLcmd(0x22, 0, myBuf, sendData);
 | |
| }
 | |
| 
 | |
| uint8_t dcBL_restartDC(uint8_t *sendData)
 | |
| {
 | |
|     // minimum size of sendData-buffer: 20 byte  retval: length
 | |
| 
 | |
|     // send this data block in decimal:  2 81 67 34 85 91 45 52 66 77 88 210 211 3
 | |
|     uint8_t nn=0;
 | |
|     sendData[nn++]=2;
 | |
|     sendData[nn++]=81;
 | |
|     sendData[nn++]=67;
 | |
|     sendData[nn++]=34;
 | |
|     sendData[nn++]=85;
 | |
|     sendData[nn++]=91;
 | |
|     sendData[nn++]=45;
 | |
|     sendData[nn++]=52;
 | |
|     sendData[nn++]=66;
 | |
|     sendData[nn++]=77;
 | |
|     sendData[nn++]=88;
 | |
|     sendData[nn++]=210;
 | |
|     sendData[nn++]=211;
 | |
|     sendData[nn++]=3;
 | |
|     sendData[nn++]=0;
 | |
|     sendData[nn++]=0;
 | |
|     return nn;
 | |
| }
 | |
| 
 | |
| uint8_t dcBL_activatBootloader(uint8_t *sendData)
 | |
| {
 | |
|     // minimum size of sendData-buffer: 20 byte  retval: length
 | |
|     uint8_t nn=0;
 | |
| 
 | |
|     //sendData[nn++]='U';  nötig??
 | |
|     sendData[nn++]='U';
 | |
|     sendData[nn++]='U';
 | |
|     sendData[nn++]='U';
 | |
|     sendData[nn++]='U';
 | |
|     sendData[nn++]='U';
 | |
| 
 | |
|     sendData[nn++]=2;
 | |
|     sendData[nn++]='c';
 | |
|     sendData[nn++]='4';
 | |
|     sendData[nn++]='5';
 | |
|     sendData[nn++]='b';
 | |
|     sendData[nn++]='3';
 | |
|     sendData[nn++]=3;
 | |
| 
 | |
|     sendData[nn++]='U';
 | |
|     sendData[nn++]='U';
 | |
|     sendData[nn++]='U';
 | |
|     sendData[nn++]='U';
 | |
|     sendData[nn++]='U';
 | |
|     sendData[nn++]=0;
 | |
|     return nn;
 | |
| }
 | |
| 
 | |
| // -----------------------------------------------------------------------------------------------
 | |
| 
 | |
| uint8_t dcBL_getResponse(uint8_t *respBuff, bool display)
 | |
| {
 | |
|     // retval: nr of received bytes
 | |
|     uint8_t recLen=epi_getRawRecLength();
 | |
|     if (recLen>0 && recLen<150)
 | |
|     {
 | |
|         epi_getRawReceivedData(respBuff);
 | |
|         epi_clrRawReceivedString();
 | |
|         dcBL_writeText("dcBL gotResponse");
 | |
| 
 | |
|         if (display)
 | |
|         {
 | |
| /*
 | |
|             // Antwort ins Fenster schreiben:
 | |
|             QString tmpStr="", myStr="~~> ";
 | |
| 
 | |
|             tmpStr.setNum(recLen);
 | |
|             myStr.append(tmpStr);
 | |
|             myStr.append(" bytes received: ");
 | |
|             for (int nn=0; nn<recLen; nn++)
 | |
|             {
 | |
|                 tmpStr.clear();
 | |
|                 tmpStr.setNum(respBuff[nn]);
 | |
|                 myStr.append(tmpStr);
 | |
|                 myStr.append(" ");
 | |
|             }
 | |
|             dcBL_writeText(myStr);
 | |
| */
 | |
|         }
 | |
|     }
 | |
|     return recLen;
 | |
| }
 | |
| 
 | |
| #define noReceive       0
 | |
| #define ISWRONG         1
 | |
| #define ISOK            10
 | |
| 
 | |
| uint8_t dcBL_ChkResponse()
 | |
| {
 | |
|     // retval: 0: no response (by now)
 | |
|     // 1...5: Error, repeat
 | |
|     // 10: OK, next...
 | |
|     uint8_t buf[152], recLen;
 | |
|     //uint8_t exactError;
 | |
|     //QString tmpStr="";
 | |
| 
 | |
|     //exactError=0;
 | |
|     recLen=dcBL_getResponse(buf,0);
 | |
|     if (recLen==0)
 | |
|         return 0;    // no response by now
 | |
| 
 | |
| //qDebug()<<" DCBL_chkResp got answer " << recLen   ;
 | |
| //dcBL_writeText("DCBL_chkResp got answer");
 | |
| 
 | |
|     if (buf[0]==2 && buf[1]==(dcBL_LastBLcmd | 0x80) )
 | |
|         return 10;    //  OK
 | |
| 
 | |
|     // 27.01.21: Problem aufgetaucht: Fehler nur bei CRC melden
 | |
|     // -> block wiederholen. In den anderen Fällen NICHT wiederholen
 | |
|     // sonst ist der block doppelt im Flash!!!!!!!!
 | |
|     if (recLen>0 && recLen<5)
 | |
|     {
 | |
|         dcBL_writeText("error wrong length");
 | |
|         //exactError=1;
 | |
| qDebug()<<" DCBL_chkResp wrong length ";
 | |
|         return 10;    //  OK
 | |
|     }
 | |
|     if (buf[0] !=2)
 | |
|     {
 | |
|         dcBL_writeText("error wrong start");
 | |
|         //exactError=2;
 | |
| qDebug()<<" DCBL_chkResp wrong start ";
 | |
|         return 10;    //  OK
 | |
|     }
 | |
|     if (buf[0]==2 && buf[1]=='e' && buf[2]=='0' )
 | |
|     {
 | |
|         dcBL_writeText("error wrong crc");
 | |
|         //exactError=3;   // DC reports wrong crc
 | |
| qDebug()<<" DCBL_chkResp wrong crc";
 | |
|         return 1;   // error
 | |
|     }
 | |
|     if (buf[0]==2 && buf[1]==dcBL_LastBLcmd )
 | |
|     {
 | |
|         dcBL_writeText("error wrong cmd");
 | |
|         //exactError=4;    // wrong cmd
 | |
| qDebug()<<" DCBL_chkResp wrong cmd";
 | |
|         return 10;    //  OK
 | |
|     }
 | |
|     //tmpStr.clear();
 | |
|     //tmpStr.setNum(exactError);
 | |
|     //dcBL_writeText(tmpStr);
 | |
|     return 1;   // error
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| uint8_t dcBL_sendSuccess(uint8_t lastCommand)
 | |
| {
 | |
|     // return val: 0: no response by now  1:error  10: OK
 | |
| 
 | |
|     uint8_t buf[152], recLen;
 | |
| 
 | |
|     recLen=dcBL_getResponse(buf,0);
 | |
|     if (recLen==0)
 | |
|         return 0;    // no response by now
 | |
| 
 | |
|     if (buf[0]==2 && buf[1]==(lastCommand | 0x80) )
 | |
|         return 10;    //  OK
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| // -----------------------------------------------------------------------------------------------
 | |
| // --- ATB Bin-File Handling ---------------------------------------------------------------------
 | |
| // -----------------------------------------------------------------------------------------------
 | |
| 
 | |
| /* example read file from HDD:
 | |
|     uint8_t uit8tmp;
 | |
|     QString stemp=" ";
 | |
| 
 | |
|     QFile file("/own/H2B/dc2.bin");
 | |
|     //QFile file("/own/H2B/dc2.hex");   // laesst sich genauso oeffnen
 | |
| 
 | |
|     // TODO: use File-Open-Dialog-Box
 | |
| 
 | |
|     if (!file.exists())
 | |
|     {
 | |
|         qDebug()<<"file not exists";
 | |
|     } else
 | |
|     {
 | |
|         if (!file.open(QIODevice::ReadOnly)  )
 | |
|         {
 | |
|             qDebug()<<"cannot open";
 | |
|         } else
 | |
|         {
 | |
|             qDebug()<<"loading....";
 | |
|             qDebug()<<"size: " << file.size() <<"\n";
 | |
|             QByteArray myBin = file.readAll();
 | |
| 
 | |
|             // Kontrolle:
 | |
|             int ii=0;
 | |
|             do
 | |
|             {
 | |
|                 uit8tmp=(uint8_t)myBin[ii++];
 | |
|                 //qDebug() << uit8tmp << " "; // Anzeige in dez
 | |
|                 stemp.setNum(uit8tmp,16);
 | |
|                 qDebug() << stemp << " ";   // Anzeige in hex
 | |
| 
 | |
|             } while (ii<100);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|   */
 | |
| 
 | |
| 
 | |
| // -------------------------------------------------------------------------
 | |
| 
 | |
| char dcBL_loadBinary(char withDisplay)
 | |
| {
 | |
|     // same function as in "tabFw"
 | |
|     //uint8_t uit8tmp;
 | |
|     uint32_t ultmp, fileLen;
 | |
|     QString tmpStr="", s2tmp="";
 | |
| 
 | |
|     qDebug()<<"dcBL loading DC2c binary...";
 | |
|     QFile file("../dc2c4.bin");
 | |
|     if (!file.exists())
 | |
|     {
 | |
|         //qDebug()<<"file _own_H2B_dc2.bin does not exist";
 | |
|         dcBL_writeText("file _own_H2B_dc2.bin does not exist");
 | |
|         return 1;
 | |
|     }
 | |
|     if (!file.open(QIODevice::ReadOnly)  )
 | |
|     {
 | |
|         //qDebug()<<"cannot open";
 | |
|         dcBL_writeText("cannot open");
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     //qDebug()<<"loading....";
 | |
|     //qDebug()<<"size: " << file.size() <<"\n";
 | |
|     if (withDisplay)
 | |
|     {
 | |
|         s2tmp="loading file with ";
 | |
|         tmpStr.setNum(file.size());
 | |
|         s2tmp.append(tmpStr);
 | |
|         s2tmp.append(" bytes");
 | |
|         dcBL_writeText(s2tmp);
 | |
|     }
 | |
|     QByteArray myBin = file.readAll();
 | |
|     fileLen=uint32_t(file.size());
 | |
| 
 | |
|     // Rest des Blockes mit 0xFF füllen
 | |
|     for (ultmp=fileLen; ultmp<(fileLen+70); ultmp++)
 | |
|         myBin[ultmp]=char(0xFF);
 | |
| 
 | |
|     /* // Kontrolle:
 | |
|     qDebug()<<"dcBL_loadBinary: ";
 | |
|     int ii=59500;
 | |
|     do
 | |
|     {
 | |
|         uit8tmp=uint8_t(myBin[ii++]);
 | |
|         s2tmp.clear();
 | |
|         //qDebug() << uit8tmp << " "; // Anzeige in dez
 | |
|         s2tmp.setNum(uit8tmp,16);
 | |
|         qDebug() << s2tmp << " ";   // Anzeige in hex
 | |
| 
 | |
|     } while (ii<60100);
 | |
|     */
 | |
| 
 | |
|     dcBL_importBinFile(myBin, fileLen, withDisplay);
 | |
|     return 0;
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| static QByteArray   dcBL_AtbBinFile;
 | |
| static uint32_t     dcBL_fileSize;
 | |
| static uint16_t     dcBL_nrOfBlocks;
 | |
| static uint16_t     dcBL_fileCrc;
 | |
| //static uint8_t      dcBL_myBuf[2570000]; // same content like "dcBL_AtbBinFile" but bytewise
 | |
| static uint8_t      dcBL_myBuf[300000]; // same content like "dcBL_AtbBinFile" but bytewise
 | |
| 
 | |
| bool dcBL_importBinFile(QByteArray readBinFile, uint32_t fileSize, char withDispl)
 | |
| {
 | |
|     uint16_t uitmp;
 | |
|     uint32_t ultmp;
 | |
|     uint32_t LL;
 | |
|     QString tmpStr="", s2tmp="";
 | |
| 
 | |
|     dcBL_AtbBinFile=readBinFile;
 | |
|     dcBL_fileSize=fileSize;
 | |
| 
 | |
|     //if (dcBL_fileSize>258048)       // 27.3.23TS  woher kommt die Zahl???
 | |
|                                     // das hex file hat 278kB
 | |
|                                     // hex file nicht erlaubt???
 | |
|     if (dcBL_fileSize>=300000)
 | |
|         return false;       // keep last file
 | |
|     ultmp=dcBL_fileSize;
 | |
|     ultmp %=64;
 | |
|     uitmp=uint16_t(ultmp);
 | |
|     ultmp=dcBL_fileSize;
 | |
|     ultmp /=64;
 | |
|     dcBL_nrOfBlocks=uint16_t(ultmp);
 | |
|     if (uitmp>0)
 | |
|         dcBL_nrOfBlocks++;    // letzter Block hat !=64 byte
 | |
| 
 | |
|     // type conversion for crc calc
 | |
|     for (LL=0; LL<dcBL_fileSize; LL++)
 | |
|         dcBL_myBuf[LL]=uint8_t(dcBL_AtbBinFile[LL]);
 | |
| 
 | |
|     dcBL_fileCrc=dcBL_calcCrcCcitt(LL, dcBL_myBuf);
 | |
| //    dcBL_writeText("file crc calculated successful");
 | |
| 
 | |
|     if (withDispl)
 | |
|     {
 | |
|         s2tmp="crc: ";
 | |
|         tmpStr.setNum(dcBL_fileCrc,16);
 | |
|         s2tmp.append(tmpStr);
 | |
|         dcBL_writeText(s2tmp);
 | |
| 
 | |
|         tmpStr.clear();
 | |
|         s2tmp="blocks: ";
 | |
|         tmpStr.setNum(dcBL_nrOfBlocks,10);
 | |
|         s2tmp.append(tmpStr);
 | |
|         dcBL_writeText(s2tmp);
 | |
| 
 | |
|         tmpStr.clear();
 | |
|         s2tmp="last block size: ";
 | |
|         tmpStr.setNum(uitmp,10);
 | |
|         s2tmp.append(tmpStr);
 | |
|         dcBL_writeText(s2tmp);
 | |
|     }
 | |
|     return true;
 | |
| 
 | |
| // erstmal nicht wie bisher um 14 Bytes nach oben schieben und Laenge/crc anhaengen,
 | |
| //    weil man sonst den BL und das Win-tool auch aendern muesste
 | |
| 
 | |
| }
 | |
| 
 | |
| char dcBL_loadBinSafe(void)
 | |
| {
 | |
|     // retval: true: file = OK
 | |
|     // Problem: nach der BL Programmierung ist das flash sehr oft defekt (ganze Bereiche sind falsch)
 | |
|     // die Übertragung ist CRC geschüzt, also bleibt die Vermutung das es am Einlesen des binfiles liegt.
 | |
|     // --->also sicherstellen dass das Laden des Binfiles 100%ig in Ordnung ist.
 | |
|     QByteArray BINFILECOPY1, BINFILECOPY2, BINFILECOPY3;
 | |
|     uint32_t   BinFileCpyLen1, BinFileCpyLen2, BinFileCpyLen3, LL;
 | |
|     uint8_t    repeat=0, nn=0, stopp=0;
 | |
|     //char        cc;
 | |
| 
 | |
|     do
 | |
|     {
 | |
|         //dcBL_writeText("loading 1st time:");
 | |
|         //qDebug() <<"loading 1st time:";
 | |
|         dcBL_loadBinary(0);
 | |
|         // file jetzt in: "QByteArray dcBL_AtbBinFile" mit Laenge "uint32_t dcBL_fileSize"
 | |
|         BINFILECOPY1=dcBL_AtbBinFile;
 | |
|         BinFileCpyLen1=dcBL_fileSize;
 | |
| 
 | |
|         //dcBL_writeText("loading 2nd time:");
 | |
|         //qDebug() <<"loading 2. time:";
 | |
|         dcBL_loadBinary(0);
 | |
|         // file jetzt in: "QByteArray dcBL_AtbBinFile" mit Laenge "uint32_t dcBL_fileSize"
 | |
|         BINFILECOPY2=dcBL_AtbBinFile;
 | |
|         BinFileCpyLen2=dcBL_fileSize;
 | |
| 
 | |
|         //dcBL_writeText("loading 3rd time:");
 | |
|         //qDebug() <<"loading 3. time:";
 | |
|         dcBL_loadBinary(0);
 | |
|         // file jetzt in: "QByteArray dcBL_AtbBinFile" mit Laenge "uint32_t dcBL_fileSize"
 | |
|         BINFILECOPY3=dcBL_AtbBinFile;
 | |
|         BinFileCpyLen3=dcBL_fileSize;
 | |
| 
 | |
| //cc=BINFILECOPY2[100];
 | |
| //if (cc>0)
 | |
| //    BINFILECOPY2[100]=0;
 | |
| //else
 | |
| //    BINFILECOPY2[100]=1;
 | |
| 
 | |
|         repeat=0;
 | |
|         if (BinFileCpyLen1 !=BinFileCpyLen2 || BinFileCpyLen1 !=BinFileCpyLen3)
 | |
|         {
 | |
|             dcBL_writeText("file length wrong");
 | |
|             qDebug() <<"length error";
 | |
| 
 | |
|             repeat=1;       // load both again....
 | |
|         }
 | |
|         if (repeat==0)
 | |
|         {
 | |
|             LL=0; stopp=0;
 | |
|             //qDebug() <<"1. loop";
 | |
| 
 | |
|             do
 | |
|             {
 | |
|                 if (dcBL_AtbBinFile[LL] != BINFILECOPY1[LL])
 | |
|                     stopp=1;
 | |
|             } while((++LL < dcBL_fileSize) && !stopp);
 | |
| 
 | |
|             if (stopp)
 | |
|             {
 | |
|                 dcBL_writeText("file compare1 wrong ");
 | |
|                 repeat=1;       // load both again....
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if (repeat==0)
 | |
|         {
 | |
|             LL=0; stopp=0;
 | |
|             //qDebug() <<"2. loop";
 | |
|             do
 | |
|             {
 | |
|                 if (dcBL_AtbBinFile[LL] != BINFILECOPY2[LL])
 | |
|                     stopp=1;
 | |
|             } while((++LL < dcBL_fileSize) && !stopp);
 | |
| 
 | |
|             if (stopp)
 | |
|             {
 | |
|                 dcBL_writeText("file compare2 wrong ");
 | |
|                 repeat=1;       // load both again....
 | |
|             } else
 | |
|                 dcBL_writeText("file OK");
 | |
|         }
 | |
| 
 | |
|     } while (++nn<3 && repeat);     // 3 trials
 | |
| 
 | |
|     qDebug() << "compare finito " << nn << " " << repeat;
 | |
| 
 | |
|     if (repeat==0)
 | |
|         return true;    // file OK
 | |
|     return false;       // error, could not load correctly
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| uint8_t dcBL_getAtbFileHeader(uint8_t *buf)
 | |
| {
 | |
|     // this header is prepended by the pc-direct-loader-tool
 | |
|     //  (so the uC-BL expects this!) here it is sent seperately:
 | |
|     uint8_t myBuf[30], pp=0, len;
 | |
| 
 | |
|     myBuf[pp++]='A';
 | |
|     myBuf[pp++]='T';
 | |
|     myBuf[pp++]='B';
 | |
|     myBuf[pp++]='-';
 | |
|     myBuf[pp++]='D';
 | |
|     myBuf[pp++]='C';
 | |
|     myBuf[pp++]='2';
 | |
|     myBuf[pp++]='-';
 | |
|     myBuf[pp++]=ulongTOuchar(dcBL_fileSize, GETHIGHBYTE);
 | |
|     myBuf[pp++]=ulongTOuchar(dcBL_fileSize, GETMIDHIGHBYTE);
 | |
|     myBuf[pp++]=ulongTOuchar(dcBL_fileSize, GETMIDLOWBYTE);
 | |
|     myBuf[pp++]=ulongTOuchar(dcBL_fileSize, GETLOWBYTE);
 | |
|     myBuf[pp++]='-';
 | |
|     myBuf[pp++]=uintTOuchar(dcBL_fileCrc, GETHIGHBYTE);
 | |
|     myBuf[pp++]=uintTOuchar(dcBL_fileCrc, GETLOWBYTE);
 | |
|     myBuf[pp++]='-';
 | |
|     len=pp;
 | |
|     //tslib_strcpy(myBuf, buf, (len+3));
 | |
|     len=dcBL_prepareDC_BLcmd(0x32, len, myBuf, buf);
 | |
|     return len;
 | |
| }
 | |
| 
 | |
| uint8_t dcBL_getFileBlock(uint16_t blockPointer, uint8_t *buf)
 | |
| {
 | |
|     // blockPointer=0....4095
 | |
|     uint32_t addr, LL;  //, BL;
 | |
|     //uint8_t  uit8tmp;
 | |
|     //QString stemp=" ";
 | |
| 
 | |
|     addr=uint32_t(blockPointer);
 | |
|     addr<<=6;   // *64  =Start address
 | |
| /*
 | |
|     if ( (addr+63)>dcBL_fileSize)
 | |
|     {
 | |
|         BL=dcBL_fileSize-addr+1;      // Block Length
 | |
|         for (LL=0; LL<64; LL++)
 | |
|             buf[LL]=0;
 | |
|         if (BL>64) BL=64;               // security limitation
 | |
|         // only BL bytes are left to give
 | |
|         for (LL=0; LL<BL; LL++)
 | |
|         {
 | |
|             buf[LL]=uint8_t(dcBL_AtbBinFile[LL+addr]);
 | |
|             // buf[LL]=dcBL_myBuf[LL+addr];
 | |
|         }
 | |
|         return uint8_t(BL);
 | |
|     } else
 | |
|     */
 | |
|     {
 | |
|         // all 64bytes can be read:
 | |
|         for (LL=0; LL<64; LL++)
 | |
|         {
 | |
|             buf[LL]=uint8_t(dcBL_AtbBinFile[LL+addr]);
 | |
|             //buf[LL]=dcBL_myBuf[LL+addr];
 | |
|         }
 | |
| 
 | |
| /*
 | |
|         // Kontrolle:
 | |
|         qDebug()<<"dcBL getFileBlock myBuf: ";
 | |
|         int ii=0;
 | |
|         do
 | |
|         {
 | |
|             uit8tmp=(uint8_t)dcBL_myBuf[ii++];
 | |
|             //qDebug() << uit8tmp << " "; // Anzeige in dez
 | |
|             stemp.setNum(uit8tmp,16);
 | |
|             qDebug() << stemp << " ";   // Anzeige in hex
 | |
| 
 | |
|         } while (ii<64);
 | |
| 
 | |
|         qDebug()<<"dcBL getFileBlock myBuf: ";
 | |
|         ii=0;
 | |
|         do
 | |
|         {
 | |
|             uit8tmp=(uint8_t)buf[ii++];
 | |
|             //qDebug() << uit8tmp << " "; // Anzeige in dez
 | |
|             stemp.setNum(uit8tmp,16);
 | |
|             qDebug() << stemp << " ";   // Anzeige in hex
 | |
| 
 | |
|         } while (ii<64);
 | |
| */
 | |
| 
 | |
|         return 64;
 | |
|     }
 | |
|     //return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| // -----------------------------------------------------------------------------------------------
 | |
| // --   fully automatic programmimg chain  ------------------------------------------------------------------
 | |
| // -----------------------------------------------------------------------------------------------
 | |
| 
 | |
| // use modules above and this functions from PI:
 | |
| // sendWRcmd_setSendBlock160(len, buf);
 | |
| // epi_getRawRecLength();
 | |
| // epi_getRawReceivedData(receivedData);
 | |
| 
 | |
| 
 | |
| 
 | |
| // this lines shall be displayed in tabFW / FW_responseWindow
 | |
| // they are read every 100ms. Make batch for 10 lines
 | |
| #define SIZEBLRESP      50
 | |
| static QString BlResp[SIZEBLRESP];
 | |
| static int     pBlResp;
 | |
| 
 | |
| bool dcBL_isTextMemFree(void)
 | |
| {
 | |
|     if (pBlResp<0) pBlResp=0;       // just for security
 | |
|     if (pBlResp<(SIZEBLRESP-1))
 | |
|         return true;
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| void dcBL_writeText(QString newTxt)
 | |
| {
 | |
|     // write text her in this file from memory 1....9, mem 0 is always free
 | |
|     if (dcBL_isTextMemFree())
 | |
|         BlResp[++pBlResp]=newTxt;
 | |
| }
 | |
| 
 | |
| bool dcBL_checkForText(void)
 | |
| {
 | |
|     // if pointer at 0 then no more content
 | |
|     if (pBlResp>0)
 | |
|         return true;
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| QString dcBL_readText(void)
 | |
| {
 | |
|     // read from 0...9 (oldest first)
 | |
|     if (pBlResp<=0)     // should never be <0
 | |
|         return "";
 | |
|     QString locStr=BlResp[1];       // store memory[1]
 | |
| 
 | |
|     // move memories down by one: 2->1 3->2 4>3....9->8. Place 1 is free now
 | |
|     // example: if pBlResp==3 then we have still text 2 and 3 to display. 1 will be transfered now with  this call
 | |
|     int nn;
 | |
|     for (nn=1; nn<pBlResp; nn++)
 | |
|         BlResp[nn]=BlResp[nn+1];
 | |
|     if (pBlResp>0) pBlResp--;
 | |
|     return locStr;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| // -------------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| static uint8_t dcBL_step, dcBL_state;
 | |
| static uint16_t dcBL_BlkCtr, dcBL_cyclCtr, repeatCtr;
 | |
| 
 | |
| void dcBL_iniChain(void)
 | |
| {
 | |
|     int nn;
 | |
|     dcBL_step=0;
 | |
|     dcBL_cyclCtr=0;
 | |
|     dcBL_state=0;
 | |
|     dcBL_BlkCtr=0;
 | |
|     repeatCtr=0;
 | |
| 
 | |
|     // delete output window:
 | |
|     pBlResp=0;
 | |
|     for (nn=0;nn<SIZEBLRESP; nn++)
 | |
|         BlResp[nn]="";
 | |
|     //dcBL_writeText("**CLEAR**");
 | |
|     dcBL_writeText("bl chain ini");
 | |
| }
 | |
| 
 | |
| uint8_t dcBL_startChain(void)
 | |
| {
 | |
|     if (dcBL_step==0 || dcBL_step>17)
 | |
|     {
 | |
|         dcBL_iniChain();
 | |
|         dcBL_step=1;
 | |
|         //epi_clrRawReceivedString();
 | |
|         qDebug()<<"starting chain...";
 | |
|         //qDebug()<<pBlResp;
 | |
|         dcBL_writeText("bl chain start");
 | |
|     }
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| uint8_t dcBL_runChain(void)
 | |
| {
 | |
|     // starting BL
 | |
|     // request BL-version (to be sure it's working)
 | |
|     // send start address
 | |
|     // send bin-file
 | |
|     // check all responses
 | |
|     // display result
 | |
|     // close BL
 | |
| 
 | |
|     // sequencer, triggered by 100ms timer from mainwindow over TabFw::updateGui
 | |
| 
 | |
|     QString tmpStr="";
 | |
| 
 | |
|     uint8_t buf[70], sendBuf[160], len, sendLen, gotResp, ii, uit8tmp;
 | |
|     //static uint8_t lastBlkLength;
 | |
|     QString stemp=" ";
 | |
|     uint32_t ultmp;
 | |
|     bool ret;
 | |
|     //uint8_t recLen, recBuff[160], ;
 | |
| 
 | |
|    gotResp=dcBL_ChkResponse();  //zum test hier raus, unten gehts nicht, darf nur 1x
 | |
| 
 | |
|     switch (dcBL_step)
 | |
|     {
 | |
|         case 1: // tell DC-app to restart
 | |
|             dcBL_writeText("loading binary..");
 | |
|             ret=dcBL_loadBinSafe();
 | |
|             if (ret)
 | |
|                 dcBL_step++;
 | |
|             else
 | |
|             {
 | |
|                 dcBL_writeText("cancel, cannot load binary!");
 | |
|                 dcBL_step=0;
 | |
|             }
 | |
|             break;
 | |
| 
 | |
|         case 2:
 | |
|             dcBL_writeText("sending restart...");
 | |
|             len=dcBL_restartDC(buf);
 | |
|             sendWRcmd_setSendBlock160(len, buf);
 | |
|             dcBL_step++;
 | |
|             break;
 | |
| 
 | |
|         case 3: // wait 100ms more
 | |
|             dcBL_step++;
 | |
|             break;
 | |
| 
 | |
|         case 4: // start BL
 | |
|             dcBL_writeText("sending BL start...");
 | |
|             len=dcBL_activatBootloader(buf);
 | |
|             sendWRcmd_setSendBlock160(5, buf);
 | |
|             dcBL_step++;
 | |
|             dcBL_cyclCtr=0;
 | |
|             break;
 | |
| 
 | |
|         case 5: // wait for answer: 2 99 52 53 98 51 3
 | |
|         // Problem: kommt von app, nicht vom BL. Also wenn BL schon aktiv ist dann gehts nicht
 | |
| 
 | |
|             /*
 | |
|             dcBL_cyclCtr++;
 | |
|             if (recLen>6 && recBuff[0]==2 && recBuff[1]==99 && recBuff[2]==52)
 | |
|                // && recBuff[3]==53 && recBuff[4]==98 && recBuff[5]==51 && recBuff[6]==3 )
 | |
|             {
 | |
|                 dcBL_writeText("BL started");
 | |
|                 dcBL_cyclCtr=0;
 | |
|                 dcBL_step++;
 | |
|                 return 0;
 | |
|             }
 | |
|             //qDebug()<<dcBL_cyclCtr;
 | |
|             if (dcBL_cyclCtr>10)    // 50 gibt 6,2s
 | |
|             {
 | |
|                 // cancel, report error
 | |
|                 dcBL_writeText("cannot start BL, cancel");
 | |
|                 dcBL_state=3;
 | |
|                 dcBL_step=0;    // stop chain
 | |
|                 return 0;
 | |
|             } */
 | |
| 
 | |
|             dcBL_step++;
 | |
|             repeatCtr=0;
 | |
|             break;
 | |
| 
 | |
|         case 6: // request Version number
 | |
|             len=dcBL_readFWversion(buf);
 | |
|             sendWRcmd_setSendBlock160(len, buf);
 | |
|             dcBL_writeText("request version nr...");
 | |
|             dcBL_cyclCtr=0;
 | |
|             dcBL_step++;
 | |
|             break;
 | |
| 
 | |
|         case 7: // wait for answer  2 146 45 45 95 176 3
 | |
| 
 | |
|             if (gotResp==ISOK)
 | |
|             {
 | |
|                 dcBL_state=1;   // BL started
 | |
|                 dcBL_step++;
 | |
|                 repeatCtr=0;
 | |
|                 return 0;
 | |
|             } else
 | |
|             if (gotResp==ISWRONG)
 | |
|             {
 | |
|                 if (++repeatCtr<3)
 | |
|                 {
 | |
|                     dcBL_step--;
 | |
|                 }else
 | |
|                 {
 | |
|                     dcBL_step=0;    // stop chain
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (++dcBL_cyclCtr>10)
 | |
|             {
 | |
|                 dcBL_writeText("cancel");
 | |
|                 dcBL_step=0;    // stop chain
 | |
|             }
 | |
|             break;
 | |
| 
 | |
|         case 8: // send start address
 | |
|             if (dcBL_BlkCtr==0 || dcBL_BlkCtr==1024 || dcBL_BlkCtr==2048 || dcBL_BlkCtr==3072 || dcBL_BlkCtr==4096)
 | |
|             {
 | |
|                 ultmp=uint32_t(dcBL_BlkCtr);
 | |
|                 ultmp*=64;
 | |
|                 len=dcBL_sendFlashStartAddr2BL(ultmp, buf);
 | |
|                 sendWRcmd_setSendBlock160(len, buf);
 | |
|                 dcBL_writeText("sending start address");
 | |
|                 dcBL_cyclCtr=0;
 | |
|                 dcBL_step++;
 | |
|                 return 0;
 | |
|             } else
 | |
|                 dcBL_step=12;
 | |
|             break;
 | |
| 
 | |
|         case 9: // wait for answer 2 161 68 59 3
 | |
|             if (gotResp==ISOK)
 | |
|             {
 | |
|                 dcBL_step=12;   // Header nicht senden, unnötig
 | |
|                 dcBL_BlkCtr=0;        //  0
 | |
|                 repeatCtr=0;
 | |
|                 return 0;
 | |
|             } else
 | |
|             if (gotResp==ISWRONG)
 | |
|             {
 | |
|                 if (++repeatCtr<3)
 | |
|                 {
 | |
|                     dcBL_step--;
 | |
|                 } else
 | |
|                 {
 | |
|                     dcBL_step=0;    // stop chain
 | |
|                 }
 | |
|             }
 | |
|             if (++dcBL_cyclCtr>10)
 | |
|             {
 | |
|                 dcBL_writeText("cancel");
 | |
|                 dcBL_step=0;    // stop chain
 | |
|             }
 | |
|             break;
 | |
| 
 | |
| 
 | |
|         case 12: // send binary 64 byte wise
 | |
| 
 | |
|             len=dcBL_getFileBlock(dcBL_BlkCtr, buf);      // read from file, len = 0...64
 | |
|             //lastBlkLength=len;                          // recognize last block or end
 | |
|             sendLen=dcBL_prepareDC_BLcmd(0x22, len, buf, sendBuf);   // pack into protocol frame
 | |
| 
 | |
| 
 | |
|             // Kontrolle:
 | |
|             qDebug()<<"dcBL sending: ";
 | |
|             ii=0;
 | |
|             do
 | |
|             {
 | |
|                 uit8tmp=(uint8_t)sendBuf[ii++];
 | |
|                 //qDebug() << uit8tmp << " "; // Anzeige in dez
 | |
|                 stemp.setNum(uit8tmp,16);
 | |
|                 qDebug() << stemp << " ";   // Anzeige in hex
 | |
| 
 | |
|             } while (ii<100);
 | |
| 
 | |
| 
 | |
|             sendWRcmd_setSendBlock160(sendLen, sendBuf);                  // send 140 bytes
 | |
|             delay(100);
 | |
|             //dcBL_writeText("blk nr: ");
 | |
|             tmpStr.setNum(dcBL_BlkCtr);
 | |
|             dcBL_writeText(tmpStr);
 | |
|             delay(100);
 | |
|             //qDebug()<<"sending: " << buf;
 | |
|             dcBL_cyclCtr=0;
 | |
|             dcBL_BlkCtr++;
 | |
|             dcBL_step++;
 | |
|             break;
 | |
| 
 | |
|         case 13: // wait for answer  2 162 116 88 3
 | |
| 
 | |
|             if (gotResp==ISOK)
 | |
|             {
 | |
|                 // check if next address is needed (every 1024Blocks = 65536bytes)
 | |
|                 if (dcBL_BlkCtr==1024 || dcBL_BlkCtr==2048 || dcBL_BlkCtr==3072 || dcBL_BlkCtr==4096)
 | |
|                 {
 | |
|                     dcBL_step=8;
 | |
|                     return 0;
 | |
|                 }
 | |
| 
 | |
|                 // check for EOF:
 | |
|                 if (dcBL_BlkCtr >= dcBL_nrOfBlocks)
 | |
|                 {
 | |
|                     dcBL_writeText("last block successful sent...");
 | |
|                     dcBL_step++;    // stop chain
 | |
|                     dcBL_state=3;   // transmission SUCCESSFUL
 | |
|                     return 0;
 | |
|                 }
 | |
|                 dcBL_state=2;   // transmission started
 | |
|                 dcBL_step--;    // send next data block
 | |
|                 repeatCtr=0;
 | |
|                 return 0;
 | |
|             }
 | |
|             if (gotResp==ISWRONG)
 | |
|             {
 | |
|                 if (++repeatCtr<3)
 | |
|                 {
 | |
|                     dcBL_writeText("error");
 | |
|                     dcBL_BlkCtr--;
 | |
|                     dcBL_step--;    // send same block again
 | |
|                 } else
 | |
|                 {
 | |
|                     dcBL_step=0;    // stop chain
 | |
|                 }
 | |
|             }
 | |
|             if (++dcBL_cyclCtr>30)  // longer TO due to flashing
 | |
|             {
 | |
|                 dcBL_writeText("cancel");
 | |
|                 dcBL_step=0;    // stop chain
 | |
|             }
 | |
|             break;
 | |
| 
 | |
|         case 14: //
 | |
|             dcBL_writeText("finish writing flash");
 | |
|             len=dcBL_writeLastPage(buf);        // nur zur Sicherheit
 | |
|             sendWRcmd_setSendBlock160(len, buf);
 | |
|             dcBL_step++;
 | |
|             break;
 | |
| 
 | |
|         case 15: // wait for answer
 | |
|             if (gotResp==ISOK)
 | |
|             {
 | |
|                 dcBL_step++;
 | |
|                 repeatCtr=0;
 | |
|                 return 0;
 | |
|             } else
 | |
|             if (gotResp==ISWRONG)
 | |
|             {
 | |
|                 if (++repeatCtr>3)
 | |
|                 {
 | |
|                     dcBL_step--;
 | |
|                 }
 | |
|             }
 | |
|             if (++dcBL_cyclCtr>10)
 | |
|             {
 | |
|                 dcBL_writeText("cancel");
 | |
|                 dcBL_step=0;    // stop chain
 | |
|             }
 | |
|             break;
 | |
| 
 | |
| 
 | |
|         case 16: //
 | |
|             dcBL_writeText("exit BL, bye");
 | |
|             len=dcBL_exitBL(buf);
 | |
|             sendWRcmd_setSendBlock160(len, buf);
 | |
|             dcBL_step++;
 | |
| 
 | |
|             break;
 | |
| 
 | |
|         case 17: // wait for answer, not sure if it comes!
 | |
|             if (gotResp==ISOK)
 | |
|             {
 | |
|                 dcBL_step++;
 | |
|                 repeatCtr=0;
 | |
|                 return 0;
 | |
|             } else
 | |
|             if (gotResp==ISWRONG)
 | |
|             {
 | |
|                 if (++repeatCtr>10)
 | |
|                 {
 | |
|                     dcBL_step--;
 | |
|                 }
 | |
|             }
 | |
|             if (++dcBL_cyclCtr>30)
 | |
|             {
 | |
|                 dcBL_writeText("cancel");
 | |
|                 dcBL_step=0;    // stop chain
 | |
|             }
 | |
|             break;
 | |
| 
 | |
|         case 18:
 | |
|             dcBL_step=0;
 | |
|             break;
 | |
|     }
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| void dcBL_iniLoading(void)
 | |
| {
 | |
|     dcBL_iniChain();
 | |
| }
 | |
| 
 | |
| 
 | |
| // nicht verwendet
 | |
| void dcBL_startLoading(void)
 | |
| {
 | |
|     if (dcBL_step==0 || dcBL_step>17)
 | |
|     {
 | |
|         //dcBL_iniChain();
 | |
|         dcBL_step=1;
 | |
|         //epi_clrRawReceivedString();
 | |
|         qDebug()<<"DCBL start sending hexfile...";
 | |
|         dcBL_writeText("DCBL start sending hexfile...");
 | |
|         dcBL_BlkCtr=0;
 | |
|         dcBL_cyclCtr=0;
 | |
|     }
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| // nicht verwendet
 | |
| uint8_t dcBL_sendHexfile(void)
 | |
| {
 | |
|     QString tmpStr="";
 | |
|     uint8_t buf[70], sendBuf[160], len, sendLen, gotResp;   //, recLen; recBuff[160], ii,
 | |
|     QString stemp=" ";
 | |
|     uint32_t ultmp;
 | |
|     //uint8_t uit8tmp, ii;
 | |
| 
 | |
| 
 | |
|     gotResp=dcBL_ChkResponse();
 | |
| 
 | |
|     switch (dcBL_step)
 | |
|     {
 | |
|         case 1: // send start address
 | |
|             if (dcBL_BlkCtr==0 || dcBL_BlkCtr==1024 || dcBL_BlkCtr==2048 || dcBL_BlkCtr==3072 || dcBL_BlkCtr==4096)
 | |
|             {
 | |
|                 ultmp=uint32_t(dcBL_BlkCtr);
 | |
|                 ultmp*=64;
 | |
|                 len=dcBL_sendFlashStartAddr2BL(ultmp, buf);
 | |
|                 sendWRcmd_setSendBlock160(len, buf);
 | |
|                 qDebug()<<" DCBL_CYCL_sending HexFile address ";
 | |
|                 dcBL_writeText("sending addr");
 | |
|                 dcBL_step++;
 | |
|                 return 0;
 | |
|             } else
 | |
|                 dcBL_step=12;
 | |
|             break;
 | |
| 
 | |
|         case 2: // wait for answer 2 161 68 59 3
 | |
|             if (gotResp==ISOK)
 | |
|             {
 | |
|                 dcBL_step=12;   // Header nicht senden, unnötig
 | |
|                 dcBL_BlkCtr=0;        //  0
 | |
|                 repeatCtr=0;
 | |
|                 return 0;
 | |
|             } else
 | |
|             if (gotResp==ISWRONG)
 | |
|             {
 | |
|                 if (++repeatCtr<3)
 | |
|                 {
 | |
|                     dcBL_step--;
 | |
|                 } else
 | |
|                 {
 | |
|                     dcBL_step=0;    // stop chain
 | |
|                     qDebug()<<" DCBL_CYCL_got wrong resp to addr";
 | |
|                     dcBL_writeText("wrong resp");
 | |
|                 }
 | |
|             }
 | |
|             if (++dcBL_cyclCtr>100)
 | |
|             {
 | |
|                 dcBL_writeText("cancel");
 | |
|                  qDebug()<<" DCBL_CYCL_step 2  got NO resp to addr";
 | |
|                 dcBL_step=0;    // stop chain
 | |
|             }
 | |
|             break;
 | |
| 
 | |
|         case 12: // send binary 64 byte wise
 | |
| 
 | |
|             len=dcBL_getFileBlock(dcBL_BlkCtr, buf);      // read from file, len = 0...64
 | |
|             //lastBlkLength=len;                          // recognize last block or end
 | |
|             sendLen=dcBL_prepareDC_BLcmd(0x22, len, buf, sendBuf);   // pack into protocol frame
 | |
| /*
 | |
|             // Kontrolle:
 | |
|             qDebug()<<"dcBL sending: ";
 | |
|             ii=0;
 | |
|             do
 | |
|             {
 | |
|                 uit8tmp=(uint8_t)sendBuf[ii++];
 | |
|                 //qDebug() << uit8tmp << " "; // Anzeige in dez
 | |
|                 stemp.setNum(uit8tmp,16);
 | |
|                 qDebug() << stemp << " ";   // Anzeige in hex
 | |
| 
 | |
|             } while (ii<100);
 | |
| */
 | |
|             sendWRcmd_setSendBlock160(sendLen, sendBuf);                  // send 140 bytes
 | |
|             delay(100);
 | |
|             dcBL_writeText("blk nr: ");
 | |
|             tmpStr.setNum(dcBL_BlkCtr);
 | |
|             dcBL_writeText(tmpStr);
 | |
|             delay(100);
 | |
|             qDebug()<<"DCBL sending blk nr: " << dcBL_BlkCtr;
 | |
|             dcBL_cyclCtr=0;
 | |
|             dcBL_BlkCtr++;
 | |
|             dcBL_step++;
 | |
|             break;
 | |
| 
 | |
|         case 13: // wait for answer  2 162 116 88 3
 | |
| 
 | |
|             if (gotResp==ISOK)
 | |
|             {
 | |
|                 // check if next address is needed (every 1024Blocks = 65536bytes)
 | |
|                 if (dcBL_BlkCtr==1024 || dcBL_BlkCtr==2048 || dcBL_BlkCtr==3072 || dcBL_BlkCtr==4096)
 | |
|                 {
 | |
|                     dcBL_step=8;
 | |
|                     return 0;
 | |
|                 }
 | |
| 
 | |
|                 // check for EOF:
 | |
|                 if (dcBL_BlkCtr >= dcBL_nrOfBlocks)
 | |
|                 {
 | |
|                     dcBL_writeText("last block successful sent...");
 | |
|                     dcBL_step++;    // stop chain
 | |
|                     dcBL_state=3;   // transmission SUCCESSFUL
 | |
|                     return 0;
 | |
|                 }
 | |
|                 dcBL_state=2;   // transmission started
 | |
|                 dcBL_step--;    // send next data block
 | |
|                 repeatCtr=0;
 | |
|                 return 0;
 | |
|             }
 | |
|             if (gotResp==ISWRONG)
 | |
|             {
 | |
|                 if (++repeatCtr<3)
 | |
|                 {
 | |
|                     dcBL_writeText("error");
 | |
|                     dcBL_BlkCtr--;
 | |
|                     dcBL_step--;    // send same block again
 | |
|                 } else
 | |
|                 {
 | |
|                     dcBL_step=0;    // stop chain
 | |
|                 }
 | |
|             }
 | |
|             if (++dcBL_cyclCtr>30)  // longer TO due to flashing
 | |
|             {
 | |
|                 dcBL_writeText("cancel");
 | |
|                 dcBL_step=0;    // stop chain
 | |
|             }
 | |
|             break;
 | |
| 
 | |
|         case 14: //
 | |
|             dcBL_writeText("finish writing flash");
 | |
|             len=dcBL_writeLastPage(buf);        // nur zur Sicherheit
 | |
|             sendWRcmd_setSendBlock160(len, buf);
 | |
|             dcBL_step++;
 | |
|             break;
 | |
| 
 | |
|         case 15: // wait for answer
 | |
|             if (gotResp==ISOK)
 | |
|             {
 | |
|                 dcBL_step++;
 | |
|                 repeatCtr=0;
 | |
|                 return 0;
 | |
|             } else
 | |
|             if (gotResp==ISWRONG)
 | |
|             {
 | |
|                 if (++repeatCtr>3)
 | |
|                 {
 | |
|                     dcBL_step--;
 | |
|                 }
 | |
|             }
 | |
|             if (++dcBL_cyclCtr>10)
 | |
|             {
 | |
|                 dcBL_writeText("cancel");
 | |
|                 dcBL_step=0;    // stop chain
 | |
|             }
 | |
|             break;
 | |
| 
 | |
|     }
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| uint8_t dcBL_getResult(void)
 | |
| {
 | |
|     // call after every step to what's going on....
 | |
|     //  1: connected to BL
 | |
|     //  2: transmission started
 | |
|     //  3: transmission successful
 | |
| 
 | |
|     return dcBL_state;
 | |
| }
 | |
| 
 | |
| // -------------------------------------------------------------------------
 | |
| // -------------------------------------------------------------------------
 | |
| // -------------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| static uint8_t Sdata_rawData[RAW_BL_DATALEN];
 | |
| 
 | |
| static uint8_t Sdata_LengthRawData;
 | |
| 
 | |
| void gpi_storeRawReceivedData(uint8_t  RdDlen, uint8_t *receivedData)
 | |
| {
 | |
|     uint8_t nn;
 | |
|     Sdata_LengthRawData=RdDlen;
 | |
|     if (Sdata_LengthRawData>RAW_BL_DATALEN)
 | |
|         Sdata_LengthRawData=RAW_BL_DATALEN;
 | |
|     for (nn=0; nn<Sdata_LengthRawData; nn++)
 | |
|         Sdata_rawData[nn]=receivedData[nn];
 | |
|     //qDebug()<<"dcBL got data"<<  Sdata_LengthRawData << "bytes :)";
 | |
| 
 | |
| }
 | |
| 
 | |
| uint8_t epi_getRawReceivedData(uint8_t *receivedData)
 | |
| {
 | |
|     // retval=length, will be zeroed after first reading
 | |
|     uint8_t nn, ret;
 | |
| 
 | |
|     for (nn=0; nn<Sdata_LengthRawData; nn++)
 | |
|         receivedData[nn]=Sdata_rawData[nn];
 | |
|     ret=Sdata_LengthRawData;
 | |
|     //Sdata_LengthRawData=0;
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| uint8_t epi_getRawRecLength(void)
 | |
| {
 | |
|     // retval=length
 | |
|     return Sdata_LengthRawData;
 | |
| }
 | |
| 
 | |
| QString epi_getRawReceivedString()
 | |
| {
 | |
|     uint8_t nn;     //, ret;
 | |
|     QString myString=nullptr, tmpStr=nullptr;
 | |
| 
 | |
|     myString.clear();
 | |
|     if (Sdata_LengthRawData==0)
 | |
|         return myString;
 | |
| 
 | |
|     for (nn=0; nn<Sdata_LengthRawData; nn++)
 | |
|     {
 | |
|         tmpStr.clear();
 | |
|         tmpStr.setNum(Sdata_rawData[nn],16);   // problem: wenn >0x80 dann wird EIN Byte 16 stellig angezeigt
 | |
|         int ll=tmpStr.length();
 | |
|         if (ll>2)
 | |
|         {
 | |
|             myString.append(tmpStr[ll-2]);
 | |
|             myString.append(tmpStr[ll-1]);
 | |
|         } else
 | |
|         {
 | |
|             myString.append(tmpStr);
 | |
|         }
 | |
|             myString.append(" ");
 | |
| 
 | |
|     }
 | |
|     //ret=Sdata_LengthRawData;
 | |
|     //Sdata_LengthRawData=0;
 | |
|     return myString;
 | |
| }
 | |
| 
 | |
| void epi_clrRawReceivedString()
 | |
| {
 | |
|     Sdata_LengthRawData=0;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |