flash/nor/avrf: Minor code cleanups
[fw/openocd] / src / flash / nor / avrf.c
index 3261f8ba11e233b248300f6fe9b5a006a3a1e968..93f6872bd19bc0f7dbd2f841687b0491713e353a 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
@@ -60,15 +58,23 @@ struct avrf_type {
 
 struct avrf_flash_bank {
        int ppage_size;
-       int probed;
+       bool probed;
 };
 
-static struct avrf_type avft_chips_info[] = {
+static const struct avrf_type avft_chips_info[] = {
 /*     name, chip_id,  flash_page_size, flash_page_num,
  *                     eeprom_page_size, eeprom_page_num
  */
        {"atmega128", 0x9702, 256, 512, 8, 512},
+       {"atmega128rfa1", 0xa701, 128, 512, 8, 512},
+       {"atmega256rfr2", 0xa802, 256, 1024, 8, 1024},
        {"at90can128", 0x9781, 256, 512, 8, 512},
+       {"at90usb128", 0x9782, 256, 512, 8, 512},
+       {"atmega164p", 0x940a, 128, 128, 4, 128},
+       {"atmega324p", 0x9508, 128, 256, 4, 256},
+       {"atmega324pa", 0x9511, 128, 256, 4, 256},
+       {"atmega644p", 0x960a, 256, 256, 8, 256},
+       {"atmega1284p", 0x9705, 256, 512, 8, 512},
 };
 
 /* avr program functions */
@@ -137,16 +143,24 @@ static int avr_jtagprg_chiperase(struct avr_common *avr)
 }
 
 static int avr_jtagprg_writeflashpage(struct avr_common *avr,
-       uint8_t *page_buf,
+       const bool ext_addressing,
+       const uint8_t *page_buf,
        uint32_t buf_size,
        uint32_t addr,
        uint32_t page_size)
 {
-       uint32_t i, poll_value;
+       uint32_t poll_value;
 
        avr_jtag_sendinstr(avr->jtag_info.tap, NULL, AVR_JTAG_INS_PROG_COMMANDS);
        avr_jtag_senddat(avr->jtag_info.tap, NULL, 0x2310, AVR_JTAG_REG_ProgrammingCommand_Len);
 
+       /* load extended high byte */
+       if (ext_addressing)
+               avr_jtag_senddat(avr->jtag_info.tap,
+                       NULL,
+                       0x0b00 | ((addr >> 17) & 0xFF),
+                       AVR_JTAG_REG_ProgrammingCommand_Len);
+
        /* load addr high byte */
        avr_jtag_senddat(avr->jtag_info.tap,
                NULL,
@@ -161,7 +175,7 @@ static int avr_jtagprg_writeflashpage(struct avr_common *avr,
 
        avr_jtag_sendinstr(avr->jtag_info.tap, NULL, AVR_JTAG_INS_PROG_PAGELOAD);
 
-       for (i = 0; i < page_size; i++) {
+       for (uint32_t i = 0; i < page_size; i++) {
                if (i < buf_size)
                        avr_jtag_senddat(avr->jtag_info.tap, NULL, page_buf[i], 8);
                else
@@ -199,7 +213,7 @@ FLASH_BANK_COMMAND_HANDLER(avrf_flash_bank_command)
        avrf_info = malloc(sizeof(struct avrf_flash_bank));
        bank->driver_priv = avrf_info;
 
-       avrf_info->probed = 0;
+       avrf_info->probed = false;
 
        return ERROR_OK;
 }
@@ -228,17 +242,12 @@ static int avrf_erase(struct flash_bank *bank, int first, int last)
        return avr_jtagprg_leaveprogmode(avr);
 }
 
-static int avrf_protect(struct flash_bank *bank, int set, int first, int last)
-{
-       LOG_INFO("%s", __func__);
-       return ERROR_OK;
-}
-
-static int avrf_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
+static int avrf_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
 {
        struct target *target = bank->target;
        struct avr_common *avr = target->arch_info;
        uint32_t cur_size, cur_buffer_size, page_size;
+       bool ext_addressing;
 
        if (bank->target->state != TARGET_HALTED) {
                LOG_ERROR("Target not halted");
@@ -259,6 +268,11 @@ static int avrf_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset,
        if (ERROR_OK != avr_jtagprg_enterprogmode(avr))
                return ERROR_FAIL;
 
+       if (bank->size > 0x20000)
+               ext_addressing = true;
+       else
+               ext_addressing = false;
+
        cur_size = 0;
        while (count > 0) {
                if (count > page_size)
@@ -266,6 +280,7 @@ static int avrf_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset,
                else
                        cur_buffer_size = count;
                avr_jtagprg_writeflashpage(avr,
+                       ext_addressing,
                        buffer + cur_size,
                        cur_buffer_size,
                        offset + cur_size,
@@ -288,8 +303,7 @@ static int avrf_probe(struct flash_bank *bank)
        struct target *target = bank->target;
        struct avrf_flash_bank *avrf_info = bank->driver_priv;
        struct avr_common *avr = target->arch_info;
-       struct avrf_type *avr_info = NULL;
-       int i;
+       const struct avrf_type *avr_info = NULL;
        uint32_t device_id;
 
        if (bank->target->state != TARGET_HALTED) {
@@ -297,7 +311,7 @@ static int avrf_probe(struct flash_bank *bank)
                return ERROR_TARGET_NOT_HALTED;
        }
 
-       avrf_info->probed = 0;
+       avrf_info->probed = false;
 
        avr_jtag_read_jtagid(avr, &device_id);
        if (ERROR_OK != mcu_execute_queue())
@@ -309,7 +323,7 @@ static int avrf_probe(struct flash_bank *bank)
                        EXTRACT_MFG(device_id),
                        0x1F);
 
-       for (i = 0; i < (int)ARRAY_SIZE(avft_chips_info); i++) {
+       for (size_t i = 0; i < ARRAY_SIZE(avft_chips_info); i++) {
                if (avft_chips_info[i].chip_id == EXTRACT_PART(device_id)) {
                        avr_info = &avft_chips_info[i];
                        LOG_INFO("target device is %s", avr_info->name);
@@ -329,20 +343,20 @@ static int avrf_probe(struct flash_bank *bank)
                bank->num_sectors = avr_info->flash_page_num;
                bank->sectors = malloc(sizeof(struct flash_sector) * avr_info->flash_page_num);
 
-               for (i = 0; i < avr_info->flash_page_num; i++) {
+               for (int i = 0; i < avr_info->flash_page_num; i++) {
                        bank->sectors[i].offset = i * avr_info->flash_page_size;
                        bank->sectors[i].size = avr_info->flash_page_size;
                        bank->sectors[i].is_erased = -1;
-                       bank->sectors[i].is_protected = 1;
+                       bank->sectors[i].is_protected = -1;
                }
 
-               avrf_info->probed = 1;
+               avrf_info->probed = true;
                return ERROR_OK;
        } else {
                /* chip not supported */
                LOG_ERROR("0x%" PRIx32 " is not support for avr", EXTRACT_PART(device_id));
 
-               avrf_info->probed = 1;
+               avrf_info->probed = true;
                return ERROR_FAIL;
        }
 }
@@ -355,18 +369,11 @@ static int avrf_auto_probe(struct flash_bank *bank)
        return avrf_probe(bank);
 }
 
-static int avrf_protect_check(struct flash_bank *bank)
-{
-       LOG_INFO("%s", __func__);
-       return ERROR_OK;
-}
-
 static int avrf_info(struct flash_bank *bank, char *buf, int buf_size)
 {
        struct target *target = bank->target;
        struct avr_common *avr = target->arch_info;
-       struct avrf_type *avr_info = NULL;
-       int i;
+       const struct avrf_type *avr_info = NULL;
        uint32_t device_id;
 
        if (bank->target->state != TARGET_HALTED) {
@@ -384,7 +391,7 @@ static int avrf_info(struct flash_bank *bank, char *buf, int buf_size)
                        EXTRACT_MFG(device_id),
                        0x1F);
 
-       for (i = 0; i < (int)ARRAY_SIZE(avft_chips_info); i++) {
+       for (size_t i = 0; i < ARRAY_SIZE(avft_chips_info); i++) {
                if (avft_chips_info[i].chip_id == EXTRACT_PART(device_id)) {
                        avr_info = &avft_chips_info[i];
                        LOG_INFO("target device is %s", avr_info->name);
@@ -425,8 +432,6 @@ static int avrf_mass_erase(struct flash_bank *bank)
 
 COMMAND_HANDLER(avrf_handle_mass_erase_command)
 {
-       int i;
-
        if (CMD_ARGC < 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
@@ -437,12 +442,12 @@ COMMAND_HANDLER(avrf_handle_mass_erase_command)
 
        if (avrf_mass_erase(bank) == ERROR_OK) {
                /* set all sectors as erased */
-               for (i = 0; i < bank->num_sectors; i++)
+               for (int i = 0; i < bank->num_sectors; i++)
                        bank->sectors[i].is_erased = 1;
 
-               command_print(CMD_CTX, "avr mass erase complete");
+               command_print(CMD, "avr mass erase complete");
        } else
-               command_print(CMD_CTX, "avr mass erase failed");
+               command_print(CMD, "avr mass erase failed");
 
        LOG_DEBUG("%s", __func__);
        return ERROR_OK;
@@ -469,17 +474,16 @@ static const struct command_registration avrf_command_handlers[] = {
        COMMAND_REGISTRATION_DONE
 };
 
-struct flash_driver avr_flash = {
+const struct flash_driver avr_flash = {
        .name = "avr",
        .commands = avrf_command_handlers,
        .flash_bank_command = avrf_flash_bank_command,
        .erase = avrf_erase,
-       .protect = avrf_protect,
        .write = avrf_write,
        .read = default_flash_read,
        .probe = avrf_probe,
        .auto_probe = avrf_auto_probe,
        .erase_check = default_flash_blank_check,
-       .protect_check = avrf_protect_check,
        .info = avrf_info,
+       .free_driver_priv = default_flash_free_driver_priv,
 };