target: move mmio routines out of public interface.

Fix crc routine to use buffered reads on stm32.
This commit is contained in:
Gareth McMullin 2016-06-30 10:28:16 +12:00
parent e28e158721
commit 72790893ae
5 changed files with 30 additions and 27 deletions

View File

@ -504,6 +504,9 @@ adiv5_mem_read(ADIv5_AP_t *ap, void *dest, uint32_t src, size_t len)
uint32_t osrc = src; uint32_t osrc = src;
enum align align = MIN(ALIGNOF(src), ALIGNOF(len)); enum align align = MIN(ALIGNOF(src), ALIGNOF(len));
if (len == 0)
return;
len >>= align; len >>= align;
ap_mem_access_setup(ap, src, align); ap_mem_access_setup(ap, src, align);
adiv5_dp_low_access(ap->dp, ADIV5_LOW_READ, ADIV5_AP_DRW, 0); adiv5_dp_low_access(ap->dp, ADIV5_LOW_READ, ADIV5_AP_DRW, 0);

View File

@ -89,23 +89,21 @@ static const uint32_t crc32_table[] = {
0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4, 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4,
}; };
uint32_t crc32_calc(uint32_t crc, uint8_t data) static uint32_t crc32_calc(uint32_t crc, uint8_t data)
{ {
return (crc << 8) ^ crc32_table[((crc >> 24) ^ data) & 255]; return (crc << 8) ^ crc32_table[((crc >> 24) ^ data) & 255];
} }
uint32_t generic_crc32(target *t, uint32_t base, int len) uint32_t generic_crc32(target *t, uint32_t base, size_t len)
{ {
uint32_t crc = -1; uint32_t crc = -1;
static uint8_t bytes[128]; uint8_t bytes[128];
while (len) { while (len) {
uint32_t i; size_t read_len = MIN(sizeof(bytes), len);
uint32_t read_len = len >= 128 ? 128 : len;
target_mem_read(t, bytes, base, read_len); target_mem_read(t, bytes, base, read_len);
for (i=0; i<read_len; i++) for (unsigned i = 0; i < read_len; i++)
crc = crc32_calc(crc, bytes[i]); crc = crc32_calc(crc, bytes[i]);
base += read_len; base += read_len;
@ -115,29 +113,31 @@ uint32_t generic_crc32(target *t, uint32_t base, int len)
} }
#else #else
#include <libopencm3/stm32/crc.h> #include <libopencm3/stm32/crc.h>
uint32_t generic_crc32(target *t, uint32_t base, int len) uint32_t generic_crc32(target *t, uint32_t base, size_t len)
{ {
uint32_t data; uint8_t bytes[128];
uint32_t crc; uint32_t crc;
size_t i;
CRC_CR |= CRC_CR_RESET; CRC_CR |= CRC_CR_RESET;
while (len > 3) { while (len > 3) {
data = target_mem_read32(t, base); size_t read_len = MIN(sizeof(bytes), len) & ~3;
target_mem_read(t, bytes, base, read_len);
CRC_DR = __builtin_bswap32(data); for (unsigned i = 0; i < read_len; i += 4)
base += 4; CRC_DR = __builtin_bswap32(*(uint32_t*)(bytes+i));
len -= 4;
base += read_len;
len -= read_len;
} }
crc = CRC_DR; crc = CRC_DR;
target_mem_read(t, bytes, base, len);
uint8_t *data = bytes;
while (len--) { while (len--) {
data = target_mem_read8(t, base++); crc ^= *data++ << 24;
for (int i = 0; i < 8; i++) {
crc ^= data << 24;
for (i = 0; i < 8; i++) {
if (crc & 0x80000000) if (crc & 0x80000000)
crc = (crc << 1) ^ 0x4C11DB7; crc = (crc << 1) ^ 0x4C11DB7;
else else
@ -146,5 +146,5 @@ uint32_t generic_crc32(target *t, uint32_t base, int len)
} }
return crc; return crc;
} }
#endif #endif

View File

@ -21,7 +21,6 @@
#ifndef __CRC32_H #ifndef __CRC32_H
#define __CRC32_H #define __CRC32_H
uint32_t crc32_calc(uint32_t crc, uint8_t data);
uint32_t generic_crc32(target *t, uint32_t base, int len); uint32_t generic_crc32(target *t, uint32_t base, int len);
#endif #endif

View File

@ -53,13 +53,6 @@ bool target_check_error(target *t);
void target_mem_read(target *t, void *dest, uint32_t src, size_t len); void target_mem_read(target *t, void *dest, uint32_t src, size_t len);
void target_mem_write(target *t, uint32_t dest, const void *src, size_t len); void target_mem_write(target *t, uint32_t dest, const void *src, size_t len);
uint32_t target_mem_read32(target *t, uint32_t addr);
uint16_t target_mem_read16(target *t, uint32_t addr);
uint8_t target_mem_read8(target *t, uint32_t addr);
void target_mem_write32(target *t, uint32_t addr, uint32_t value);
void target_mem_write16(target *t, uint32_t addr, uint16_t value);
void target_mem_write8(target *t, uint32_t addr, uint8_t value);
/* Register access functions */ /* Register access functions */
void target_regs_read(target *t, void *data); void target_regs_read(target *t, void *data);
void target_regs_write(target *t, const void *data); void target_regs_write(target *t, const void *data);

View File

@ -118,6 +118,14 @@ int target_flash_write_buffered(struct target_flash *f,
uint32_t dest, const void *src, size_t len); uint32_t dest, const void *src, size_t len);
int target_flash_done_buffered(struct target_flash *f); int target_flash_done_buffered(struct target_flash *f);
/* Convenience function for MMIO access */
uint32_t target_mem_read32(target *t, uint32_t addr);
uint16_t target_mem_read16(target *t, uint32_t addr);
uint8_t target_mem_read8(target *t, uint32_t addr);
void target_mem_write32(target *t, uint32_t addr, uint32_t value);
void target_mem_write16(target *t, uint32_t addr, uint16_t value);
void target_mem_write8(target *t, uint32_t addr, uint8_t value);
/* Probe for various targets. /* Probe for various targets.
* Actual functions implemented in their respective drivers. * Actual functions implemented in their respective drivers.
*/ */