Merge commit 'bd530c8951f8393e8d799d25f233c77051b10561' into sam-update
This commit is contained in:
commit
a7c4a0c108
@ -234,6 +234,7 @@ void adiv5_dp_unref(ADIv5_DP_t *dp)
|
|||||||
void adiv5_ap_unref(ADIv5_AP_t *ap)
|
void adiv5_ap_unref(ADIv5_AP_t *ap)
|
||||||
{
|
{
|
||||||
if (--(ap->refcnt) == 0) {
|
if (--(ap->refcnt) == 0) {
|
||||||
|
DEBUG("Unref AP\n");
|
||||||
adiv5_dp_unref(ap->dp);
|
adiv5_dp_unref(ap->dp);
|
||||||
free(ap);
|
free(ap);
|
||||||
}
|
}
|
||||||
@ -398,10 +399,12 @@ static bool adiv5_component_probe(ADIv5_AP_t *ap, uint32_t addr)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool __attribute__((weak)) adiv5_ap_setup(int i) {(void)i; return true;}
|
||||||
|
void __attribute__((weak)) adiv5_ap_cleanup(int i) {(void)i;}
|
||||||
|
|
||||||
ADIv5_AP_t *adiv5_new_ap(ADIv5_DP_t *dp, uint8_t apsel)
|
ADIv5_AP_t *adiv5_new_ap(ADIv5_DP_t *dp, uint8_t apsel)
|
||||||
{
|
{
|
||||||
ADIv5_AP_t *ap, tmpap;
|
ADIv5_AP_t *ap, tmpap;
|
||||||
|
|
||||||
/* Assume valid and try to read IDR */
|
/* Assume valid and try to read IDR */
|
||||||
memset(&tmpap, 0, sizeof(tmpap));
|
memset(&tmpap, 0, sizeof(tmpap));
|
||||||
tmpap.dp = dp;
|
tmpap.dp = dp;
|
||||||
@ -411,7 +414,6 @@ ADIv5_AP_t *adiv5_new_ap(ADIv5_DP_t *dp, uint8_t apsel)
|
|||||||
|
|
||||||
if(!tmpap.idr) /* IDR Invalid */
|
if(!tmpap.idr) /* IDR Invalid */
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* It's valid to so create a heap copy */
|
/* It's valid to so create a heap copy */
|
||||||
ap = malloc(sizeof(*ap));
|
ap = malloc(sizeof(*ap));
|
||||||
if (!ap) { /* malloc failed: heap exhaustion */
|
if (!ap) { /* malloc failed: heap exhaustion */
|
||||||
@ -434,16 +436,13 @@ ADIv5_AP_t *adiv5_new_ap(ADIv5_DP_t *dp, uint8_t apsel)
|
|||||||
|
|
||||||
DEBUG(" AP %3d: IDR=%08"PRIx32" CFG=%08"PRIx32" BASE=%08"PRIx32" CSW=%08"PRIx32"\n",
|
DEBUG(" AP %3d: IDR=%08"PRIx32" CFG=%08"PRIx32" BASE=%08"PRIx32" CSW=%08"PRIx32"\n",
|
||||||
apsel, ap->idr, ap->cfg, ap->base, ap->csw);
|
apsel, ap->idr, ap->cfg, ap->base, ap->csw);
|
||||||
|
|
||||||
return ap;
|
return ap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void adiv5_dp_init(ADIv5_DP_t *dp)
|
void adiv5_dp_init(ADIv5_DP_t *dp)
|
||||||
{
|
{
|
||||||
volatile bool probed = false;
|
volatile bool probed = false;
|
||||||
volatile uint32_t ctrlstat = 0;
|
volatile uint32_t ctrlstat = 0;
|
||||||
|
|
||||||
adiv5_dp_ref(dp);
|
adiv5_dp_ref(dp);
|
||||||
|
|
||||||
volatile struct exception e;
|
volatile struct exception e;
|
||||||
@ -496,10 +495,13 @@ void adiv5_dp_init(ADIv5_DP_t *dp)
|
|||||||
}
|
}
|
||||||
/* Probe for APs on this DP */
|
/* Probe for APs on this DP */
|
||||||
for(int i = 0; i < 256; i++) {
|
for(int i = 0; i < 256; i++) {
|
||||||
ADIv5_AP_t *ap = adiv5_new_ap(dp, i);
|
ADIv5_AP_t *ap = NULL;
|
||||||
if (ap == NULL)
|
if (adiv5_ap_setup(i))
|
||||||
|
ap = adiv5_new_ap(dp, i);
|
||||||
|
if (ap == NULL) {
|
||||||
|
adiv5_ap_cleanup(i);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
extern void kinetis_mdm_probe(ADIv5_AP_t *);
|
extern void kinetis_mdm_probe(ADIv5_AP_t *);
|
||||||
kinetis_mdm_probe(ap);
|
kinetis_mdm_probe(ap);
|
||||||
|
|
||||||
@ -573,7 +575,7 @@ static void * extract(void *dest, uint32_t src, uint32_t val, enum align align)
|
|||||||
return (uint8_t *)dest + (1 << align);
|
return (uint8_t *)dest + (1 << align);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void __attribute__((weak))
|
||||||
adiv5_mem_read(ADIv5_AP_t *ap, void *dest, uint32_t src, size_t len)
|
adiv5_mem_read(ADIv5_AP_t *ap, void *dest, uint32_t src, size_t len)
|
||||||
{
|
{
|
||||||
uint32_t tmp;
|
uint32_t tmp;
|
||||||
@ -604,7 +606,7 @@ adiv5_mem_read(ADIv5_AP_t *ap, void *dest, uint32_t src, size_t len)
|
|||||||
extract(dest, src, tmp, align);
|
extract(dest, src, tmp, align);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void __attribute__((weak))
|
||||||
adiv5_mem_write_sized(ADIv5_AP_t *ap, uint32_t dest, const void *src,
|
adiv5_mem_write_sized(ADIv5_AP_t *ap, uint32_t dest, const void *src,
|
||||||
size_t len, enum align align)
|
size_t len, enum align align)
|
||||||
{
|
{
|
||||||
@ -640,21 +642,16 @@ adiv5_mem_write_sized(ADIv5_AP_t *ap, uint32_t dest, const void *src,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void __attribute__((weak))
|
||||||
adiv5_mem_write(ADIv5_AP_t *ap, uint32_t dest, const void *src, size_t len)
|
adiv5_ap_write(ADIv5_AP_t *ap, uint16_t addr, uint32_t value)
|
||||||
{
|
|
||||||
enum align align = MIN(ALIGNOF(dest), ALIGNOF(len));
|
|
||||||
adiv5_mem_write_sized(ap, dest, src, len, align);
|
|
||||||
}
|
|
||||||
|
|
||||||
void adiv5_ap_write(ADIv5_AP_t *ap, uint16_t addr, uint32_t value)
|
|
||||||
{
|
{
|
||||||
adiv5_dp_write(ap->dp, ADIV5_DP_SELECT,
|
adiv5_dp_write(ap->dp, ADIV5_DP_SELECT,
|
||||||
((uint32_t)ap->apsel << 24)|(addr & 0xF0));
|
((uint32_t)ap->apsel << 24)|(addr & 0xF0));
|
||||||
adiv5_dp_write(ap->dp, addr, value);
|
adiv5_dp_write(ap->dp, addr, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t adiv5_ap_read(ADIv5_AP_t *ap, uint16_t addr)
|
uint32_t __attribute__((weak))
|
||||||
|
adiv5_ap_read(ADIv5_AP_t *ap, uint16_t addr)
|
||||||
{
|
{
|
||||||
uint32_t ret;
|
uint32_t ret;
|
||||||
adiv5_dp_write(ap->dp, ADIV5_DP_SELECT,
|
adiv5_dp_write(ap->dp, ADIV5_DP_SELECT,
|
||||||
@ -662,3 +659,9 @@ uint32_t adiv5_ap_read(ADIv5_AP_t *ap, uint16_t addr)
|
|||||||
ret = adiv5_dp_read(ap->dp, addr);
|
ret = adiv5_dp_read(ap->dp, addr);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void adiv5_mem_write(ADIv5_AP_t *ap, uint32_t dest, const void *src, size_t len)
|
||||||
|
{
|
||||||
|
enum align align = MIN(ALIGNOF(dest), ALIGNOF(len));
|
||||||
|
adiv5_mem_write_sized(ap, dest, src, len, align);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user