Merge commit '7c120ecb582afb588cb391ab32614c4409a2671d' into sam-update
This commit is contained in:
commit
576f575871
@ -54,6 +54,7 @@ SRC = \
|
|||||||
samd.c \
|
samd.c \
|
||||||
samx5x.c \
|
samx5x.c \
|
||||||
stm32f1.c \
|
stm32f1.c \
|
||||||
|
ch32f1.c \
|
||||||
stm32f4.c \
|
stm32f4.c \
|
||||||
stm32h7.c \
|
stm32h7.c \
|
||||||
stm32l0.c \
|
stm32l0.c \
|
||||||
|
@ -200,20 +200,20 @@ int ch32f1_flash_erase (struct target_flash *f, target_addr addr, size_t len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\fn waitFlashReady
|
\fn ch32f1_wait_flash_ready
|
||||||
\brief poll the beginning of a block till it is fffff, meaning we can proceeed
|
\brief Wait a bit for the previous operation to finish
|
||||||
|
As per test result we need a time similar to 10 read operation over SWD
|
||||||
|
We do 32 to have a bit of headroom, then we check we read ffff (erased flash)
|
||||||
|
NB: Just reading fff is not enough as it could be a transient previous operation value
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static bool waitFlashReady(target *t,uint32_t adr)
|
static bool ch32f1_wait_flash_ready(target *t,uint32_t adr)
|
||||||
{
|
{
|
||||||
// Wait a bit
|
|
||||||
// the # of cycles needed to do N read access over SWD
|
|
||||||
// the actual number is around 10
|
|
||||||
// then check we do read ffff (/!\ even if we read ffff it does not mean its ok
|
|
||||||
// these are the data from the previous operation and they could be ffff)
|
|
||||||
uint32_t ff;
|
uint32_t ff;
|
||||||
for(int i=0;i<32;i++) ff=target_mem_read32(t,adr);
|
for(int i=0;i<32;i++) {
|
||||||
|
ff=target_mem_read32(t,adr);
|
||||||
|
}
|
||||||
if(ff!=0xffffffffUL) {
|
if(ff!=0xffffffffUL) {
|
||||||
ERROR_CH("ch32f1 Not erased properly at %x or flash access issue\n",adr);
|
ERROR_CH("ch32f1 Not erased properly at %x or flash access issue\n",adr);
|
||||||
return false;
|
return false;
|
||||||
@ -225,7 +225,7 @@ static bool waitFlashReady(target *t,uint32_t adr)
|
|||||||
\brief fast flash for ch32. Load 128 bytes chunk and then flash them
|
\brief fast flash for ch32. Load 128 bytes chunk and then flash them
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int upload(target *t, uint32_t dest, const void *src, uint32_t offset)
|
static int ch32f1_upload(target *t, uint32_t dest, const void *src, uint32_t offset)
|
||||||
{
|
{
|
||||||
const uint32_t *ss=(const uint32_t *)(src+offset);
|
const uint32_t *ss=(const uint32_t *)(src+offset);
|
||||||
uint32_t dd=dest+offset;
|
uint32_t dd=dest+offset;
|
||||||
@ -243,10 +243,10 @@ static int upload(target *t, uint32_t dest, const void *src, uint32_t offset)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
\fn ch32_buffer_clear
|
\fn ch32f1_buffer_clear
|
||||||
\brief clear the write buffer
|
\brief clear the write buffer
|
||||||
*/
|
*/
|
||||||
int ch32_buffer_clear(target *t)
|
int ch32f1_buffer_clear(target *t)
|
||||||
{
|
{
|
||||||
SET_CR(FLASH_CR_FTPG_CH32); // Fast page program 4-
|
SET_CR(FLASH_CR_FTPG_CH32); // Fast page program 4-
|
||||||
SET_CR(FLASH_CR_BUF_RESET_CH32); // BUF_RESET 5-
|
SET_CR(FLASH_CR_BUF_RESET_CH32); // BUF_RESET 5-
|
||||||
@ -254,7 +254,7 @@ int ch32_buffer_clear(target *t)
|
|||||||
CLEAR_CR(FLASH_CR_FTPG_CH32); // Fast page program 4-
|
CLEAR_CR(FLASH_CR_FTPG_CH32); // Fast page program 4-
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#define CH32_VERIFY
|
//#define CH32_VERIFY
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -279,13 +279,13 @@ static int ch32f1_flash_write(struct target_flash *f,
|
|||||||
WAIT_BUSY();
|
WAIT_BUSY();
|
||||||
|
|
||||||
// Buffer reset...
|
// Buffer reset...
|
||||||
ch32_buffer_clear(t);
|
ch32f1_buffer_clear(t);
|
||||||
// Load 128 bytes to buffer
|
// Load 128 bytes to buffer
|
||||||
if(!waitFlashReady(t,dest)) {
|
if(!ch32f1_wait_flash_ready(t,dest)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
for(int i=0;i<8;i++) {
|
for(int i=0;i<8;i++) {
|
||||||
if(upload(t,dest,src, 16*i)) {
|
if(ch32f1_upload(t,dest,src, 16*i)) {
|
||||||
ERROR_CH("Cannot upload to buffer\n");
|
ERROR_CH("Cannot upload to buffer\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -318,8 +318,8 @@ static int ch32f1_flash_write(struct target_flash *f,
|
|||||||
}
|
}
|
||||||
#ifdef CH32_VERIFY
|
#ifdef CH32_VERIFY
|
||||||
DEBUG_CH("Verifying\n");
|
DEBUG_CH("Verifying\n");
|
||||||
int i=0;
|
size_t i=0;
|
||||||
for(i=0;i<(int)len;i+=4)
|
for(i=0;i<len;i+=4)
|
||||||
{
|
{
|
||||||
uint32_t mem=target_mem_read32(t, orgDest+i);
|
uint32_t mem=target_mem_read32(t, orgDest+i);
|
||||||
uint32_t mem2=*(uint32_t *)(orgSrc+i);
|
uint32_t mem2=*(uint32_t *)(orgSrc+i);
|
@ -55,9 +55,6 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PROBE(x) \
|
|
||||||
do { if ((x)(t)) {return true;} else target_check_error(t); } while (0)
|
|
||||||
|
|
||||||
static const char cortexm_driver_str[] = "ARM Cortex-M";
|
static const char cortexm_driver_str[] = "ARM Cortex-M";
|
||||||
|
|
||||||
static bool cortexm_vector_catch(target *t, int argc, char *argv[]);
|
static bool cortexm_vector_catch(target *t, int argc, char *argv[]);
|
||||||
@ -212,17 +209,6 @@ static const char tdesc_cortex_mf[] =
|
|||||||
" </feature>"
|
" </feature>"
|
||||||
"</target>";
|
"</target>";
|
||||||
|
|
||||||
/*
|
|
||||||
Probe STM32F103 clones
|
|
||||||
*/
|
|
||||||
static bool stm32f1_clones_probe(target *t)
|
|
||||||
{
|
|
||||||
PROBE(ch32f1_probe);
|
|
||||||
PROBE(stm32f1_probe); /* Care for other STM32F1 clones (?) */
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ADIv5_AP_t *cortexm_ap(target *t)
|
ADIv5_AP_t *cortexm_ap(target *t)
|
||||||
{
|
{
|
||||||
return ((struct cortexm_priv *)t->priv)->ap;
|
return ((struct cortexm_priv *)t->priv)->ap;
|
||||||
@ -392,6 +378,8 @@ bool cortexm_probe(ADIv5_AP_t *ap)
|
|||||||
} else {
|
} else {
|
||||||
target_check_error(t);
|
target_check_error(t);
|
||||||
}
|
}
|
||||||
|
#define PROBE(x) \
|
||||||
|
do { if ((x)(t)) {return true;} else target_check_error(t); } while (0)
|
||||||
|
|
||||||
switch (ap->ap_designer) {
|
switch (ap->ap_designer) {
|
||||||
case AP_DESIGNER_FREESCALE:
|
case AP_DESIGNER_FREESCALE:
|
||||||
@ -454,7 +442,8 @@ bool cortexm_probe(ADIv5_AP_t *ap)
|
|||||||
PROBE(rp_probe);
|
PROBE(rp_probe);
|
||||||
PROBE(lpc11xx_probe); /* LPC8 */
|
PROBE(lpc11xx_probe); /* LPC8 */
|
||||||
} else if (ap->ap_partno == 0x4c3) { /* Cortex-M3 ROM */
|
} else if (ap->ap_partno == 0x4c3) { /* Cortex-M3 ROM */
|
||||||
PROBE(stm32f1_clones_probe); /* Care for STM32F1 clones */
|
PROBE(ch32f1_probe);
|
||||||
|
PROBE(stm32f1_probe); /* Care for other STM32F1 clones (?) */
|
||||||
PROBE(lpc15xx_probe); /* Thanks to JojoS for testing */
|
PROBE(lpc15xx_probe); /* Thanks to JojoS for testing */
|
||||||
} else if (ap->ap_partno == 0x471) { /* Cortex-M0 ROM */
|
} else if (ap->ap_partno == 0x471) { /* Cortex-M0 ROM */
|
||||||
PROBE(lpc11xx_probe); /* LPC24C11 */
|
PROBE(lpc11xx_probe); /* LPC24C11 */
|
||||||
|
@ -97,9 +97,7 @@ static int stm32f1_flash_write(struct target_flash *f,
|
|||||||
|
|
||||||
#define FLASHSIZE 0x1FFFF7E0
|
#define FLASHSIZE 0x1FFFF7E0
|
||||||
#define FLASHSIZE_F0 0x1FFFF7CC
|
#define FLASHSIZE_F0 0x1FFFF7CC
|
||||||
//
|
|
||||||
#include "stm32f1_ch32.c"
|
|
||||||
//
|
|
||||||
static void stm32f1_add_flash(target *t,
|
static void stm32f1_add_flash(target *t,
|
||||||
uint32_t addr, size_t length, size_t erasesize)
|
uint32_t addr, size_t length, size_t erasesize)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user