This is an automated email from Gerrit.

Stefan Arnold ([email protected]) just uploaded a new patch set to Gerrit, which 
you can find at http://openocd.zylin.com/4257

-- gerrit

commit e4cd638b8465fe34cff9dd31da0972bd4c945bfa
Author: Stefan Arnold <[email protected]>
Date:   Tue Oct 17 09:48:03 2017 +0200

    Add option "aux0" to "at91samd" for changing and reading AUX0 register 
which represents various fuses.
    
    Change-Id: Icfe3191269471cf3e6661625fb6e7c611015c102
    Signed-off-by: Stefan Arnold <[email protected]>

diff --git a/src/flash/nor/at91samd.c b/src/flash/nor/at91samd.c
index ad88c51..4f772ad 100644
--- a/src/flash/nor/at91samd.c
+++ b/src/flash/nor/at91samd.c
@@ -944,6 +944,116 @@ COMMAND_HANDLER(samd_handle_eeprom_command)
        return res;
 }
 
+
+static uint8_t hexchar_to_value(char c)
+       {
+       if(isalpha(c))
+               {
+               return tolower(c) -'a' +10;
+               }
+       return c -'0';
+       }
+
+
+static int get_u32_from_hex(const char *str, uint32_t *value)
+       {
+       unsigned int i;
+
+       if(strlen(str) == 0 || strlen(str) > 8)
+               {
+               return 0;
+               }
+       *value = 0;
+       for(i=0;i<strlen(str);i++)
+               {
+               if(!isxdigit(str[i]))
+                       {
+                       return 0;
+                       }
+               *value = (*value << 4) | (uint32_t)hexchar_to_value(str[i]);
+               }
+       return 1;
+       }
+
+
+static int get_u32_from_str(const char *str, uint32_t *value)
+       {
+       unsigned int i;
+
+       if(strlen(str) == 0 || strlen(str) > 10)
+               {
+               return 0;
+               }
+       *value = 0;
+       for(i=0;i<strlen(str);i++)
+               {
+               if(!isdigit(str[i]))
+                       {
+                       return 0;
+                       }
+               *value = *value *10 +(str[i] -'0');
+               }
+       if(*value > 0xFFFFFFFF)
+               {
+               return 0;
+               }
+
+       return 1;
+       }
+
+
+COMMAND_HANDLER(samd_handle_aux0_command)
+       {
+       int res = ERROR_OK;
+       struct target *target = get_current_target(CMD_CTX);
+
+       if (target)
+               {
+               if(target->state != TARGET_HALTED)
+                       {
+                       LOG_ERROR("Target not halted");
+                       return ERROR_TARGET_NOT_HALTED;
+                       }
+
+               if(CMD_ARGC >= 1)
+                       {
+                       uint32_t value;
+                       if(     strlen(CMD_ARGV[0]) >= 3 &&
+                               CMD_ARGV[0][0] == '0' &&
+                               CMD_ARGV[0][1] == 'x')
+                               {
+                               const char *value_str = &(CMD_ARGV[0][2]);
+                               if(!get_u32_from_hex(value_str, &value))
+                                       {
+                                       command_print(CMD_CTX, "Invalid Hex 
value for 32-bit register.");
+                                       return ERROR_COMMAND_SYNTAX_ERROR;
+                                       }
+                               }
+                       else
+                               {
+                               if(!get_u32_from_str(CMD_ARGV[0], &value))
+                                       {
+                                       command_print(CMD_CTX, "Invalid value 
for 32-bit register.");
+                                       return ERROR_COMMAND_SYNTAX_ERROR;
+                                       }
+                               }
+
+                       res = samd_modify_user_row(target, value, 0, 31);
+                       }
+               else
+                       {
+                       uint32_t val;
+                       res = target_read_u32(target, SAMD_USER_ROW, &val);
+                       if (res == ERROR_OK)
+                               {
+                               command_print(CMD_CTX, "AUX0: 0x%08"PRIX32, 
val);
+                               }
+                       }
+               }
+
+       return res;
+       }
+
 COMMAND_HANDLER(samd_handle_bootloader_command)
 {
        int res = ERROR_OK;
@@ -1094,6 +1204,13 @@ static const struct command_registration 
at91samd_exec_command_handlers[] = {
                        "Changes are stored immediately but take affect after 
the MCU is"
                        "reset.",
        },
+       {
+               .name = "aux0",
+               .usage = "[value]",
+               .handler = samd_handle_aux0_command,
+               .mode = COMMAND_EXEC,
+               .help = "Show or set the AUX0 register, stored in the User 
Row.",
+       },
        COMMAND_REGISTRATION_DONE
 };
 

-- 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to