@@ -1704,11 +1704,33 @@ int cmd_dfu_download(const struct shell *shell, size_t argc, char **argv)
17041704{
17051705 if (argc < 2 ) {
17061706 shell_error (shell , "Missing required arguments" );
1707- shell_print (shell , "Usage: tmo dfu download <target>\n"
1708- " target: 0 for mcu, 1 for modem, 2 for wifi" );
1707+ shell_print (shell , "Usage: tmo dfu download <target> [filename]\n"
1708+ " target: 0 for mcu, 1 for modem, 2 for wifi\n"
1709+ " filename(optional): base filename e.g tmo_shell.tmo_dev_edge" );
1710+ return - EINVAL ;
1711+ }
1712+ int target = (int ) strtol (argv [1 ], NULL , 10 );
1713+ if (target > 2 ) {
1714+ shell_error (shell , "Only 3 targets supported (0-2)" );
17091715 return - EINVAL ;
17101716 }
1711- return tmo_dfu_download ( (int ) strtol (argv [1 ], NULL , 10 ));
1717+
1718+ if (argv [2 ] == NULL && target > 0 ) {
1719+ shell_error (shell , "There are no updates at this time" );
1720+ return - EINVAL ;
1721+ }
1722+
1723+ return tmo_dfu_download (shell , target , argv [2 ], argv [3 ]);
1724+ }
1725+
1726+ int cmd_dfu_get_slot (const struct shell * shell , size_t argc , char * * argv )
1727+ {
1728+ #ifdef BOOT_SLOT
1729+ shell_print (shell , "Slot %s" , BOOT_SLOT );
1730+ #else
1731+ shell_print (shell , "Slot Undefined" );
1732+ #endif
1733+ return 0 ;
17121734}
17131735
17141736int cmd_dfu_get_version (const struct shell * shell , size_t argc , char * * argv )
@@ -1767,22 +1789,39 @@ int cmd_dfu_get_version(const struct shell *shell, size_t argc, char **argv)
17671789
17681790int cmd_dfu_update (const struct shell * shell , size_t argc , char * * argv )
17691791{
1770- if (argc < 3 ){
1792+ int firmware_target = (int ) strtol (argv [1 ], NULL , 10 );
1793+ int delta_firmware_target = (int ) strtol (argv [2 ], NULL , 10 );
1794+
1795+ if (((argc < 2 ) && (firmware_target != DFU_GECKO )) ||
1796+ ((argc != 3 ) && (firmware_target == DFU_GECKO ))) {
17711797 shell_error (shell , "Missing required arguments" );
1772- shell_print (shell , "Usage: tmo dfu update <target> <modem delta file>\n"
1773- " target : 0 for mcu, 1 for modem, 2 for wifi/ble\n"
1774- " modem delta file: SAMPLE: 0 for update3.2.20351_20161_dis.ua, 1 for update3.2.20161_20351_dis.ua\n"
1775- " GOLDEN: 2 for update20351_20161_801_test.ua, 3 for update20161_20351_801_test.ua\n" );
1798+ shell_print (shell , "Usage: tmo dfu update <target>\n"
1799+ " target : 0 for mcu, 1 for modem, 2 for wifi/ble\n"
1800+ " mcu_slot(optional): slot to update. Applicable only to mcu target\n"
1801+ " Usage (mcu): \n"
1802+ " tmo dfu update 0 [slot]\n"
1803+ " Usage (modem): \n"
1804+ " tmo dfu update 1 [modem_delta_file]\n"
1805+ " Usage (wifi/ble): \n"
1806+ " tmo dfu update 2\n" );
17761807 return - EINVAL ;
17771808 }
17781809
1779- int firmware_target = (int ) strtol (argv [1 ], NULL , 10 );
1780- int delta_firmware_target = (int ) strtol (argv [2 ], NULL , 10 );
1781-
17821810 switch (firmware_target )
17831811 {
17841812 case DFU_GECKO :
17851813 {
1814+ #ifdef BOOT_SLOT
1815+ if ((strcmp (BOOT_SLOT , "0" ) || strcmp (BOOT_SLOT , "1" ))) {
1816+ if (atoi (BOOT_SLOT ) == delta_firmware_target ) {
1817+ shell_error (shell ,"Can't program slot you are running from" );
1818+ return - EINVAL ;
1819+ }
1820+ }
1821+ #else
1822+ shell_error (shell ,"Can't program over currently running firmware" );
1823+ return - EINVAL ;
1824+ #endif
17861825 shell_print (shell ,"\nStarting the FW update for SiLabs Pearl Gecko" );
17871826 int status ;
17881827 status = dfu_mcu_firmware_upgrade (delta_firmware_target );
@@ -2120,6 +2159,7 @@ SHELL_STATIC_SUBCMD_SET_CREATE(tmo_dfu_sub,
21202159 SHELL_CMD (settings , NULL , "Print DFU settings" , cmd_dfu_print_settings ),
21212160 SHELL_CMD (update , NULL , "Update FW" , cmd_dfu_update ),
21222161 SHELL_CMD (version , NULL , "Get current FW version" , cmd_dfu_get_version ),
2162+ SHELL_CMD (slot , NULL , "Get current slot" , cmd_dfu_get_slot ),
21232163 SHELL_SUBCMD_SET_END
21242164 );
21252165
0 commit comments