first cut at turnon scripts for EasyTimer v2
[fw/altos] / src / lpc / ao_flash_lpc.c
index 5a31f39f2a2acfc0851ef963b8a6bba8e4239295..541fbb65968ce23898709f3d11935231f055041d 100644 (file)
@@ -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