diff options
| author | Keith Packard <keithp@keithp.com> | 2013-03-23 02:23:03 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2013-05-07 20:16:52 -0700 | 
| commit | 5db4d5e5b1272b161102e889e65b9c7bc7928352 (patch) | |
| tree | 96c593f84624efda1a87b315f09a74269d2dcb59 /src | |
| parent | ac6b4fca0970faa0a537a813242585693b839469 (diff) | |
altos: Add erase command to stm-flash app. Validate addresses.
This also leaves the code writing fixed values and printing read data
in ascii instead of binary. Useful for debugging, will want changing
for the product.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/stm-flash/ao_stm_flash.c | 39 | 
1 files changed, 35 insertions, 4 deletions
| diff --git a/src/stm-flash/ao_stm_flash.c b/src/stm-flash/ao_stm_flash.c index 4a91ef1f..51856b46 100644 --- a/src/stm-flash/ao_stm_flash.c +++ b/src/stm-flash/ao_stm_flash.c @@ -54,6 +54,15 @@ ao_cmd_hex32(void)  }  void +ao_block_erase(void) +{ +	uint32_t	addr = ao_cmd_hex32(); +	uint32_t	*p = (uint32_t *) addr; + +	ao_flash_erase_page(p); +} + +void  ao_block_write(void)  {  	uint32_t	addr = ao_cmd_hex32(); @@ -64,24 +73,46 @@ ao_block_write(void)  	} u;  	uint16_t	i; +	if (addr < 0x08002000 || 0x08200000 <= addr) { +		puts("Invalid address"); +		return; +	}  	for (i = 0; i < 256; i++) -		u.data8[i] = getchar(); +		u.data8[i] = i;  	ao_flash_page(p, u.data32);  } +static void +puthex(uint8_t c) +{ +	c &= 0xf; +	if (c < 10) +		c += '0'; +	else +		c += 'a' - 10; +	putchar (c); +} +  void  ao_block_read(void)  {  	uint32_t	addr = ao_cmd_hex32();  	uint8_t		*p = (uint8_t *) addr;  	uint16_t	i; +	uint8_t		c; -	for (i = 0; i < 256; i++) -		putchar(*p++); +	for (i = 0; i < 256; i++) { +		c = *p++; +		puthex(c); +		puthex(c>>4); +		if ((i & 0xf) == 0xf) +			putchar('\n'); +	}  }  __code struct ao_cmds ao_flash_cmds[] = { -	{ ao_application, "A\0Switch to application" }, +	{ ao_application, "a\0Switch to application" }, +	{ ao_block_erase, "e <addr>\0Erase block." },  	{ ao_block_write, "W <addr>\0Write block. 256 binary bytes follow newline" },  	{ ao_block_read, "R <addr>\0Read block. Returns 256 bytes" },  	{ 0, NULL }, | 
