25 #define AM13_FLASH_BASE_MAIN 0x00000000
26 #define AM13_FLASH_BASE_NONMAIN 0x60100000
27 #define AM13_NONMAIN_SIZE_PER_BANK 0x1000
42 #define AM13_FACTORYREGION 0x60111000
43 #define AM13_TRACEID (AM13_FACTORYREGION + 0x000)
44 #define AM13_DID (AM13_FACTORYREGION + 0x004)
45 #define AM13_SRAMFLASH (AM13_FACTORYREGION + 0x01C)
48 #define FLASH_CONTROL_BASE 0x40042000
49 #define FCTL_REG_CMDEXEC (FLASH_CONTROL_BASE + 0x1100)
50 #define FCTL_REG_CMDTYPE (FLASH_CONTROL_BASE + 0x1104)
51 #define FCTL_REG_CMDADDR (FLASH_CONTROL_BASE + 0x1120)
52 #define FCTL_REG_CMDBYTEN (FLASH_CONTROL_BASE + 0x1124)
53 #define FCTL_REG_CMDDATAINDEX (FLASH_CONTROL_BASE + 0x112C)
54 #define FCTL_REG_CMDDATA0 (FLASH_CONTROL_BASE + 0x1130)
55 #define FCTL_REG_CMDWEPROTA (FLASH_CONTROL_BASE + 0x11D0)
56 #define FCTL_REG_CMDWEPROTB (FLASH_CONTROL_BASE + 0x11D4)
57 #define FCTL_REG_CMDWEPROTNM (FLASH_CONTROL_BASE + 0x1210)
58 #define FCTL_REG_STATCMD (FLASH_CONTROL_BASE + 0x13D0)
61 #define GSC_BASE 0x40046000
62 #define GSC_REG_FPC_FLSEMREQ (GSC_BASE + 0x1800)
63 #define GSC_REG_FPC_FLSEMCLR (GSC_BASE + 0x1804)
66 #define FCTL_STATCMD_CMDDONE 0x00000001
67 #define FCTL_STATCMD_CMDPASS 0x00000002
68 #define FCTL_STATCMD_CMDINPROGRESS 0x00000004
71 #define FCTL_CMDEXEC_EXECUTE 0x00000001
72 #define FCTL_CMDTYPE_PROGRAM 0x00000001
73 #define FCTL_CMDTYPE_ERASE 0x00000002
74 #define FCTL_CMDTYPE_CLEARSTATUS 0x00000005
75 #define FCTL_CMDTYPE_SIZE_ONEWORD 0x00000000
76 #define FCTL_CMDTYPE_SIZE_SECTOR 0x00000040
78 #define AM13_FLASH_WORD_SIZE 16
80 #define AM13_FLASH_TIMEOUT_MS 8000
81 #define AM13_SECTOR_SIZE_BYTES 0x800
82 #define TI_MANUFACTURER_ID 0x17
85 #define AM13_ALGO_BASE 0x20000000
88 #define AM13_ALGO_PARAMS_0 0x20002000
89 #define AM13_ALGO_PARAMS_1 0x20002014
92 #define AM13_ALGO_BUFFER_0 0x20002100
93 #define AM13_ALGO_BUFFER_1 0x20002900
96 #define AM13_ALGO_WORKING_SIZE (AM13_ALGO_BUFFER_1 + 0x800 - AM13_ALGO_BASE)
99 #define AM13_BUFFER_EMPTY 0x00000000
100 #define AM13_BUFFER_FULL 0xFFFFFFFF
103 #define AM13_STATUS_OFFSET 0x0C
106 #define AM13_CMD_NO_ACTION 0
107 #define AM13_CMD_PROGRAM 1
108 #define AM13_CMD_ERASE_AND_PROGRAM 2
109 #define AM13_CMD_ERASE_SECTORS 3
122 #include "../../../contrib/loaders/flash/am13e230x/am13e230x_algo.inc"
151 LOG_ERROR(
"AM13: failed to acquire GSC flash semaphore");
159 LOG_ERROR(
"AM13: failed to release GSC flash semaphore");
165 static const struct {
169 { 2,
"CMDINPROGRESS" },
172 { 6,
"FAILILLADDR" },
183 return "FAILUNKNOWN";
191 bool timed_out =
false;
236 LOG_ERROR(
"Timeout waiting for clear status");
250 switch (
bank->base) {
296 switch (
bank->base) {
309 bank->driver_priv = am13_info;
332 for (
unsigned int s = first; s <= last; s++) {
333 if (
bank->sectors[s].is_protected) {
335 ") is factory-protected, skipping",
344 LOG_ERROR(
"AM13: Sector erase failed at 0x%08" PRIx32
", returned %d",
addr, retval);
423 return (retval !=
ERROR_OK) ? retval : sem_ret;
441 LOG_ERROR(
"AM13: insufficient SRAM for flash loader (%u bytes)",
455 ", need 0x%08x; set '_WORKAREABASE 0x%08x' in target config",
465 LOG_ERROR(
"AM13: failed to load flash algorithm");
486 LOG_DEBUG(
"AM13: starting flash algorithm");
492 LOG_ERROR(
"AM13: failed to start flash algorithm");
493 goto err_free_working_area;
498 err_free_working_area:
520 return (retval !=
ERROR_OK) ? retval : sem_ret;
529 bool timed_out =
false;
538 if (elapsed_ms > 500)
552 LOG_ERROR(
"AM13: flash algorithm error, status=0x%08" PRIx32,
574 LOG_INFO(
"AM13: algorithm unavailable, falling back to direct writes");
578 static const uint32_t params_addr[] = {
581 static const uint32_t buffer_addr[] = {
606 (uint8_t *)&algo_params[index]);
630 return (retval !=
ERROR_OK) ? retval : quit_ret;
639 uint32_t
did, sramflash;
647 LOG_ERROR(
"AM13: unexpected manufacturer ID in DID=0x%08" PRIx32,
669 unsigned int num_sectors;
670 switch (
bank->base) {
684 if (num_sectors == 0) {
685 bank->num_sectors = 0;
690 bank->num_sectors = num_sectors;
700 unsigned int sectors_per_nm_bank =
705 for (
unsigned int i = 0; i < num_sectors; i++) {
708 bank->sectors[i].is_erased = -1;
709 bank->sectors[i].is_protected =
710 (sectors_per_nm_bank && (i % sectors_per_nm_bank) == 0) ? 1 : 0;
713 LOG_INFO(
"AM13: %s flash: %u KB (%u sectors), %u bank(s), SRAM: %u KB",
715 (
unsigned int)(
bank->size / 1024), num_sectors,
738 " TRACEID=0x%08" PRIx32
747 .flash_bank_command = am13_flash_bank_command,
755 .protect_check =
NULL,
static const struct @4 am13_fctl_errors[]
static const uint8_t am13_algo[]
static int am13_algo_quit(struct flash_bank *bank)
#define FCTL_CMDTYPE_SIZE_SECTOR
static int am13_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
static int am13_probe(struct flash_bank *bank)
#define AM13_ALGO_BUFFER_0
static int am13_write_direct(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
#define FCTL_CMDTYPE_PROGRAM
static int am13_algo_init(struct flash_bank *bank)
#define FCTL_CMDEXEC_EXECUTE
static int am13_fctl_unprotect(struct flash_bank *bank)
#define AM13_FLASH_BASE_NONMAIN
static int am13_clear_gsc_semaphore(struct flash_bank *bank)
#define AM13_ALGO_BUFFER_1
#define FCTL_REG_CMDBYTEN
#define AM13_NONMAIN_SIZE_PER_BANK
#define AM13_ALGO_WORKING_SIZE
#define FCTL_STATCMD_CMDPASS
#define AM13_FLASH_BASE_MAIN
#define AM13_FLASH_TIMEOUT_MS
static int am13_fctl_clear_status(struct flash_bank *bank)
#define AM13_FLASH_WORD_SIZE
static int am13_fctl_erase(struct flash_bank *bank, uint32_t addr, uint32_t cmd_size)
#define FCTL_REG_CMDDATAINDEX
#define AM13_ALGO_PARAMS_0
#define AM13_ALGO_PARAMS_1
#define FCTL_REG_CMDWEPROTB
#define FCTL_CMDTYPE_ERASE
#define AM13_SECTOR_SIZE_BYTES
#define FCTL_CMDTYPE_CLEARSTATUS
static int am13_algo_wait_done(struct flash_bank *bank, uint32_t params_addr)
#define AM13_STATUS_OFFSET
static int am13_fctl_wait_done(struct flash_bank *bank)
#define TI_MANUFACTURER_ID
#define GSC_REG_FPC_FLSEMCLR
#define FCTL_STATCMD_CMDDONE
FLASH_BANK_COMMAND_HANDLER(am13_flash_bank_command)
#define FCTL_STATCMD_CMDINPROGRESS
#define AM13_BUFFER_EMPTY
static const char * am13_fctl_strerror(uint32_t status)
#define FCTL_REG_CMDWEPROTA
#define GSC_REG_FPC_FLSEMREQ
static int am13_auto_probe(struct flash_bank *bank)
static int get_am13_info(struct flash_bank *bank, struct command_invocation *cmd)
#define FCTL_CMDTYPE_SIZE_ONEWORD
static int am13_erase(struct flash_bank *bank, unsigned int first, unsigned int last)
static int am13_request_gsc_semaphore(struct flash_bank *bank)
const struct flash_driver am13_flash
#define FCTL_REG_CMDWEPROTNM
#define FCTL_REG_CMDDATA0
#define ARMV7M_COMMON_MAGIC
Support functions to access arbitrary bits in a byte array.
static void buf_set_u32(uint8_t *_buffer, unsigned int first, unsigned int num, uint32_t value)
Sets num bits in _buffer, starting at the first bit, using the bits in value.
void command_print_sameline(struct command_invocation *cmd, const char *format,...)
uint64_t buffer
Pointer to data buffer to send over SPI.
uint32_t size
Size of dw_spi_transaction::buffer.
uint32_t address
Starting address. Sector aligned.
#define ERROR_FLASH_BANK_INVALID
int default_flash_blank_check(struct flash_bank *bank)
Provides default erased-bank check handling.
int default_flash_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
Provides default read implementation for flash memory.
void default_flash_free_driver_priv(struct flash_bank *bank)
Deallocates bank->driver_priv.
#define LOG_WARNING(expr ...)
#define LOG_ERROR(expr ...)
#define LOG_INFO(expr ...)
#define LOG_DEBUG(expr ...)
target_addr_t addr
Start address to search for the control block.
unsigned int main_flash_num_banks
unsigned int sram_size_kb
unsigned int main_flash_size_kb
struct armv7m_algorithm armv7m_info
struct working_area * working_area
unsigned int common_magic
When run_command is called, a new instance will be created on the stack, filled with the proper value...
Provides details of a flash bank, available either on-chip or through a major interface.
Provides the implementation-independent structure that defines all of the callbacks required by OpenO...
const char * name
Gives a human-readable name of this flash driver, This field is used to select and initialize the dri...
Describes the geometry and status of a single flash sector within a flash bank.
int target_halt(struct target *target)
int target_write_buffer(struct target *target, target_addr_t address, uint32_t size, const uint8_t *buffer)
int target_alloc_working_area(struct target *target, uint32_t size, struct working_area **area)
int target_write_u32(struct target *target, target_addr_t address, uint32_t value)
int target_free_working_area(struct target *target, struct working_area *area)
Free a working area.
int target_read_u32(struct target *target, target_addr_t address, uint32_t *value)
int target_wait_algorithm(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_params, target_addr_t exit_point, unsigned int timeout_ms, void *arch_info)
Waits for an algorithm started with target_start_algorithm() to complete.
int target_start_algorithm(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_params, target_addr_t entry_point, target_addr_t exit_point, void *arch_info)
Executes a target-specific native code algorithm and leaves it running.
#define ERROR_TARGET_NOT_HALTED
#define ERROR_TARGET_RESOURCE_NOT_AVAILABLE
#define ARRAY_SIZE(x)
Compute the number of elements of a variable length array.