X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Flpc%2Fao_flash_lpc.c;h=37913091ae7f50796eaf04ae105ef07528b87766;hp=5a31f39f2a2acfc0851ef963b8a6bba8e4239295;hb=HEAD;hpb=4188153548fca104bb49cda2d502c708fe4b49d7 diff --git a/src/lpc/ao_flash_lpc.c b/src/lpc/ao_flash_lpc.c index 5a31f39f..541fbb65 100644 --- a/src/lpc/ao_flash_lpc.c +++ b/src/lpc/ao_flash_lpc.c @@ -3,7 +3,8 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -72,10 +73,12 @@ iap(uint32_t *in, uint32_t *out) static uint32_t iap_in[5], iap_out[5]; +#if IS_FLASH_LOADER + static uint32_t ao_lpc_addr_to_sector(uint8_t *addr) { - uint32_t off = addr - LPC_FLASH_BASE; + uint32_t off = (uint32_t) (addr - LPC_FLASH_BASE); return off >> LPC_FLASH_SECTOR_SHIFT; } @@ -83,7 +86,7 @@ ao_lpc_addr_to_sector(uint8_t *addr) static uint8_t ao_lpc_addr_is_sector_aligned(uint8_t *addr) { - uint32_t off = addr - LPC_FLASH_BASE; + uint32_t off = (uint32_t) (addr - LPC_FLASH_BASE); return (off & LPC_FLASH_SECTOR_MASK) == 0; } @@ -156,3 +159,45 @@ ao_flash_page(uint8_t *page, uint8_t *src) ret = ao_lpc_copy_ram_to_flash(page, src, 256, AO_LPC_SYSCLK / 1000); return ret; } + +#endif + +#if LPC_EEPROM_BYTES + +/* + * Write to eeprom + */ + +uint8_t +ao_eeprom_write(ao_pos_t pos, void *v, uint16_t len) +{ + iap_in[0] = LPC_IAP_EEPROM_WRITE; + iap_in[1] = (uint32_t) pos; + iap_in[2] = (uint32_t) v; + iap_in[3] = (uint32_t) len; + iap_in[4] = AO_LPC_SYSCLK / 1000; + iap(iap_in,iap_out); + return iap_out[0] == LPC_IAP_CMD_SUCCESS; +} + +/* + * Read from eeprom + */ +uint8_t +ao_eeprom_read(ao_pos_t pos, void *v, uint16_t len) +{ + iap_in[0] = LPC_IAP_EEPROM_READ; + iap_in[1] = (uint32_t) pos; + iap_in[2] = (uint32_t) v; + iap_in[3] = (uint32_t) len; + iap_in[4] = AO_LPC_SYSCLK / 1000; + iap(iap_in,iap_out); + return iap_out[0] == LPC_IAP_CMD_SUCCESS; +} + +void +ao_eeprom_init(void) +{ + /* Nothing to do here */ +} +#endif