src/flash/nor/at91sam3|4l|7: fix clang static analyzer warnings
[openocd.git] / src / flash / nor / at91sam4l.c
index fa7cff38c55346548665c6975934c524f12130fc..d4bfe5310368fec6f15ff62711ad1680042999ec 100644 (file)
@@ -13,9 +13,7 @@
  *   GNU General Public License for more details.                          *
  *                                                                         *
  *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -131,10 +129,8 @@ struct sam4l_info {
 
        bool probed;
        struct target *target;
-       struct sam4l_info *next;
 };
 
-static struct sam4l_info *sam4l_chips;
 
 static int sam4l_flash_wait_until_ready(struct target *target)
 {
@@ -206,37 +202,26 @@ static int sam4l_flash_command(struct target *target, uint8_t cmd, int page)
 
 FLASH_BANK_COMMAND_HANDLER(sam4l_flash_bank_command)
 {
-       struct sam4l_info *chip = sam4l_chips;
-
-       while (chip) {
-               if (chip->target == bank->target)
-                       break;
-               chip = chip->next;
-       }
-
-       if (!chip) {
-               /* Create a new chip */
-               chip = calloc(1, sizeof(*chip));
-               if (!chip)
-                       return ERROR_FAIL;
-
-               chip->target = bank->target;
-               chip->probed = false;
-
-               bank->driver_priv = chip;
-
-               /* Insert it into the chips list (at head) */
-               chip->next = sam4l_chips;
-               sam4l_chips = chip;
-       }
-
        if (bank->base != SAM4L_FLASH) {
-               LOG_ERROR("Address 0x%08" PRIx32 " invalid bank address (try 0x%08" PRIx32
+               LOG_ERROR("Address " TARGET_ADDR_FMT
+                               " invalid bank address (try 0x%08" PRIx32
                                "[at91sam4l series] )",
                                bank->base, SAM4L_FLASH);
                return ERROR_FAIL;
        }
 
+       struct sam4l_info *chip;
+       chip = calloc(1, sizeof(*chip));
+       if (!chip) {
+               LOG_ERROR("No memory for flash bank chip info");
+               return ERROR_FAIL;
+       }
+
+       chip->target = bank->target;
+       chip->probed = false;
+
+       bank->driver_priv = chip;
+
        return ERROR_OK;
 }
 
@@ -398,7 +383,7 @@ static int sam4l_protect_check(struct flash_bank *bank)
 
 static int sam4l_protect(struct flash_bank *bank, int set, int first, int last)
 {
-       struct sam4l_info *chip = sam4l_chips;
+       struct sam4l_info *chip = (struct sam4l_info *)bank->driver_priv;
 
        if (bank->target->state != TARGET_HALTED) {
                LOG_ERROR("Target not halted");
@@ -616,6 +601,7 @@ static int sam4l_write(struct flash_bank *bank, const uint8_t *buffer,
 
        /* There's at least one aligned page to write out. */
        if (count >= chip->page_size) {
+               assert(chip->page_size > 0);
                int np = count / chip->page_size + ((count % chip->page_size) ? 1 : 0);
 
                for (int i = 0; i < np; i++) {
@@ -647,10 +633,15 @@ static int sam4l_write(struct flash_bank *bank, const uint8_t *buffer,
 COMMAND_HANDLER(sam4l_handle_reset_deassert)
 {
        struct target *target = get_current_target(CMD_CTX);
-       struct armv7m_common *armv7m = target_to_armv7m(target);
        int retval = ERROR_OK;
        enum reset_types jtag_reset_config = jtag_get_reset_config();
 
+       /* If the target has been unresponsive before, try to re-establish
+        * communication now - CPU is held in reset by DSU, DAP is working */
+       if (!target_was_examined(target))
+               target_examine_one(target);
+       target_poll(target);
+
        /* In case of sysresetreq, debug retains state set in cortex_m_assert_reset()
         * so we just release reset held by SMAP
         *
@@ -659,14 +650,14 @@ COMMAND_HANDLER(sam4l_handle_reset_deassert)
         * After vectreset SMAP release is not needed however makes no harm
         */
        if (target->reset_halt && (jtag_reset_config & RESET_HAS_SRST)) {
-               retval = mem_ap_write_u32(armv7m->debug_ap, DCB_DHCSR, DBGKEY | C_HALT | C_DEBUGEN);
+               retval = target_write_u32(target, DCB_DHCSR, DBGKEY | C_HALT | C_DEBUGEN);
                if (retval == ERROR_OK)
-                       retval = mem_ap_write_atomic_u32(armv7m->debug_ap, DCB_DEMCR,
+                       retval = target_write_u32(target, DCB_DEMCR,
                                TRCENA | VC_HARDERR | VC_BUSERR | VC_CORERESET);
                /* do not return on error here, releasing SMAP reset is more important */
        }
 
-       int retval2 = mem_ap_write_atomic_u32(armv7m->debug_ap, SMAP_SCR, SMAP_SCR_HCR);
+       int retval2 = target_write_u32(target, SMAP_SCR, SMAP_SCR_HCR);
        if (retval2 != ERROR_OK)
                return retval2;
 
@@ -678,7 +669,8 @@ static const struct command_registration at91sam4l_exec_command_handlers[] = {
                .name = "smap_reset_deassert",
                .handler = sam4l_handle_reset_deassert,
                .mode = COMMAND_EXEC,
-               .help = "deasert internal reset held by SMAP"
+               .help = "deassert internal reset held by SMAP",
+               .usage = "",
        },
        COMMAND_REGISTRATION_DONE
 };
@@ -694,7 +686,7 @@ static const struct command_registration at91sam4l_command_handlers[] = {
        COMMAND_REGISTRATION_DONE
 };
 
-struct flash_driver at91sam4l_flash = {
+const struct flash_driver at91sam4l_flash = {
        .name = "at91sam4l",
        .commands = at91sam4l_command_handlers,
        .flash_bank_command = sam4l_flash_bank_command,
@@ -706,4 +698,5 @@ struct flash_driver at91sam4l_flash = {
        .auto_probe = sam4l_probe,
        .erase_check = default_flash_blank_check,
        .protect_check = sam4l_protect_check,
+       .free_driver_priv = default_flash_free_driver_priv,
 };

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)