lpc2000: ignore status of part ID IAP command
authorGrigori Goronzy <greg@chown.ath.cx>
Thu, 30 Oct 2014 00:14:58 +0000 (01:14 +0100)
committerSpencer Oliver <spen@spen-soft.co.uk>
Mon, 24 Nov 2014 22:27:02 +0000 (22:27 +0000)
The IAP firmware won't return a proper status with some versions. This
happens on my CCC r0ket board and others have seen it as well [1]. So
just ignore the status code and do a (weak) consistency check instead.

[1] http://www.lpcware.com/content/forum/lpc1343-iap-read-part-identification-command

Change-Id: I0daa779d520a540629677c56857bbc20d6db422d
Signed-off-by: Grigori Goronzy <greg@chown.ath.cx>
Reviewed-on: http://openocd.zylin.com/2364
Tested-by: jenkins
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
src/flash/nor/lpc2000.c

index 9c0cc1e2a03ba38ba7ca07d4ddc19bdd4a214bbb..2d2c1a553718aaf693952893d3836b944a2760a7 100644 (file)
@@ -1145,12 +1145,16 @@ static int get_lpc2000_part_id(struct flash_bank *bank, uint32_t *part_id)
        if (retval != ERROR_OK)
                return retval;
 
-       int status_code = lpc2000_iap_call(bank, iap_working_area, 54, param_table, result_table);
+       /* The status seems to be bogus with the part ID command on some IAP
+          firmwares, so ignore it. */
+       lpc2000_iap_call(bank, iap_working_area, 54, param_table, result_table);
 
-       if (status_code == LPC2000_CMD_SUCCESS)
-               *part_id = result_table[0];
+       /* If the result is zero, the command probably didn't work out. */
+       if (result_table[0] == 0)
+               return LPC2000_INVALID_COMMAND;
 
-       return status_code;
+       *part_id = result_table[0];
+       return LPC2000_CMD_SUCCESS;
 }
 
 static int lpc2000_auto_probe_flash(struct flash_bank *bank)