80 lines
2.1 KiB
C
80 lines
2.1 KiB
C
|
/*
|
||
|
* Copyright (c) 2020 Seagate Technology LLC
|
||
|
*
|
||
|
* SPDX-License-Identifier: Apache-2.0
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @file Describe the IAP commands interface on NXP LPC11U6x MCUs.
|
||
|
*
|
||
|
* The IAP (In-Application Programming) commands are located in the boot ROM
|
||
|
* code. Mostly they provide access to the on-chip flash and EEPROM devices.
|
||
|
*
|
||
|
* @note For details about IAP see the UM10732 LPC11U6x/E6x user manual,
|
||
|
* chapter 27: LPC11U6x/E6x Flash/EEPROM ISP/IAP programming.
|
||
|
*/
|
||
|
|
||
|
#ifndef LPC11U6X_IAP_H_
|
||
|
#define LPC11U6X_IAP_H_
|
||
|
|
||
|
/* Pointer to IAP function. */
|
||
|
#define IAP_ENTRY_ADDR 0X1FFF1FF1
|
||
|
|
||
|
/* IAP commands. */
|
||
|
#define IAP_CMD_FLASH_PREP_SEC 50
|
||
|
#define IAP_CMD_FLASH_WRITE_SEC 51
|
||
|
#define IAP_CMD_FLASH_ERASE_SEC 52
|
||
|
#define IAP_CMD_FLASH_BLANK_CHECK_SEC 53
|
||
|
#define IAP_CMD_READ_PART_ID 54
|
||
|
#define IAP_CMD_READ_BOOT_CODE_VER 55
|
||
|
#define IAP_CMD_MEM_COMPARE 56
|
||
|
#define IAP_CMD_REINVOKE_ISP 57
|
||
|
#define IAP_CMD_READ_UID 58
|
||
|
#define IAP_CMD_FLASH_ERASE_PAGE 59
|
||
|
#define IAP_CMD_EEPROM_WRITE 61
|
||
|
#define IAP_CMD_EEPROM_READ 62
|
||
|
|
||
|
/* IAP status codes. */
|
||
|
#define IAP_STATUS_CMD_SUCCESS 0
|
||
|
#define IAP_STATUS_INVALID_CMD 1
|
||
|
#define IAP_STATUS_SRC_ADDR_ERROR 2
|
||
|
#define IAP_STATUS_DST_ADDR_ERROR 3
|
||
|
#define IAP_STATUS_SRC_ADDR_NOT_MAPPED 4
|
||
|
#define IAP_STATUS_DST_ADDR_NOT_MAPPED 5
|
||
|
#define IAP_STATUS_COUNT_ERROR 6
|
||
|
#define IAP_STATUS_INVALID_SECTOR 7
|
||
|
#define IAP_STATUS_SECTOR_NOT_BLANK 8
|
||
|
#define IAP_STATUS_SECTOR_NOT_PREPARED 9
|
||
|
#define IAP_STATUS_COMPARE_ERROR 10
|
||
|
#define IAP_STATUS_BUSY 11
|
||
|
|
||
|
/**
|
||
|
* @brief Entry function for IAP commands.
|
||
|
*/
|
||
|
static inline int iap_cmd(unsigned int cmd[5])
|
||
|
{
|
||
|
int key;
|
||
|
int status[5];
|
||
|
|
||
|
/*
|
||
|
* Interrupts must be disabled when calling IAP. Indeed when executing
|
||
|
* "some" commands, the flash (where the interrupt vectors are located)
|
||
|
* is no longer accessible.
|
||
|
*/
|
||
|
key = irq_lock();
|
||
|
|
||
|
/*
|
||
|
* TODO: for the flash commands, the top 32 bytes of memory must be
|
||
|
* saved before calling the IAP function, and restored after. According
|
||
|
* to the UM10732 user manual, the IAP code may use them.
|
||
|
*/
|
||
|
((void (*)(unsigned int[], unsigned int[]))
|
||
|
IAP_ENTRY_ADDR)(cmd, status);
|
||
|
|
||
|
irq_unlock(key);
|
||
|
|
||
|
return status[0];
|
||
|
}
|
||
|
|
||
|
#endif /* LPC11U6X_IAP_H_ */
|