diff --git a/trunk/src/fw_downloader.cpp b/trunk/src/fw_downloader.cpp
index ca8a6ce01acdcfae8c4b5e8975f1c7b92dbbe106..85ed7fee8e6d64ae4631867ec4b83cf996b51cad 100755
--- a/trunk/src/fw_downloader.cpp
+++ b/trunk/src/fw_downloader.cpp
@@ -21,20 +21,21 @@ void show_help(char *name) {
       "       -v              Verify writes\n"
       "       -g address      Start execution at specified address (0 = flash start)\n"
       "       -h              Show this help\n"
-      "       -d device       serial device name\n"           
+      "       -s serial_port  serial device name\n"           
+      "       -d device       STM32 device to program\n"
       "\n"
       "Examples:\n"
       "       Get device information:\n"
-      "               %s /dev/ttyS0\n"
+      "               %s -s /dev/ttyS0\n"
       "\n"
       "       Write with verify and then start execution:\n"
-      "               %s -w filename -v -g 0x0 /dev/ttyS0\n"
+      "               %s -w filename -v -g 0x0 -s /dev/ttyS0\n"
       "\n"
       "       Read flash to file:\n"
-      "               %s -r filename /dev/ttyS0\n"
+      "               %s -r filename -s /dev/ttyS0\n"
       "\n"
       "       Start execution:\n"
-      "               %s -g 0x0 /dev/ttyS0\n",
+      "               %s -g 0x0 -s /dev/ttyS0\n",
     name,
     name,
     name,
@@ -50,10 +51,12 @@ int main(int argc,char *argv[])
   unsigned short int erase_pages=0xFFFF,device_id;
   unsigned char bootloader_ver,buffer[256];
   flash_op operation=flash_none;
+  const stm32_bl *bootloader_info;
   const stm32_dev *device_info;
   bool verify=false,done=false;
   bool start_exec=false;
   std::string device="";
+  std::string device_name="";
   std::string filename;
   stm32_cmd commands;
   off_t offset = 0;
@@ -62,7 +65,7 @@ int main(int argc,char *argv[])
   int option;
 
   /* parse the input arguments */
-  while((option = getopt(argc, argv, "b:r:w:e:vg:hd:")) != -1) {
+  while((option = getopt(argc, argv, "b:r:w:e:vg:hd:s:")) != -1) {
     switch(option) {
       case 'b':
 	baudrate=strtoul(optarg,NULL,10);
@@ -102,21 +105,30 @@ int main(int argc,char *argv[])
 	start_exec = true;
 	start_addr = strtoul(optarg, NULL, 0);
 	break;
-      case 'd':
+      case 's':
         device=optarg;
         break;
+      case 'd':
+        device_name=optarg;
+        break;
       case 'h':
 	show_help(argv[0]);
 	return 1;
     }
   }
 
-  if (device.size() == 0) {
-    std::cout << "ERROR: Device not specified\n" << std::endl;
+  if (device.size() == 0) 
+  {
+    std::cout << "ERROR: Serial device not specified\n" << std::endl;
+    show_help(argv[0]);
+    return 1;
+  }
+  if (device_name.size() == 0)
+  {
+    std::cout << "ERROR: STM32 device not specified\n" << std::endl;
     show_help(argv[0]);
     return 1;
   }
-
   /* open and config the serial port */
   try{
     stm32_init(device,baudrate);
@@ -125,14 +137,26 @@ int main(int argc,char *argv[])
       stm32_get_commands(&commands);
       stm32_get_bootloader_ver(&bootloader_ver);
       std::cout << "bootloader version: 0x" << std::hex << (int)bootloader_ver << std::endl;
-      stm32_get_chip_id(&device_id);
+      if(!stm32_get_chip_id(&device_id))
+      {
+        std::cout << "Unknown device family product ID" << std::endl;
+        return 1;
+      }
       std::cout << "product id: 0x" << std::hex << device_id << std::endl;
-      stm32_get_chip_info(&device_info);
-      std::cout << "device name: " << device_info->name << std::endl;
-      std::cout << "RAM          : " << std::dec << (device_info->ram_end - 0x20000000) / 1024 << "KiB  (" << device_info->ram_start - 0x20000000 << "b reserved by bootloader)" << std::endl;
-      std::cout << "Flash        : " << std::dec << (device_info->fl_end - device_info->fl_start) / 1024 << "KiB  (sector size: " << device_info->fl_pps << "x" <<  device_info->fl_ps << ")" << std::endl;
-      std::cout << "Option RAM   : " << std::dec << device_info->opt_end - device_info->opt_start << "b" << std::endl;
-      std::cout << "System RAM   : " << std::dec << (device_info->mem_end - device_info->mem_start) / 1024 << "KiB" << std::endl;
+      stm32_get_chip_info(&bootloader_info);
+      if(!stm32_get_device_info(device_name,&device_info))
+      {
+        std::cout << "Unknown device "  << device_name << std::endl;
+        return 1;
+      }
+      if(device_info->pid!=device_id)
+      {
+        std::cout << "The desired device does not match the detected family" << std::endl;
+        return 1;
+      }
+      std::cout << "device name: " << bootloader_info->name << std::endl;
+      std::cout << "RAM          : " << std::dec << (bootloader_info->ram_end+1 - 0x20000000) / 1024 << "KiB  (" << bootloader_info->ram_start - 0x20000000 << "b reserved by bootloader)" << std::endl;
+      std::cout << "System RAM   : " << std::dec << (bootloader_info->mem_end+1 - bootloader_info->mem_start) / 1024 << "KiB" << std::endl;
       // perform desired operation
       switch(operation)
       {
@@ -172,13 +196,13 @@ int main(int argc,char *argv[])
           done=hex_get_first_segment(hex_file,&base,&data_len);
           while(!done)
           {
-            if(base<device_info->fl_start)
+            if(base<0x08000000)
             {
               std::cout << "Start address not in FLASH" << std::endl;
               hex_close(hex_file);
 	      return 1;
             }
-            if((base+data_len)>device_info->fl_end)
+            if((base+data_len)>0x08000000+device_info->flash_size*1024)
             {
               std::cout << "End address not in FLASH" << std::endl;
               hex_close(hex_file);
@@ -217,8 +241,8 @@ int main(int argc,char *argv[])
           std::cout << std::endl;
           if(start_exec)
           {
-            std::cout << "starting execution at 0x" << std::hex << start_addr+device_info->fl_start << std::endl;
-            stm32_start_exec(start_addr+device_info->fl_start);
+            std::cout << "starting execution at 0x" << std::hex << start_addr+0x08000000 << std::endl;
+            stm32_start_exec(start_addr+0x08000000);
           }
 
 	  break;
diff --git a/trunk/src/stm32.cpp b/trunk/src/stm32.cpp
index 90dba61aa408b524bb096bacbc9243904c4d0619..3489f31a66a76a4dbdd6968fc5b4dab091aaaec2 100755
--- a/trunk/src/stm32.cpp
+++ b/trunk/src/stm32.cpp
@@ -5,24 +5,471 @@
 #include "eventexceptions.h"
 
 // private variables
-/* device table */
 const stm32_dev devices[] = {
-  {0x412, "Low-density"      , 0x20000200, 0x20002800, 0x08000000, 0x08008000, 4, 1024,  0x1FFFF800, 0x1FFFF80F, 0x1FFFF000, 0x1FFFF800},
-  {0x410, "Medium-density"   , 0x20000200, 0x20005000, 0x08000000, 0x08020000, 4, 1024,  0x1FFFF800, 0x1FFFF80F, 0x1FFFF000, 0x1FFFF800},
-  {0x411, "STM32F2xx"        , 0x20002000, 0x20020000, 0x08000000, 0x08100000, 4, 16384, 0x1FFFC000, 0x1FFFC00F, 0x1FFF0000, 0x1FFF77DF},
-  {0x413, "STM32F4xx"        , 0x20002000, 0x20020000, 0x08000000, 0x08100000, 4, 16384, 0x1FFFC000, 0x1FFFC00F, 0x1FFF0000, 0x1FFF77DF},
-  {0x414, "High-density"     , 0x20000200, 0x20010000, 0x08000000, 0x08080000, 2, 2048,  0x1FFFF800, 0x1FFFF80F, 0x1FFFF000, 0x1FFFF800},
-  {0x418, "Connectivity line", 0x20001000, 0x20010000, 0x08000000, 0x08040000, 2, 2048,  0x1FFFF800, 0x1FFFF80F, 0x1FFFB000, 0x1FFFF800},
-  {0x420, "Medium-density VL", 0x20000200, 0x20002000, 0x08000000, 0x08020000, 4, 1024,  0x1FFFF800, 0x1FFFF80F, 0x1FFFF000, 0x1FFFF800},
-  {0x430, "XL-density"       , 0x20000800, 0x20018000, 0x08000000, 0x08100000, 2, 2048,  0x1FFFF800, 0x1FFFF80F, 0x1FFFE000, 0x1FFFF800},
-  {0x0}
+{"STM32F030C6",0x444,32,4},
+{"STM32F030C8",0x440,64,8},
+{"STM32F030CC",0x444,256,32},
+{"STM32F030F4",0x440,16,4},
+{"STM32F030K6",0x444,32,4},
+{"STM32F030R8",0x444,64,8},
+{"STM32F030RC",0x444,256,32},
+{"STM32F031C4",0x440,16,4},
+{"STM32F031C6",0x444,32,4},
+{"STM32F031F4",0x440,16,4},
+{"STM32F031F6",0x444,32,4},
+{"STM32F031G4",0x440,16,4},
+{"STM32F031G6",0x444,32,4},
+{"STM32F031K4",0x440,16,4},
+{"STM32F031K6",0x444,32,4},
+{"STM32F038C6",0x444,32,4},
+{"STM32F038F6",0x444,32,4},
+{"STM32F038G6",0x444,32,4},
+{"STM32F038K6",0x444,32,4},
+{"STM32F042C4",0x445,16,6},
+{"STM32F042C6",0x445,32,6},
+{"STM32F042F4",0x445,16,6},
+{"STM32F042F6",0x445,32,6},
+{"STM32F042G4",0x445,16,6},
+{"STM32F042G6",0x445,32,6},
+{"STM32F042K4",0x445,16,6},
+{"STM32F042K6",0x445,32,6},
+{"STM32F042T6",0x445,32,6},
+{"STM32F051C4",0x440,16,8},
+{"STM32F051C6",0x440,32,8},
+{"STM32F051C8",0x440,64,8},
+{"STM32F051K4",0x440,16,8},
+{"STM32F051K6",0x440,32,8},
+{"STM32F051K8",0x440,64,8},
+{"STM32F051R4",0x440,16,8},
+{"STM32F051R6",0x440,32,8},
+{"STM32F051R8",0x440,64,8},
+{"STM32F070C6",0x448,32,6},
+{"STM32F070CB",0x448,128,16},
+{"STM32F070F6",0x448,32,6},
+{"STM32F070RB",0x448,128,16},
+{"STM32F071CB",0x448,128,16},
+{"STM32F071RB",0x448,128,16},
+{"STM32F071V8",0x448,64,16},
+{"STM32F071VB",0x448,128,16},
+{"STM32F072C8",0x448,64,16},
+{"STM32F072CB",0x448,128,16},
+{"STM32F072R8",0x448,64,16},
+{"STM32F072RB",0x448,128,16},
+{"STM32F072V8",0x448,64,16},
+{"STM32F072VB",0x448,128,16},
+{"STM32F078CB",0x448,128,16},
+{"STM32F078RB",0x448,128,16},
+{"STM32F078VB",0x448,128,16},
+{"STM32F100C4",0x420,16,4},
+{"STM32F100C6",0x420,32,4},
+{"STM32F100C8",0x420,64,8},
+{"STM32F100CB",0x420,128,8},
+{"STM32F100R4",0x420,16,4},
+{"STM32F100R6",0x420,32,4},
+{"STM32F100R8",0x420,64,8},
+{"STM32F100RB",0x420,128,8},
+{"STM32F100RC",0x428,256,24},
+{"STM32F100RD",0x428,384,32},
+{"STM32F100RE",0x428,512,32},
+{"STM32F100V8",0x420,64,8},
+{"STM32F100VB",0x420,128,8},
+{"STM32F100VC",0x428,256,24},
+{"STM32F100VD",0x428,384,32},
+{"STM32F100VE",0x428,512,32},
+{"STM32F100ZC",0x428,256,24},
+{"STM32F100ZD",0x428,384,32},
+{"STM32F100ZE",0x428,512,32},
+{"STM32F101C6",0x412,32,6},
+{"STM32F101C8",0x410,64,10},
+{"STM32F101CB",0x410,128,16},
+{"STM32F101R4",0x412,16,4},
+{"STM32F101R6",0x412,32,6},
+{"STM32F101R8",0x410,64,10},
+{"STM32F101RB",0x410,128,16},
+{"STM32F101RC",0x414,256,32},
+{"STM32F101RD",0x414,384,48},
+{"STM32F101RE",0x414,512,48},
+{"STM32F101RF",0x430,768,80},
+{"STM32F101RG",0x430,1024,80},
+{"STM32F101T4",0x412,16,4},
+{"STM32F101T6",0x412,32,6},
+{"STM32F101T8",0x410,64,10},
+{"STM32F101TB",0x410,128,16},
+{"STM32F101V8",0x410,64,10},
+{"STM32F101VB",0x410,128,16},
+{"STM32F101VC",0x414,256,32},
+{"STM32F101VD",0x414,384,48},
+{"STM32F101VE",0x414,512,48},
+{"STM32F101VF",0x430,768,80},
+{"STM32F101VG",0x430,1024,80},
+{"STM32F101ZC",0x414,256,32},
+{"STM32F101ZD",0x414,384,48},
+{"STM32F101ZE",0x414,512,48},
+{"STM32F101ZF",0x430,768,80},
+{"STM32F101ZG",0x430,1024,80},
+{"STM32F102C4",0x412,16,4},
+{"STM32F102C6",0x412,32,6},
+{"STM32F102C8",0x410,64,10},
+{"STM32F102CB",0x410,128,16},
+{"STM32F102R4",0x412,16,4},
+{"STM32F102R6",0x412,32,6},
+{"STM32F102R8",0x410,64,10},
+{"STM32F102RB",0x410,128,16},
+{"STM32F103C4",0x412,16,6},
+{"STM32F103C6",0x412,32,10},
+{"STM32F103C8",0x410,64,20},
+{"STM32F103CB",0x410,128,20},
+{"STM32F103R4",0x412,16,6},
+{"STM32F103R6",0x412,32,10},
+{"STM32F103R8",0x410,64,20},
+{"STM32F103RB",0x410,128,20},
+{"STM32F103RC",0x414,256,48},
+{"STM32F103RD",0x414,384,64},
+{"STM32F103RE",0x414,512,64},
+{"STM32F103RF",0x430,768,96},
+{"STM32F103RG",0x430,1024,96},
+{"STM32F103T4",0x412,16,6},
+{"STM32F103T6",0x412,32,10},
+{"STM32F103T8",0x410,64,20},
+{"STM32F103TB",0x410,128,20},
+{"STM32F103V8",0x410,64,20},
+{"STM32F103VB",0x410,128,20},
+{"STM32F103VC",0x414,256,48},
+{"STM32F103VD",0x414,384,64},
+{"STM32F103VE",0x414,512,64},
+{"STM32F103VF",0x430,768,96},
+{"STM32F103VG",0x430,1024,96},
+{"STM32F103ZC",0x414,256,48},
+{"STM32F103ZD",0x414,384,64},
+{"STM32F103ZE",0x414,512,64},
+{"STM32F103ZF",0x430,768,96},
+{"STM32F103ZG",0x430,1024,96},
+{"STM32F105R8",0x418,64,64},
+{"STM32F105RB",0x418,128,64},
+{"STM32F105RC",0x418,256,64},
+{"STM32F105V8",0x418,64,64},
+{"STM32F105VB",0x418,128,64},
+{"STM32F105VC",0x418,256,64},
+{"STM32F107RB",0x418,128,64},
+{"STM32F107RC",0x418,256,64},
+{"STM32F107VB",0x418,128,64},
+{"STM32F107VC",0x418,256,64},
+{"STM32F205RB",0x411,128,64},
+{"STM32F205RC",0x411,256,96},
+{"STM32F205RE",0x411,512,128},
+{"STM32F205RF",0x411,768,128},
+{"STM32F205RG",0x411,1024,128},
+{"STM32F205VB",0x411,128,64},
+{"STM32F205VC",0x411,256,96},
+{"STM32F205VE",0x411,512,128},
+{"STM32F205VF",0x411,768,128},
+{"STM32F205VG",0x411,1024,128},
+{"STM32F205ZC",0x411,256,96},
+{"STM32F205ZE",0x411,512,128},
+{"STM32F205ZF",0x411,768,128},
+{"STM32F205ZG",0x411,1024,128},
+{"STM32F207IC",0x411,256,128},
+{"STM32F207IE",0x411,512,128},
+{"STM32F207IF",0x411,768,128},
+{"STM32F207IG",0x411,1024,128},
+{"STM32F207VC",0x411,256,128},
+{"STM32F207VE",0x411,512,128},
+{"STM32F207VF",0x411,768,128},
+{"STM32F207VG",0x411,1024,128},
+{"STM32F207ZC",0x411,256,128},
+{"STM32F207ZE",0x411,512,128},
+{"STM32F207ZF",0x411,768,128},
+{"STM32F207ZG",0x411,1024,128},
+{"STM32F215RE",0x411,512,128},
+{"STM32F215RG",0x411,1024,128},
+{"STM32F215VE",0x411,512,128},
+{"STM32F215VG",0x411,1024,128},
+{"STM32F215ZE",0x411,512,128},
+{"STM32F215ZG",0x411,1024,128},
+{"STM32F217IE",0x411,512,128},
+{"STM32F217IG",0x411,1024,128},
+{"STM32F217VE",0x411,512,128},
+{"STM32F217VG",0x411,1024,128},
+{"STM32F217ZE",0x411,512,128},
+{"STM32F217ZG",0x411,1024,128},
+{"STM32F301C6",0x439,32,16},
+{"STM32F301C8",0x439,64,16},
+{"STM32F301K6",0x439,32,16},
+{"STM32F301K8",0x439,64,16},
+{"STM32F301R6",0x439,32,16},
+{"STM32F301R8",0x439,64,16},
+{"STM32F302C6",0x439,32,16},
+{"STM32F302C8",0x439,64,16},
+{"STM32F302CB",0x422,128,32},
+{"STM32F302CC",0x422,256,40},
+{"STM32F302K6",0x439,32,16},
+{"STM32F302K8",0x439,64,16},
+{"STM32F302R6",0x439,32,16},
+{"STM32F302R8",0x439,64,16},
+{"STM32F302RB",0x422,128,32},
+{"STM32F302RC",0x422,256,40},
+{"STM32F302VB",0x422,128,32},
+{"STM32F302VC",0x422,256,40},
+{"STM32F303C6",0x438,32,16},
+{"STM32F303C8",0x438,64,16},
+{"STM32F303CB",0x422,128,40},
+{"STM32F303CC",0x422,256,48},
+{"STM32F303K6",0x438,32,16},
+{"STM32F303K8",0x438,64,16},
+{"STM32F303R6",0x438,32,16},
+{"STM32F303R8",0x438,64,16},
+{"STM32F303RB",0x422,128,40},
+{"STM32F303RC",0x422,256,48},
+{"STM32F303VB",0x422,128,40},
+{"STM32F303VC",0x422,256,48},
+{"STM32F318C8",0x439,64,16},
+{"STM32F318K8",0x439,64,16},
+{"STM32F328C8",0x438,64,16},
+{"STM32F334C4",0x438,16,16},
+{"STM32F334C6",0x438,32,10},
+{"STM32F334C8",0x438,64,16},
+{"STM32F334K4",0x438,16,16},
+{"STM32F334K6",0x438,32,10},
+{"STM32F334K8",0x438,64,12},
+{"STM32F334R6",0x438,32,10},
+{"STM32F334R8",0x438,64,16},
+{"STM32F358CC",0x422,256,48},
+{"STM32F358RC",0x422,256,48},
+{"STM32F358VC",0x422,256,48},
+{"STM32F373C8",0x432,64,16},
+{"STM32F373CB",0x432,128,24},
+{"STM32F373CC",0x432,256,32},
+{"STM32F373R8",0x432,64,16},
+{"STM32F373RB",0x432,128,24},
+{"STM32F373RC",0x432,256,32},
+{"STM32F373V8",0x432,64,16},
+{"STM32F373VB",0x432,128,24},
+{"STM32F373VC",0x432,256,32},
+{"STM32F378CC",0x432,256,32},
+{"STM32F378RC",0x432,256,32},
+{"STM32F378VC",0x432,256,32},
+{"STM32F401CB",0x423,128,64},
+{"STM32F401CC",0x423,256,64},
+{"STM32F401CD",0x433,384,96},
+{"STM32F401CE",0x433,512,96},
+{"STM32F401RB",0x423,128,64},
+{"STM32F401RC",0x423,256,64},
+{"STM32F401RD",0x433,384,96},
+{"STM32F401RE",0x433,512,96},
+{"STM32F401VB",0x423,128,64},
+{"STM32F401VC",0x423,256,64},
+{"STM32F401VD",0x433,384,96},
+{"STM32F401VE",0x433,512,96},
+{"STM32F405OE",0x413,512,192},
+{"STM32F405OG",0x413,1024,192},
+{"STM32F405RG",0x413,1024,192},
+{"STM32F405VG",0x413,1024,192},
+{"STM32F405ZG",0x413,1024,192},
+{"STM32F407IE",0x413,512,192},
+{"STM32F407IG",0x413,1024,192},
+{"STM32F407VE",0x413,512,192},
+{"STM32F407VG",0x413,1024,192},
+{"STM32F407ZE",0x413,512,192},
+{"STM32F407ZG",0x413,1024,192},
+{"STM32F411CC",0x413,256,128},
+{"STM32F411CE",0x431,512,128},
+{"STM32F411RC",0x413,256,128},
+{"STM32F411RE",0x431,512,128},
+{"STM32F411VC",0x413,256,128},
+{"STM32F411VE",0x431,512,128},
+{"STM32F415OG",0x413,1024,192},
+{"STM32F415RG",0x413,1024,192},
+{"STM32F415VG",0x413,1024,192},
+{"STM32F415ZG",0x413,1024,192},
+{"STM32F417IE",0x413,512,192},
+{"STM32F417IG",0x413,1024,192},
+{"STM32F417VE",0x413,512,192},
+{"STM32F417VG",0x413,1024,192},
+{"STM32F417ZE",0x413,512,192},
+{"STM32F417ZG",0x413,1024,192},
+{"STM32F427AG",0x413,1024,256},
+{"STM32F427AI",0x413,2048,256},
+{"STM32F427IG",0x413,1024,256},
+{"STM32F427II",0x413,2048,256},
+{"STM32F427VG",0x413,1024,256},
+{"STM32F427VI",0x413,2048,256},
+{"STM32F427ZG",0x413,1024,256},
+{"STM32F427ZI",0x413,2048,256},
+{"STM32F429AG",0x419,1024,256},
+{"STM32F429AI",0x419,2048,256},
+{"STM32F429BE",0x419,512,256},
+{"STM32F429BG",0x419,1024,256},
+{"STM32F429BI",0x419,2048,256},
+{"STM32F429IE",0x419,512,256},
+{"STM32F429IG",0x419,1024,256},
+{"STM32F429II",0x419,2048,256},
+{"STM32F429NE",0x419,512,256},
+{"STM32F429NI",0x419,2048,256},
+{"STM32F429VE",0x419,512,256},
+{"STM32F429VG",0x419,1024,256},
+{"STM32F429VI",0x419,2048,256},
+{"STM32F429ZE",0x419,512,256},
+{"STM32F429ZG",0x419,1024,256},
+{"STM32F429ZI",0x419,2048,256},
+{"STM32F439AI",0x419,2048,256},
+{"STM32F439BG",0x419,1024,256},
+{"STM32F439BI",0x419,2048,256},
+{"STM32F439IG",0x419,1024,256},
+{"STM32F439II",0x419,2048,256},
+{"STM32F439NG",0x419,1024,256},
+{"STM32F439NI",0x419,2048,256},
+{"STM32F439VG",0x419,1024,256},
+{"STM32F439VI",0x419,2048,256},
+{"STM32F439ZG",0x419,1024,256},
+{"STM32F439ZI",0x419,2048,256},
+{"STM32L051C6",0x417,32,8},
+{"STM32L051C8",0x417,64,8},
+{"STM32L051K6",0x417,32,8},
+{"STM32L051K8",0x417,64,8},
+{"STM32L051R6",0x417,32,8},
+{"STM32L051R8",0x417,64,8},
+{"STM32L051T6",0x417,32,8},
+{"STM32L051T8",0x417,64,8},
+{"STM32L052C6",0x417,32,8},
+{"STM32L052C8",0x417,64,8},
+{"STM32L052K6",0x417,32,8},
+{"STM32L052K8",0x417,64,8},
+{"STM32L052R6",0x417,32,8},
+{"STM32L052R8",0x417,64,8},
+{"STM32L052T6",0x417,32,8},
+{"STM32L052T8",0x417,64,8},
+{"STM32L053C6",0x417,32,8},
+{"STM32L053C8",0x417,64,8},
+{"STM32L053R6",0x417,32,8},
+{"STM32L053R8",0x417,64,8},
+{"STM32L062K8",0x417,64,8},
+{"STM32L063C8",0x417,64,8},
+{"STM32L063R8",0x417,64,8},
+{"STM32L100C6",0x416,32,4},
+{"STM32L100C6-A",0x429,32,4},
+{"STM32L100R8",0x416,64,8},
+{"STM32L100R8-A",0x429,64,8},
+{"STM32L100RB,0x416",128,10},
+{"STM32L100RB-A",0x429,128,10},
+{"STM32L100RC",0x427,256,16},
+{"STM32L151C6",0x416,32,10},
+{"STM32L151C6-A",0x429,32,10},
+{"STM32L151C8",0x416,64,10},
+{"STM32L151C8-A",0x429,64,10},
+{"STM32L151CB",0x416,128,16},
+{"STM32L151CB-A",0x429,128,16},
+{"STM32L151CC",0x427,256,32},
+{"STM32L151QC",0x427,256,32},
+{"STM32L151QD",0x436,384,48},
+{"STM32L151QE",0x437,512,80},
+{"STM32L151R6",0x416,32,10},
+{"STM32L151R6-A",0x429,32,10},
+{"STM32L151R8",0x416,64,10},
+{"STM32L151R8-A",0x429,64,10},
+{"STM32L151RB",0x416,128,16},
+{"STM32L151RB-A",0x429,128,16},
+{"STM32L151RC",0x427,256,32},
+{"STM32L151RC-A",0x429,256,32},
+{"STM32L151RD",0x436,384,48},
+{"STM32L151RE",0x437,512,80},
+{"STM32L151UC",0x427,256,32},
+{"STM32L151V8",0x416,64,10},
+{"STM32L151V8-A",0x429,64,10},
+{"STM32L151VB",0x416,128,16},
+{"STM32L151VB-A",0x429,128,16},
+{"STM32L151VC",0x427,256,32},
+{"STM32L151VC-A",0x429,256,32},
+{"STM32L151VD",0x436,384,48},
+{"STM32L151VE",0x437,512,80},
+{"STM32L151ZC",0x427,256,32},
+{"STM32L151ZD",0x436,384,48},
+{"STM32L151ZE",0x437,512,80},
+{"STM32L152C6",0x416,32,10},
+{"STM32L152C6-A",0x429,32,10},
+{"STM32L152C8",0x416,64,10},
+{"STM32L152C8-A",0x429,64,10},
+{"STM32L152CB",0x416,128,16},
+{"STM32L152CB-A",0x429,128,16},
+{"STM32L152CC",0x427,256,32},
+{"STM32L152QC",0x427,256,32},
+{"STM32L152QD",0x436,384,48},
+{"STM32L152QE",0x437,512,80},
+{"STM32L152R6",0x416,32,10},
+{"STM32L152R6-A",0x429,32,10},
+{"STM32L152R8",0x416,64,10},
+{"STM32L152R8-A",0x429,64,10},
+{"STM32L152RB",0x416,128,16},
+{"STM32L152RB-A",0x429,128,16},
+{"STM32L152RC",0x427,256,32},
+{"STM32L152RC-A",0x429,256,32},
+{"STM32L152RD",0x436,384,48},
+{"STM32L152RE",0x437,512,80},
+{"STM32L152V8",0x416,64,10},
+{"STM32L152V8-A",0x429,64,10},
+{"STM32L152VB",0x416,128,16},
+{"STM32L152VB-A",0x429,128,16},
+{"STM32L152VC",0x427,256,32},
+{"STM32L152VC-A",0x429,256,32},
+{"STM32L152VD",0x436,384,48},
+{"STM32L152VE",0x437,512,80},
+{"STM32L152ZC",0x427,256,32},
+{"STM32L152ZD",0x436,384,48},
+{"STM32L152ZE",0x437,512,80},
+{"STM32L162QD",0x436,384,48},
+{"STM32L162RC",0x427,256,32},
+{"STM32L162RC-A",0x429,256,32},
+{"STM32L162RD",0x436,384,48},
+{"STM32L162RE",0x437,512,80},
+{"STM32L162VC",0x427,256,32},
+{"STM32L162VC-A",0x429,256,32},
+{"STM32L162VD",0x436,384,48},
+{"STM32L162VE",0x437,512,80},
+{"STM32L162ZD",0x436,384,48},
+{"STM32L162ZE",0x437,512,80}};
+ 
+/* device table */
+const stm32_bl bootloader[] = {
+/* PID, device names, RAM start, RAM end, FLASH start,FLASH end, pages per sector  , page size, OPT start, OPT end, system start, system end */
+  {0x440,0x21,"STM32F051/030x8",0x20000800,0x20001FFF,0x1FFFEC00,0x1FFFF7FF},
+  {0x444,0x10,"STM32F03xxx",0x20000800,0x20000FFF,0x1FFFEC00,0x1FFFF7FF},
+  {0x445,0xA0,"STM32F042xx",0x00000000,0x00000000,0x1FFFC400,0x1FFFF7FF},
+  {0x448,0xA1,"STM32F07xxx",0x20001800,0x20003FFF,0x1FFFC800,0x1FFFF7FF},
+  {0x412,0x00,"STM32F10xxx low density",0x20000200,0x200027FF,0x1FFFF000,0x1FFFF7FF},
+  {0x410,0x00,"STM32F10xxx medium density",0x20000200,0x200047FF,0x1FFFF000,0x1FFFF7FF},
+  {0x414,0x00,"STM32F10xxx high density",0x20000200,0x2000FFFF,0x1FFFF000,0x1FFFF7FF},
+  {0x420,0x10,"STM32F10xxx medium density vl",0x20000200,0x20001FFF,0x1FFFF000,0x1FFFF7FF},
+  {0x428,0x10,"STM32F10xxx high density vl",0x20000200,0x20007FFF,0x1FFFF000,0x1FFFF7FF},
+  {0x418,0x00,"STM32F105xx/107xx",0x20001000,0x2000FFFF,0x1FFFB000,0x1FFFF7FF},
+  {0x430,0x21,"STM32F10xxx XL density",0x20000800,0x20017FFF,0x1FFFE000,0x1FFFF7FF},
+  {0x411,0x20,"STM32F2xxxx",0x20002000,0x2001FFFF,0x1FFF0000,0x1FFF77FF},
+  {0x411,0x33,"STM32F2xxxx",0x20002000,0x2001FFFF,0x1FFF0000,0x1FFF77FF},
+  {0x432,0x41,"STM32F373xx",0x20001400,0x20007FFF,0x1FFFD800,0x1FFFF7FF},
+  {0x432,0x50,"STM32F378xx",0x20001000,0x20007FFF,0x1FFFD800,0x1FFFF7FF},
+  {0x422,0x41,"STM32F302xB/303xB",0x20001400,0x20009FFF,0x1FFFD800,0x1FFFF7FF},
+  {0x422,0x50,"STM32F358xx",0x20001400,0x20009FFF,0x1FFFD800,0x1FFFF7FF},
+  {0x439,0x40,"STM32F301xx/302x4",0x20001800,0x20003FFF,0x1FFFD800,0x1FFFF7FF},
+  {0x439,0x50,"STM32F318xx",0x20001800,0x20003FFF,0x1FFFD800,0x1FFFF7FF},
+  {0x438,0x50,"STM32F303x4/334xx/328xx",0x20001800,0x20002FFF,0x1FFFD800,0x1FFFF7FF},
+  {0x413,0x31,"STM32F40xx/41xxx",0x20002000,0x2001FFFF,0x1FFF0000,0x1FFF77FF},
+  {0x413,0x90,"STM32F40xx/41xxx",0x20003000,0x2001FFFF,0x1FFF0000,0x1FFF77FF},
+  {0x419,0x70,"STM32F40xx/41xxx",0x20003000,0x2002FFFF,0x1FFF0000,0x1FFF77FF},
+  {0x419,0x90,"STM32F40xx/41xxx",0x20003000,0x2002FFFF,0x1FFF0000,0x1FFF77FF},
+  {0x423,0xD1,"STM32F401xB",0x20003000,0x2000FFFF,0x1FFF0000,0x1FFF77FF},
+  {0x433,0xD1,"STM32F401xD",0x20003000,0x20017FFF,0x1FFF0000,0x1FFF77FF},
+  {0x431,0xD0,"STM32F411xE",0x20003000,0x2001FFFF,0x1FFF0000,0x1FFF77FF},
+  {0x417,0xC0,"STM32L05xxx/06xxx",0x20001000,0x20001FFF,0x1FF00000,0x1FF00FFF},
+  {0x416,0x20,"STM32L1xxx6",0x20000800,0x20003FFF,0x1FF00000,0x1FF00FFF},
+  {0x429,0x20,"STM32L1xxx6A",0x20001000,0x20007FFF,0x1FF00000,0x1FF00FFF},
+  {0x427,0x40,"STM32L1xxxC",0x20001000,0x20007FFF,0x1FF00000,0x1FF01FFF},
+  {0x436,0x45,"STM32L1xxxD",0x20001000,0x2000BFFF,0x1FF00000,0x1FF01FFF},
+  {0x437,0x40,"STM32L1xxxE",0x20001000,0x20013FFF,0x1FF00000,0x1FF01FFF}
 };
 
-CRS232 serial("stm32_device");
+CRS232 serial("stm32_blice");
 CEventServer *event_server=CEventServer::instance();
 std::list<std::string> events;
 stm32_cmd commands;
-const stm32_dev *current_device=NULL;
+const stm32_bl *current_device=NULL;
 
 void stm32_init(std::string &dev,unsigned int baud)
 {
@@ -205,10 +652,10 @@ bool stm32_get_chip_id(unsigned short int *pid)
     return false;
   }
   *pid=(answer[2] << 8) | answer[3];
-  for(i=0;i<8;i++)
+  for(i=0;i<sizeof(bootloader)/sizeof(stm32_bl);i++)
   {
-    if(devices[i].id==*pid)
-      current_device=&devices[i];
+    if(bootloader[i].id==*pid)
+      current_device=&bootloader[i];
   }
   if(current_device==NULL)
   {
@@ -224,13 +671,29 @@ bool stm32_get_chip_id(unsigned short int *pid)
   return true;
 }
 
-bool stm32_get_chip_info(const stm32_dev **info)
+bool stm32_get_chip_info(const stm32_bl **info)
 {
   *info=current_device;
 
   return true;
 }
 
+bool stm32_get_device_info(std::string &device_name,const stm32_dev **info)
+{
+  unsigned int i=0;
+
+  for(i=0;i<sizeof(devices)/sizeof(stm32_dev);i++)
+  {
+    if(devices[i].name==device_name)
+    {
+      *info=&devices[i];
+      return true;
+    }
+  }
+
+  return false;
+}
+
 bool stm32_read_memory(unsigned int address,unsigned int length,unsigned char *data)
 {
   return true;
diff --git a/trunk/src/stm32.h b/trunk/src/stm32.h
index 0c9b990d57cc12f9147452002dface0f2b32389f..36b03f5d4757815e4e399636f952d4501ab46ded 100755
--- a/trunk/src/stm32.h
+++ b/trunk/src/stm32.h
@@ -24,16 +24,20 @@ typedef struct {
   uint8_t ur;
 }stm32_cmd;
 
+typedef struct {
+  std::string name;
+  uint16_t pid;
+  uint16_t flash_size;
+  uint16_t ram_size;
+}stm32_dev;
+
 typedef struct {
   uint16_t id;
+  uint8_t bl_id;
   std::string name;
   uint32_t ram_start, ram_end;
-  uint32_t fl_start, fl_end;
-  uint16_t fl_pps; // pages per sector
-  uint16_t fl_ps;  // page size
-  uint32_t opt_start, opt_end;
   uint32_t mem_start, mem_end;
-}stm32_dev;
+}stm32_bl;
 
 // public functions
 void stm32_init(std::string &dev,unsigned int baud);
@@ -43,7 +47,8 @@ bool stm32_discovery(void);
 bool stm32_get_commands(stm32_cmd *cmd);
 bool stm32_get_bootloader_ver(unsigned char *bl_ver);
 bool stm32_get_chip_id(unsigned short int *pid);
-bool stm32_get_chip_info(const stm32_dev **info);
+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_write_memory(unsigned int address, unsigned int length, unsigned char *data);