TRC 630401

Files at this revision

API Documentation at this revision

Comitter:
supawat
Date:
Thu Apr 02 03:42:12 2020 +0000
Commit message:
TRC 630401

Changed in this revision

auxfunc.cpp Show annotated file Show diff for this revision Revisions of this file
auxfunc.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r a140efde67cf auxfunc.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/auxfunc.cpp	Thu Apr 02 03:42:12 2020 +0000
@@ -0,0 +1,390 @@
+//#include "mbed.h"
+#include "U201SARA.h"
+#include "auxfunc.h"
+#include "vms.h"
+#include "at45db161e.h"
+#include "EEPROM.h"
+#include "global_variable.h"
+
+extern Serial pc;
+extern U201SARA modem;
+
+extern ATD45DB161E eflash;
+
+extern EEPROM eeprom;
+
+//volatile bool mready=false;
+volatile bool bconfig=false;
+volatile bool bactive=false;
+volatile bool b_ftpstate=false;
+volatile bool bgetfile=false;
+volatile bool bchgdir=false;
+volatile int lst_frmblock=-1;
+
+char locBIN_fname[]="firmware.bin\0";
+char insTXT_fname[]="Instruction_vms.txt\0";
+
+int num_pfrm=0;
+int size_lstf=0;
+
+//char *rdbuf_block=(char*)malloc(4096*sizeof(char));
+char rdbuf_block[4096];
+
+//char json_instruction[]= {"BEGIN:\nFirmware version: \"%d\"\nDevice: \"%16[^\"]\"\nDirectory: \"%19[^\"]\"\nLast file size: \"%d\"\nChecksum: \"%400[^\"]\"\nFile name: \"%29[^\"]\"\nEND:"};
+//char json_instruction[]= {"%*s\nFirmware version: \"%d\"\nDevice: \"%16[^\"]\"\nDirectory: \"%19[^\"]\"\nLast file size: \"%d\"\nChecksum: \"%400[^\"]\"\nFile name: \"%29[^\"]\"\n%*s"};
+char json_instruction[]= {"%*s\nFirmware version: \"%d\"\nDevice: \"%[^\"]\"\nDirectory: \"%[^\"]\"\nLast file size: \"%d\"\nChecksum: \"%[^\"]\"\nFile name: \"%[^.]\"\n%*s"};
+
+extern json_ota myota;
+extern vms_stat *_mystat;
+extern ota_flag flag_fw;
+
+// >>> Bootloader Programmer
+
+__asm void bootValidApp()
+{
+	
+		LDR R0, = 0xE000ED08            //  Load SCB->VTOR address into R0
+    LDR R1, = Bootloader_address    //  Load Bootloader_address into R1
+    STR R1, [R0]                    //  Store value of R0 into value of R1
+    LDR R0, [R1]                    //  Load R1 into R0
+    MOV SP, R0                      //  Copy the value of R0 into SP
+    NOP                             //  No operation
+    LDR R0, [R1, #4]                //  Load sum of R1 and #4 into R0
+    BX R0 
+	
+}
+
+void jump_bootloader(void){
+    uint32_t tmp = LPC_FLASHCTRL->FLASHCFG & (~(0x3));
+    uint32_t pdrun;
+   
+    LPC_SYSCON->MAINCLKSEL  = 0x00;
+    LPC_SYSCON->MAINCLKUEN  = 0;
+    LPC_SYSCON->MAINCLKUEN  = 1;
+    
+    LPC_FLASHCTRL->FLASHCFG = tmp & 0xFFFFFFFC;
+    
+    pdrun = LPC_SYSCON->PDRUNCFG & 0x000025FF;
+    pdrun |= ((1 << 7) & 0x000025FF);
+
+    LPC_SYSCON->PDRUNCFG = (pdrun | 0x0000C800);
+    bootValidApp();
+}
+
+//Bootloader Programmer <<<
+
+bool chkgrant_upgradeFW(int vers,char *device){
+		pc.printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n");
+		bool bfw_vers=false;
+		bool b_device=false;
+		
+		if(vers-atoi(FW_NO)>0){
+				bfw_vers=true;
+				pc.printf("my firmware [%d] is out to date : Having new firmware [%d]\r\n",atoi(FW_NO),vers);
+		}
+		
+		if(strcmp(device,"ALL")==0){
+				b_device=true;
+				pc.printf("device : ALL	---> I having grant Device!!!\r\n");
+		}else if(strcmp(device,DEV_GROUP)==0){
+				b_device=true;
+				pc.printf("device group : %s	---> I having grant Device!!!\r\n",DEV_GROUP);
+		}else if(strcmp(device,_mystat->id)==0){
+				b_device=true;
+				pc.printf("device : %s	---> I having grant Device!!!\r\n",_mystat->id);
+		}else{
+				b_device=false;
+				pc.printf("device : %s ---> I don't having grant Device!!!\r\n",device);
+		}
+		pc.printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\r\n");
+		
+	return (bfw_vers&&b_device);
+}
+
+//void eflash_block(char *data,int block){
+//    int st_addr=block<<12;
+//        eflash.ContinuousWriteThroughBuffer(st_addr, WRITE_BUFFER ,(unsigned char*)data,4096);
+//}
+
+void eflash_block(char data[],int block){
+    int st_addr=block<<12;
+        //eflash.ContinuousWriteThroughBuffer(st_addr, WRITE_BUFFER ,(unsigned char*)data,4096);
+		eflash.ContinuousWriteThroughBuffer(st_addr, WRITE_BUFFER ,(unsigned char*)data,4096);
+}
+ 
+void eflash_eraseBlock(int block){
+    int start_page=block<<3;
+        for(int i=0;i<8;i++){
+            eflash.PageErase(start_page+i);
+        }
+}
+
+bool check_ota()
+{
+    pc.printf("check OTA\r\n");
+
+    myota.firm_vers=0;
+    strcpy(myota.device,"\0");
+    strcpy(myota.dir,"\0");
+    myota.fsize=0;
+    //myota.chksum=0;
+    strcpy(myota.filename,"\0");
+
+    // if(bpsd) {
+    bconfig=modem.configFTP(srv_IP,usr,pwd,ota_ftpPort);
+    // }
+
+    if(bconfig) {
+        bactive=modem.activateFTP(1);
+        if(bactive) {
+            b_ftpstate=true;
+        }
+        bactive=false;
+    }
+
+    if(b_ftpstate) {
+        bchgdir=modem.changedirFTP("/");
+        if(bchgdir) {
+            //bgetfile=modem.getFTP("Instruction_vms.txt","Instruction_vms.txt");
+						bgetfile=modem.getFTP(insTXT_fname,insTXT_fname);
+        }
+
+        if(bgetfile) {
+            bactive=modem.activateFTP(0);
+            if(bactive) {
+                b_ftpstate=false;
+
+                bconfig=false;
+                bactive=false;
+                b_ftpstate=false;
+                //bgetfile=false;
+                bchgdir=false;
+            }
+
+            bactive=false;
+        }
+        bool format_found=false;
+        if(bgetfile) {
+            bgetfile=false;
+            format_found=readFS_ota();
+        }
+
+        if(format_found) {
+            format_found=false;
+            pc.printf("device FW %d\r\n",atoi(FW_NO));
+						if(chkgrant_upgradeFW(myota.firm_vers,myota.device)){
+            //if(myota.firm_vers-atoi(FW_NO)>0) {
+                pc.printf("device need firmware upgrading\r\n");
+                return true;
+            }else{
+								pc.printf("device firmware is up to date\r\n");
+						}
+        }
+
+    }
+    return false;
+}
+
+bool readFS_ota()
+{
+    //char fname[]="Instruction_vms.txt";
+    int nlst=-1;
+    nlst=modem.lstFS(insTXT_fname);
+		//char *rdbuf_block2=(char*)malloc()
+		char rdbuf_block2[nlst+1];
+ 
+    if(nlst>0) 
+			{
+						//rdbuf_block=(char*)realloc(rdbuf_block,nlst);
+				
+						//memset(rdbuf_block,0xff,nlst);
+						//memset(rdbuf_block,0xff,4096);
+				
+						memset(rdbuf_block2,0,nlst+1);
+				
+						//rcv=modem.rdBlockFS(fname,0,nlst);
+						modem.rdBlockFS(insTXT_fname,rdbuf_block2,0,nlst);
+						//rdbuf_block[nlst]='\0';
+						//rdbuf_block=modem.rdBlockFS(fname,0,nlst);
+						pc.printf("msg---------------------->\r\n");
+
+						//modem.printHex(rcv,nlst);
+
+						memset(myota.device,0,15);
+						memset(myota.dir,0,20);
+						memset(myota.filename,0,30);
+						char fname[30];
+
+						char crc_str[400];
+						memset(crc_str,0,400);
+						//sscanf(rcv,json_instruction,&myota.firm_vers,myota.device,myota.dir,&myota.fsize,&myota.chksum,myota.filename);
+						//sscanf(rdbuf_block,json_instruction,&myota.firm_vers,myota.device,myota.dir,&myota.fsize,&myota.chksum,myota.filename);
+						//sscanf(rdbuf_block2,json_instruction,&myota.firm_vers,myota.device,myota.dir,&myota.fsize,crc_str,myota.filename);
+						sscanf(rdbuf_block2,json_instruction,&myota.firm_vers,myota.device,myota.dir,&myota.fsize,crc_str,fname);
+						strcpy(myota.filename,fname);
+						strcat(myota.filename,".bin");
+						//free(rdbuf_block);
+						
+						char inst_pattern[]="firm_vers %d\r\ndevice %s\r\ndir %s\r\nfsize %d\r\nchksum CRC16_CCITT: %s\r\nfilename %s\r\n";
+						char buf_inst[512];
+						memset(buf_inst,0,512);
+						sprintf(buf_inst,inst_pattern,myota.firm_vers,myota.device,myota.dir,myota.fsize,crc_str,myota.filename);
+						pc.printf("%s",buf_inst);
+						
+						
+//						eeprom.write(ADDRESS_EEPROM_JSON_OTA,(char*)&myota,sizeof(json_ota));
+						
+						char delim[]=",";
+						char *ptr;
+						ptr=strtok(crc_str,delim);
+						char crc_short_str[64][6];
+						int k=0;
+								while(ptr!=0) {
+										memset(crc_short_str[k],0,6);
+										strcpy(crc_short_str[k],ptr);
+										k++;
+										ptr=strtok(NULL,delim);
+								}
+						
+								for (int i=0;i<k;i++){
+										myota.chksum[i]=atoi(crc_short_str[i]);
+								}
+								eeprom.write(ADDRESS_EEPROM_JSON_OTA,(char*)&myota,sizeof(json_ota));
+						
+						return true;
+    }
+    return false;
+}
+
+bool getBIN()
+{
+    pc.printf("get %s\r\n",locBIN_fname);
+		bconfig=modem.configFTP(srv_IP,usr,pwd,ota_ftpPort);
+
+    if(bconfig) {
+        bactive=modem.activateFTP(1);
+        if(bactive) {
+            b_ftpstate=true;
+        }
+        bactive=false;
+    }
+
+    if(b_ftpstate) {
+
+        bchgdir=modem.changedirFTP(myota.dir);
+
+        if(bchgdir) {
+            //bgetfile=modem.getFTP(myota.filename,loc_name);
+						bgetfile=modem.getFTP(myota.filename,locBIN_fname);
+        }
+        //    pc.printf("getfile %s stat=> %d\r\n",myota.filename,bgetfile);
+
+        if(bgetfile) {
+            bactive=modem.activateFTP(0);
+            if(bactive) {
+                b_ftpstate=false;
+                bconfig=false;
+                bactive=false;
+                //b_ftpstate=false;
+                //bgetfile=false;
+                bchgdir=false;
+            }
+            //b_ftpstate=false;
+            bactive=false;
+        }
+				
+				if(bgetfile) {
+            bgetfile=false;
+						flag_fw.get_frm=1;
+						eeprom.write(ADDRESS_EEPROM_FLAG_OTA,(char*)&flag_fw,sizeof(flag_fw));
+            //bool_rdFS=readFLASH_bin();
+						return true;
+        }
+               
+		return false;
+    }
+    return false;
+}
+
+//bool getBIN()
+
+bool readFLASH_bin()
+{
+    //char fname[]="firmware.bin";
+    int nlst=-1;
+    flag_fw.get_nfs=0;
+    nlst=modem.lstFS(locBIN_fname);
+			
+    if(nlst>0) {
+						int size_block=4096;
+						size_lstf=nlst%4096;
+						num_pfrm=nlst/4096;
+			
+						if(size_lstf>0){
+								num_pfrm+=1;
+						}           
+						
+//						uint16_t chk_psum[num_pfrm];
+						unsigned short chk_psum[num_pfrm];
+						//memset((char*)chk_psum,0,num_pfrm*sizeof(uint16_t));
+						pc.printf("num_pfrm: %d  size_lstf: %d\r\n",num_pfrm,size_lstf);
+						pc.printf("nlst =%d fsize=%d\r\n",nlst,myota.fsize);
+
+						if(nlst==myota.fsize){
+									pc.printf("get firmware.bin complete --> Transfering to exFlash...\r\n");
+						//rdbuf_block=(char *) realloc(rdbuf_block, 4096);
+									for(int i=0;i<num_pfrm;i++){
+												//eflash.block_erase(i);
+												eflash_eraseBlock(i);
+
+												if(i==(num_pfrm-1)){
+															size_block=size_lstf;
+												}
+
+												//rdbuf_block=(char *) realloc(rdbuf_block, 4096);
+
+												memset(rdbuf_block,0xff,4096);
+												modem.rdBlockFS(locBIN_fname,rdbuf_block,(i<<12),size_block);
+												chk_psum[i]=CRC16_CCITT((unsigned char*)rdbuf_block, size_block);
+												pc.printf("chk_psum[%d] = %d [%04X]\r\n",i,chk_psum[i],chk_psum[i]);
+												pc.printf("instruction checksum block[%d]= %d [%04X]\r\n",i,myota.chksum[i],myota.chksum[i]);
+
+												if(chk_psum[i]==myota.chksum[i]){
+															pc.printf("block[%d] CRC16_CCITT MATCHED\r\n",i);
+															//eflash_block(rdbuf_block,i);
+															pc.printf("block[%d] Transfer to exflash\r\n------------------------------------\r\n",i);
+															eflash_block(rdbuf_block,i);
+																
+															lst_frmblock=i;
+															flag_fw.get_nfs++;
+															eeprom.write(ADDRESS_EEPROM_FLAG_OTA,(char*)&flag_fw,sizeof(flag_fw));
+												}
+
+									}
+						//free(rdbuf_block);
+									pc.printf("flag_fw.get_nfs = %d num_pfrm = %d\r\n",flag_fw.get_nfs,num_pfrm);
+									
+									if(flag_fw.get_nfs==num_pfrm){
+												//if(lst_frmblock==(num_pfrm-1)){
+												flag_fw.crc_match=1;
+												eeprom.write(ADDRESS_EEPROM_FLAG_OTA,(char*)&flag_fw,sizeof(flag_fw));
+												pc.printf("Tranfering firmware.bin to exflash complete...\r\n");																													
+												return true;
+									}else{
+												flag_fw.check_ota=0;
+												flag_fw.get_frm=0;
+												flag_fw.get_nfs=0;
+												flag_fw.crc_match=0;
+												eeprom.write(ADDRESS_EEPROM_FLAG_OTA,(char*)&flag_fw,sizeof(flag_fw));
+												pc.printf("Tranfering firmware.bin  Fail!!! reboot OTA process NOW!!!\r\n");
+												return false;
+									}
+
+						}
+						//jump_bootloader();
+						return false;
+    }
+    return false;
+}
+
+
diff -r 000000000000 -r a140efde67cf auxfunc.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/auxfunc.h	Thu Apr 02 03:42:12 2020 +0000
@@ -0,0 +1,58 @@
+#ifndef AUXFUNC_H
+#define AUXFUNC_H
+
+#include "mbed.h"
+
+//#include "mbed_assert.h"
+//#include "U201SARA.h"
+//#include "auxfunc.h"
+
+//#define FW_NO "621028"
+//#define DEV_GROUP "3G_LOT1"
+
+#define Bootloader_address 0x00030000
+
+//#define ADDRESS_EEPROM_FLAG_OTA 0x90
+//#define ADDRESS_EEPROM_JSON_OTA 0xA0
+
+//json_ota myota;
+
+typedef struct Instruction_FILE {
+    int firm_vers;
+    char device[16];
+    char dir[20];
+    int fsize;
+    uint16_t chksum[64];
+    char filename[30];
+}json_ota;
+
+typedef struct struct_flag{
+			uint8_t check_ota;
+			uint8_t get_frm;
+			uint8_t get_nfs;
+			uint8_t crc_match;
+			uint32_t last_check_rtc;
+}ota_flag;
+
+
+
+//typedef enum{CHECKING,CHECK_OTA,GETBIN_PRP,GETBIN,READFS_FWBIN,CRCMATCHED,DEEPSLEEP}app_state;
+
+//unsigned short CRC16_CCITT(unsigned char *pu8Data, unsigned int i16Len);
+
+// >>> Bootloader Programmer
+void bootValidApp();
+void jump_bootloader(void);
+// Bootloader Programmer <<<
+
+bool chkgrant_upgradeFW(int vers,char *device);
+//void eflash_block(char *data,int block);
+void eflash_block(char data[4096],int block);
+void eflash_eraseBlock(int block);
+
+bool check_ota();
+bool readFS_ota();
+bool getBIN();
+bool readFLASH_bin();
+
+#endif