This is an automated email from Gerrit.

Salvador Arroyo (sarroyof...@yahoo.es) just uploaded a new patch set to Gerrit, 
which you can find at http://openocd.zylin.com/500

-- gerrit

commit 661112671b5dfd74ec161272657c0b715e4751ea
Author: Salvador Arroyo <sarroyof...@yahoo.es>
Date:   Wed Feb 29 23:55:53 2012 +0100

    topic:  Flash support for Pic32mx1xx/2xx
    
    Change-Id: I496cb745fb1eb5c9159471838013b8d19418f5c0
    Signed-off-by: Salvador Arroyo <sarroyof...@yahoo.es>

diff --git a/src/flash/nor/pic32mx.c b/src/flash/nor/pic32mx.c
index 3c1a1d9..4d71f3c 100644
--- a/src/flash/nor/pic32mx.c
+++ b/src/flash/nor/pic32mx.c
@@ -51,6 +51,7 @@
 
 /* pic32mx configuration register locations */
 
+#define PIC32MX_DEVCFG0_1_2     0xBFC00BFC
 #define PIC32MX_DEVCFG0                0xBFC02FFC
 #define PIC32MX_DEVCFG1                0xBFC02FF8
 #define PIC32MX_DEVCFG2                0xBFC02FF4
@@ -91,9 +92,12 @@
 #define NVMKEY1                        0xAA996655
 #define NVMKEY2                        0x556699AA
 
+#define MX_1_2   1    /*PIC32mx1xx/2xx*/
+
 struct pic32mx_flash_bank {
        struct working_area *write_algorithm;
        int probed;
+       int dev_type; /*Default 0.      1 for Pic32MX1XX/2XX  */
 };
 
 /*
@@ -190,6 +194,7 @@ FLASH_BANK_COMMAND_HANDLER(pic32mx_flash_bank_command)
 
        pic32mx_info->write_algorithm = NULL;
        pic32mx_info->probed = 0;
+       pic32mx_info->dev_type = 0;
 
        return ERROR_OK;
 }
@@ -244,7 +249,9 @@ static int pic32mx_nvm_exec(struct flash_bank *bank, 
uint32_t op, uint32_t timeo
 static int pic32mx_protect_check(struct flash_bank *bank)
 {
        struct target *target = bank->target;
+       struct pic32mx_flash_bank *pic32mx_info = bank->driver_priv;
 
+       uint32_t config0_address;
        uint32_t devcfg0;
        int s;
        int num_pages;
@@ -254,7 +261,12 @@ static int pic32mx_protect_check(struct flash_bank *bank)
                return ERROR_TARGET_NOT_HALTED;
        }
 
-       target_read_u32(target, PIC32MX_DEVCFG0, &devcfg0);
+       if (pic32mx_info->dev_type == MX_1_2)
+               config0_address = PIC32MX_DEVCFG0_1_2;
+       else
+               config0_address = PIC32MX_DEVCFG0;
+
+       target_read_u32(target, config0_address, &devcfg0);
 
        if ((devcfg0 & (1 << 28)) == 0) /* code protect bit */
                num_pages = 0xffff;                     /* All pages protected 
*/
@@ -327,7 +339,7 @@ static int pic32mx_protect(struct flash_bank *bank, int 
set, int first, int last
 
 /* see contib/loaders/flash/pic32mx.s for src */
 
-static const uint32_t pic32mx_flash_write_code[] = {
+static uint32_t pic32mx_flash_write_code[] = {
                                        /* write: */
        0x3C08AA99,             /* lui $t0, 0xaa99 */
        0x35086655,             /* ori $t0, 0x6655 */
@@ -414,12 +426,25 @@ static int pic32mx_write_block(struct flash_bank *bank, 
uint8_t *buffer,
                return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
        };
 
+       if (pic32mx_info->dev_type == MX_1_2) {   /* Change values for counters 
and  row size*/
+              pic32mx_flash_write_code[8] = 0x2CD30020;
+              pic32mx_flash_write_code[14] = 0x24840080;
+              pic32mx_flash_write_code[15] = 0x24A50080;
+              pic32mx_flash_write_code[17] = 0x24C6FFE0;
+       } else {
+              pic32mx_flash_write_code[8] = 0x2CD30080;
+              pic32mx_flash_write_code[14] = 0x24840200;
+              pic32mx_flash_write_code[15] = 0x24A50200;
+              pic32mx_flash_write_code[17] = 0x24C6FF80;
+       }
+
        retval = target_write_buffer(target, 
pic32mx_info->write_algorithm->address,
                        sizeof(pic32mx_flash_write_code), (uint8_t 
*)pic32mx_flash_write_code);
        if (retval != ERROR_OK)
                return retval;
 
        /* memory buffer */
+       /*PIC32mx1xx/2xx needs a 128 buffer size but 512 it's ok...*/
        while (target_alloc_working_area_try(target, buffer_size, &source) != 
ERROR_OK) {
                buffer_size /= 2;
                if (buffer_size <= 256) {
@@ -610,7 +635,21 @@ static int pic32mx_probe(struct flash_bank *bank)
                return ERROR_FLASH_OPERATION_FAILED;
        }
 
-       page_size = 4096;
+        /*Check for PIC32mx1xx/2xx*/
+       for (i = 0; pic32mx_devs[i].name != NULL; i++) {
+               if (pic32mx_devs[i].devid == (device_id & 0x0fffffff)) {
+                       if ((*(pic32mx_devs[i].name) == '1') || 
(*(pic32mx_devs[i].name) == '2'))
+                               pic32mx_info->dev_type = MX_1_2;
+                       break;
+               }
+       }
+
+
+       if (pic32mx_info->dev_type == MX_1_2)
+               page_size = 1024;
+       else
+               page_size = 4096;
+
 
        if (Virt2Phys(bank->base) == PIC32MX_PHYS_BOOT_FLASH) {
                /* 0x1FC00000: Boot flash size */
@@ -624,13 +663,22 @@ static int pic32mx_probe(struct flash_bank *bank)
                }
 #else
                /* fixed 12k boot bank - see comments above */
-               num_pages = (12 * 1024);
+               if (pic32mx_info->dev_type == MX_1_2)
+                       num_pages = (3 * 1024);
+               else
+                       num_pages = (12 * 1024);
+
 #endif
        } else {
                /* read the flash size from the device */
                if (target_read_u32(target, PIC32MX_BMXPFMSZ, &num_pages) != 
ERROR_OK) {
-                       LOG_WARNING("PIC32MX flash size failed, probe 
inaccurate - assuming 512k flash");
-                       num_pages = (512 * 1024);
+                       if (pic32mx_info->dev_type == MX_1_2) {
+                               LOG_WARNING("PIC32MX flash size failed, probe 
inaccurate - assuming 32k flash");
+                               num_pages = (32 * 1024);
+                       } else {
+                               LOG_WARNING("PIC32MX flash size failed, probe 
inaccurate - assuming 512k flash");
+                               num_pages = (512 * 1024);
+                       }
                }
        }
 

-- 

------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing 
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to