Skip to content
Snippets Groups Projects
Commit 04e7cf6c authored by Sergi Hernandez's avatar Sergi Hernandez
Browse files

Added support for devices not supporting the mass erase command.

parent 91f7ec63
No related branches found
No related tags found
No related merge requests found
......@@ -46,9 +46,9 @@ void show_help(char *name) {
int main(int argc,char *argv[])
{
unsigned int baudrate=57600,left,addr,start_addr=0x00000000,len,base;
unsigned int baudrate=57600,left,addr,start_addr=0x00000000,len,base,i;
size_t data_len;
unsigned short int erase_pages=0xFFFF,device_id;
unsigned short int erase_pages=0x0000,device_id;
unsigned char bootloader_ver,buffer[256];
flash_op operation=flash_none;
const stm32_bl *bootloader_info;
......@@ -163,7 +163,15 @@ int main(int argc,char *argv[])
case flash_none:
break;
case flash_erase:
stm32_erase_memory(erase_pages);
if(device_id==0x417 || device_id==0x416 || device_id==0x429 || device_id==0x427 || device_id==0x436 || device_id==0x437)
{
// mass erase not supported
if(erase_pages==0)
erase_pages=0X01FF;
stm32_erase_memory(erase_pages);
}
else
stm32_erase_memory(erase_pages);
break;
case flash_read:
break;
......@@ -185,11 +193,26 @@ int main(int argc,char *argv[])
}
else
std::cout << "Input file in Intel HEX format" << std::endl;
std::cout << "erasing memory ...";
if(!stm32_erase_memory(0))
std::cout << " failed" << std::endl;
if(device_id==0x417 || device_id==0x416 || device_id==0x429 || device_id==0x427 || device_id==0x436 || device_id==0x437)
{
// mass erase not supported
if(erase_pages==0)
erase_pages=0X01FF;
if(!stm32_erase_memory(erase_pages))
{
std::cout << " failed" << std::endl;
return 1;
}
}
else
{
if(!stm32_erase_memory(erase_pages))
{
std::cout << " failed" << std::endl;
return 1;
}
}
std::cout << " done" << std::endl;
// write the data into the memory
......
......@@ -699,7 +699,7 @@ bool stm32_read_memory(unsigned int address,unsigned int length,unsigned char *d
return true;
}
bool stm32_start_exec(unsigned char address)
bool stm32_start_exec(unsigned int address)
{
unsigned char cmd[5],answer;
unsigned char cs=0;
......@@ -871,9 +871,10 @@ bool stm32_write_memory(unsigned int address, unsigned int length, unsigned char
return true;
}
bool stm32_erase_memory(unsigned short int num_pages, unsigned short int *pages)
bool stm32_erase_memory(unsigned short int num_pages)
{
unsigned char cmd[3],answer=STM32_NACK,*data;
unsigned short int *pages;
int written,num,i;
// send the erase command
......@@ -940,21 +941,22 @@ bool stm32_erase_memory(unsigned short int num_pages, unsigned short int *pages)
{
if(commands.er==0x44)
{
unsigned short int cs=0x0000;
unsigned char cs=0x00;
data=new unsigned char[(num_pages+1)*2];
data[0]=num_pages>>8;
data=new unsigned char[(num_pages+1)*2+1];
data[0]=(num_pages-1)>>8;
cs^=data[0];
data[1]=num_pages&0x00FF;
data[1]=(num_pages-1)&0x00FF;
cs^=data[1];
for(i=0;i<num_pages;i++)
{
data[i*2+2]=pages[i]>>8;
data[i*2+2]=(i>>8)&0x00FF;
cs^=data[i*2+2];
data[i*2+3]=pages[i]&0x00FF;
data[i*2+3]=i&0x00FF;
cs^=data[i*2+3];
}
if((written=serial.write(data,(num_pages+1)*2))!=(num_pages+1)*2)
data[i*2+2]=cs;
if((written=serial.write(data,((num_pages+1)*2)+1))!=(num_pages+1)*2+1)
{
std::cout << "Error while sending the command " << commands.er << std::endl;
delete[] data;
......@@ -965,15 +967,16 @@ bool stm32_erase_memory(unsigned short int num_pages, unsigned short int *pages)
{
unsigned char cs=0x00;
data=new unsigned char[num_pages+1];
data[0]=num_pages&0x00FF;
data=new unsigned char[num_pages+2];
data[0]=(num_pages-1)&0x00FF;
cs^=data[0];
for(i=0;i<num_pages;i++)
{
data[i+1]=pages[i]&0x00FF;
data[i+1]=i&0x00FF;
cs^=data[i+1];
}
if((written=serial.write(data,num_pages+1))!=num_pages+1)
data[i+1]=cs;
if((written=serial.write(data,num_pages+2))!=num_pages+2)
{
std::cout << "Error while sending the command " << commands.er << std::endl;
delete[] data;
......@@ -1007,8 +1010,53 @@ bool stm32_write_protect(int num_sectors, unsigned short int *sectors)
return true;
}
bool stm32_write_unprotect(int num_sectors, unsigned short int *sectors)
bool stm32_write_unprotect(void)
{
unsigned char cmd[2],answer=STM32_NACK;
int written,num;
// send the erase command
cmd[0]=commands.uw;
cmd[1]=commands.uw ^ 0xFF;
if((written=serial.write(cmd,2))!=2)
{
std::cout << "Error while sending the command " << commands.er << std::endl;
return false;
}
// wait for the response
try{
event_server->wait_all(events,2000);
num=serial.get_num_data();
serial.read(&answer,1);
num--;
if(answer==STM32_NACK)
{
std::cout << "Device answered NACK" << std::endl;
return false;
}
}catch(CException &e){
std::cout << "Device did not respond in time" << std::endl;
return false;
}
try{
if(num==0)
{
event_server->wait_all(events,2000);
num=serial.get_num_data();
}
serial.read(&answer,1);
num--;
if(answer==STM32_NACK)
{
std::cout << "Device answered NACK" << std::endl;
return false;
}
}catch(CException &e){
std::cout << "Device did not respond in time" << std::endl;
return false;
}
return true;
}
......
......@@ -50,11 +50,11 @@ bool stm32_get_chip_id(unsigned short int *pid);
bool stm32_get_chip_info(const stm32_bl **info);
bool stm32_get_device_info(std::string &device_name,const stm32_dev **info);
bool stm32_read_memory(unsigned int address,unsigned int length,unsigned char *data);
bool stm32_start_exec(unsigned char address);
bool stm32_start_exec(unsigned int address);
bool stm32_write_memory(unsigned int address, unsigned int length, unsigned char *data);
bool stm32_erase_memory(unsigned short num_pages, unsigned short int *pages=NULL);
bool stm32_write_protect(int num_sectors, unsigned short int *sectors);
bool stm32_write_unprotect(int num_sectors, unsigned short int *sectors);
bool stm32_erase_memory(unsigned short num_pages);
bool stm32_write_protect(void);
bool stm32_write_unprotect(void);
bool stm32_read_protect(int num_sectors, unsigned short int *sectors);
bool stm32_read_unprotect(int num_sectors, unsigned short int *sectors);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment