]> git.sur5r.net Git - openocd/blobdiff - src/flash/nor/xmc4xxx.c
Remove FSF address from GPL notices
[openocd] / src / flash / nor / xmc4xxx.c
index d4242a24df20e9312a996bd0663ee47c15d32f4d..2a52269dc5b7f7288c80d333e517ff9f4a3d6244 100644 (file)
@@ -11,6 +11,8 @@
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   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, see <http://www.gnu.org/licenses/>. *
 ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
 
 /* Flash controller configuration values */
 #define FLASH_ID_XMC4500        0xA2
+#define FLASH_ID_XMC4700_4800   0x92
 #define FLASH_ID_XMC4100_4200   0x9C
 #define FLASH_ID_XMC4400        0x9F
 
@@ -251,6 +254,10 @@ static const unsigned int sector_capacity_12[12] = {
        16, 16, 16, 16, 16, 16, 16, 16, 128, 256, 256, 256
 };
 
+static const unsigned int sector_capacity_16[16] = {
+       16, 16, 16, 16, 16, 16, 16, 16, 128, 256, 256, 256, 256, 256, 256, 256
+};
+
 static int xmc4xxx_write_command_sequence(struct flash_bank *bank,
                                         struct xmc4xxx_command_seq *seq,
                                         int seq_len)
@@ -285,6 +292,9 @@ static int xmc4xxx_load_bank_layout(struct flash_bank *bank)
        case 12:
                capacity = sector_capacity_12;
                break;
+       case 16:
+               capacity = sector_capacity_16;
+               break;
        default:
                LOG_ERROR("Unexpected number of sectors, %d\n",
                          bank->num_sectors);
@@ -373,6 +383,10 @@ static int xmc4xxx_probe(struct flash_bank *bank)
                bank->num_sectors = 12;
                LOG_DEBUG("XMC4xxx: XMC4500 detected.");
                break;
+       case FLASH_ID_XMC4700_4800:
+               bank->num_sectors = 16;
+               LOG_DEBUG("XMC4xxx: XMC4700/4800 detected.");
+               break;
        default:
                LOG_ERROR("XMC4xxx: Unexpected flash ID. got %02" PRIx8,
                          flash_id);
@@ -608,7 +622,7 @@ static int xmc4xxx_enter_page_mode(struct flash_bank *bank)
  * implement our own */
 
 /** Checks whether a memory region is zeroed. */
-int xmc4xxx_blank_check_memory(struct target *target,
+static int xmc4xxx_blank_check_memory(struct target *target,
        uint32_t address, uint32_t count, uint32_t *blank)
 {
        struct working_area *erase_check_algorithm;
@@ -616,16 +630,8 @@ int xmc4xxx_blank_check_memory(struct target *target,
        struct armv7m_algorithm armv7m_info;
        int retval;
 
-       /* see contrib/loaders/erase_check/armv7m_0_erase_check.s for src */
-
        static const uint8_t erase_check_code[] = {
-               /* loop: */
-               0x03, 0x78,             /* ldrb r3, [r0] */
-               0x01, 0x30,             /* adds r0, #1 */
-               0x1A, 0x43,             /* orrs r2, r2, r3 */
-               0x01, 0x39,             /* subs r1, r1, #1 */
-               0xFA, 0xD1,             /* bne  loop */
-               0x00, 0xBE              /* bkpt #0 */
+#include "../../../contrib/loaders/erase_check/armv7m_0_erase_check.inc"
        };
 
        /* make sure we have a working area */
@@ -636,7 +642,7 @@ int xmc4xxx_blank_check_memory(struct target *target,
        retval = target_write_buffer(target, erase_check_algorithm->address,
                        sizeof(erase_check_code), (uint8_t *)erase_check_code);
        if (retval != ERROR_OK)
-               return retval;
+               goto cleanup;
 
        armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
        armv7m_info.core_mode = ARM_MODE_THREAD;
@@ -667,6 +673,7 @@ int xmc4xxx_blank_check_memory(struct target *target,
        destroy_reg_param(&reg_params[1]);
        destroy_reg_param(&reg_params[2]);
 
+cleanup:
        target_free_working_area(target, erase_check_algorithm);
 
        return retval;
@@ -676,7 +683,7 @@ static int xmc4xxx_flash_blank_check(struct flash_bank *bank)
 {
        struct target *target = bank->target;
        int i;
-       int retval;
+       int retval = ERROR_OK;
        uint32_t blank;
 
        if (bank->target->state != TARGET_HALTED) {
@@ -700,7 +707,7 @@ static int xmc4xxx_flash_blank_check(struct flash_bank *bank)
                        bank->sectors[i].is_erased = 0;
        }
 
-       return ERROR_OK;
+       return retval;
 }
 
 static int xmc4xxx_write_page(struct flash_bank *bank, const uint8_t *pg_buf,
@@ -971,6 +978,24 @@ static int xmc4xxx_get_info_command(struct flash_bank *bank, char *buf, int buf_
                        break;
                }
                break;
+       case 0x700:
+               dev_str = "XMC4700";
+
+               switch (rev_id) {
+               case 0x1:
+                       rev_str = "EES-AA";
+                       break;
+               }
+               break;
+       case 0x800:
+               dev_str = "XMC4800";
+
+               switch (rev_id) {
+               case 0x1:
+                       rev_str = "EES-AA";
+                       break;
+               }
+               break;
 
        default:
                snprintf(buf, buf_size,