//********************************************************************* // // ------ C. A. E. N. S.p.A. ------ // // Nome : A639Dwld.c // Progetto : A639DownLoad // // Descrizione : Programma per il download del firmware di gestione // del modulo A639 (DT5780 HV controller) all'interno // della Flash del uC. // Si interfaccia con il codice di Boot del uC. // // Data : Dicembre 2012 // Release : 1.0 // Autore : C.Landi // //********************************************************************* #include #include #include //------------------------ // Indirizzo Board Info //------------------------ #define BD_INFO_ADDR (UINT32)0x8140 #define DT5780 0x7 // ID DT5580 #define DT55XX 0xA // ID DT55XX #ifdef LINUX #define UINT32 unsigned int #define UINT16 unsigned short void Sleep( int x ) { usleep( 1000 * x); } #endif //------------------------ // #define per sincronizzazione con Boot uC. #define OK (UINT32)0xf0 #define STARTDLD (UINT32)0xf1 #define DATAREADY (UINT32)0xf2 #define FERASE (UINT32)0xf3 #define FUPDATEL (UINT32)0x55 #define FUPDATEH (UINT32)0xaa #define CR 0xd //***************************************************************** unsigned char flash_buff[0x7800] ; // Array delle dimensioni della memoria del uC // riservata al codice di gestione del modulo. // Da 0x7800 inizia il codice di Boot. UINT32 HV_VSET0_ADDR,HV_ISET0_ADDR,HV_RUP0_ADDR,HV_RDWN0_ADDR ; UINT32 HV_VMAX0_ADDR,HV_VMON0_ADDR,HV_IMON0_ADDR,HV_CTRL0_ADDR,HV_STATUS0_ADDR ; UINT32 HV_VSET1_ADDR,HV_ISET1_ADDR,HV_RUP1_ADDR,HV_RDWN1_ADDR ; UINT32 HV_VMAX1_ADDR,HV_VMON1_ADDR,HV_IMON1_ADDR,HV_CTRL1_ADDR,HV_STATUS1_ADDR ; //***************************************************************** //***************************************************************** // Nome : ReadFileHex. // // Descrizione : La procedura legge il file tipo Hex ('a639.xxx' o // 'DT55XX.xxx') e riempie l'array 'FlashBuff[]' con // i valori convertiti in binario. // L'array 'FlashBuff[]' viene inizializzato con il // valore 0xff (byte erased). // // Input : Nessuno. // Output : 0 -> Ok, -1 -> problemi // Globali : FlashBuff[] // Release : 1.0. // //***************************************************************** int ReadFileHex(char *fname) { FILE *f; char record[80] ; unsigned char buff[80],dato,ndata,rectype,checksum ; long i,j,numrec=0 ; unsigned long addr ; if ((f = fopen(fname, "rb")) == NULL) { printf("\n\n !!! File not found. Press any key to exit ... "); return -1 ; } for (i=0; i= 'A') dato = record[i] - 55 ; else dato = record[i] - '0' ; dato = dato << 4 ; if (record[i+1] >= 'A') dato |= record[i+1] - 55 ; else dato |= record[i+1] - '0' ; buff[j++] = dato ; i += 2; checksum += dato ; } if ((record[0] != ':') || checksum) { printf("\n\n !!! Invalid record Format."); return -1 ; } else { ndata = buff[1] ; rectype = buff[4] ; addr = ((unsigned long)buff[2] << 8) | (unsigned long)buff[3] ; rectype = buff[4] ; if (rectype == 0) // Record di dati { for (i=0; i Ok, -1 -> problemi // Globali : FlashBuff[] // Release : 1.0. // //***************************************************************** void FirmwareUpgrade(int handle) { UINT16 d16,i ; int res; // Sequenza per trasferimento dati CAENComm_Write16(handle, HV_CTRL1_ADDR, STARTDLD) ; // Segnalo Start Download do CAENComm_Read16(handle, HV_STATUS0_ADDR, &d16) ; // Aspetto segnalazione di Flash Erasing while (d16 != FERASE) ; printf ("\n\n Erasing ... ") ; CAENComm_Write16(handle, HV_CTRL1_ADDR, 0x0) ; // Segnalo Start Download do CAENComm_Read16(handle, HV_STATUS0_ADDR, &d16) ; // Aspetto Ok per partire while (d16 == FERASE) ; printf ("\n\n Programming ...\n\n") ; CAENComm_Write16(handle, HV_CTRL0_ADDR, 0) ; // Reset segnalazioni CAENComm_Write16(handle, HV_CTRL1_ADDR, 0) ; for (i=0; i