Repostiory containing DAPLink source code with Reset Pin workaround for HANI_IOT board.
Upstream: https://github.com/ARMmbed/DAPLink
Diff: source/hic_hal/nxp/lpc11u35/flash.c
- Revision:
- 0:01f31e923fe2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/hic_hal/nxp/lpc11u35/flash.c Tue Apr 07 12:55:42 2020 +0200 @@ -0,0 +1,120 @@ +/** + * @file flash.c + * @brief + * + * DAPLink Interface Firmware + * Copyright (c) 2017-2017, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <string.h> +#include "flash_hal.h" +#include "iap.h" +#include "util.h" +#include "LPC11Uxx.h" + +// page buffer must be 4 byte algined and must reside in ram bank 1 +static __attribute__((section("RAM1"))) uint32_t page_buf[64]; + +static uint32_t get_sector_num(uint32_t addr); + +uint32_t Init(uint32_t adr, uint32_t clk, uint32_t fnc) +{ + return 0; // No init needed +} + +uint32_t UnInit(uint32_t fnc) +{ + return 0; // No init needed +} + +uint32_t EraseChip(void) +{ + return (1); // IAP not supported +} + +uint32_t EraseSector(uint32_t adr) +{ + uint32_t num = get_sector_num(adr); + + iap_lock(); + + iap_op.cmd = 50; // Prepare Sector for Erase + iap_op.par[0] = num; // Start Sector + iap_op.par[1] = num; // End Sector + iap_call(&iap_op); + if (iap_op.stat != CMD_SUCCESS) { + iap_unlock(); + return (1); + } + + iap_op.cmd = 52; // Erase Sector + iap_op.par[0] = num; // Start Sector + iap_op.par[1] = num; // End Sector + iap_op.par[2] = SystemCoreClock / 1000; // Core Clock in kHz + iap_call(&iap_op); + if (iap_op.stat != CMD_SUCCESS) { + iap_unlock(); + return (1); + } + + iap_unlock(); + + return 0; // Success +} + +uint32_t ProgramPage(uint32_t adr, uint32_t sz, uint32_t *buf) +{ + uint32_t num = get_sector_num(adr); + + iap_lock(); + + iap_op.cmd = 50; // Prepare Sector for Program + iap_op.par[0] = num; // Start Sector + iap_op.par[1] = num; // End Sector + iap_call(&iap_op); + if (iap_op.stat != CMD_SUCCESS) { + iap_unlock(); + return (1); + } + + while (sz > 0) { + uint32_t copy_size = MIN(sz, sizeof(page_buf)); + memset(page_buf, 0xFF, sizeof(page_buf)); + memcpy(page_buf, buf, copy_size); + iap_op.cmd = 51; // Erase Sector + iap_op.par[0] = adr; // Destination + iap_op.par[1] = (uint32_t)page_buf; // Source + iap_op.par[2] = 256; // Write size + iap_op.par[3] = SystemCoreClock / 1000; // Core Clock in kHz + iap_call(&iap_op); + if (iap_op.stat != CMD_SUCCESS) { + iap_unlock(); + return (1); + } + sz -= copy_size; + adr += copy_size; + buf += copy_size / 4; + } + + iap_unlock(); + + return 0; // Success +} + +static uint32_t get_sector_num(uint32_t addr) +{ + return addr / 0x1000; +}