first cut at turnon scripts for EasyTimer v2
[fw/altos] / src / drivers / ao_m25.c
index b506b0a7c9394ee5bac8fd36ace6a8ea065dfe4f..4be91e13b7599cedd73f7778134d7187d51a7e1d 100644 (file)
 #include "ao.h"
 
 /* Total bytes of available storage */
-__pdata uint32_t       ao_storage_total;
+uint32_t       ao_storage_total;
 
 /* Block size - device is erased in these units. At least 256 bytes */
-__pdata uint32_t       ao_storage_block;
+uint32_t       ao_storage_block;
 
 /* Byte offset of config block. Will be ao_storage_block bytes long */
-__pdata uint32_t       ao_storage_config;
+uint32_t       ao_storage_config;
 
 /* Storage unit size - device reads and writes must be within blocks of this size. Usually 256 bytes. */
-__pdata uint16_t       ao_storage_unit;
+uint16_t       ao_storage_unit;
 
 #define M25_DEBUG      0
 /*
@@ -82,14 +82,14 @@ __pdata uint16_t    ao_storage_unit;
  */
 
 #if M25_MAX_CHIPS > 1
-static uint8_t ao_m25_size[M25_MAX_CHIPS];     /* number of sectors in each chip */
+static uint32_t ao_m25_size[M25_MAX_CHIPS];    /* number of sectors in each chip */
 static ao_port_t ao_m25_pin[M25_MAX_CHIPS];    /* chip select pin for each chip */
 static uint8_t ao_m25_numchips;                        /* number of chips detected */
 #endif
-static uint8_t ao_m25_total;                   /* total sectors available */
+static uint32_t ao_m25_total;                  /* total sectors available */
 static ao_port_t ao_m25_wip;                   /* write in progress */
 
-static __xdata uint8_t ao_m25_mutex;
+static uint8_t ao_m25_mutex;
 
 /*
  * This little array is abused to send and receive data. A particular
@@ -99,14 +99,16 @@ static __xdata uint8_t ao_m25_mutex;
  * of which touch those last three bytes.
  */
 
-static __xdata uint8_t ao_m25_instruction[4];
+static uint8_t ao_m25_instruction[4];
 
-#define M25_SELECT(cs)         ao_spi_get_mask(AO_M25_SPI_CS_PORT,cs,AO_M25_SPI_BUS, AO_SPI_SPEED_FAST)
+#define AO_M25_SPI_SPEED       ao_spi_speed(AO_M25_SPI_BUS, 10000000)  /* this seems like a reasonable minimum speed to require */
+
+#define M25_SELECT(cs)         ao_spi_get_mask(AO_M25_SPI_CS_PORT,cs,AO_M25_SPI_BUS,AO_M25_SPI_SPEED)
 #define M25_DESELECT(cs)       ao_spi_put_mask(AO_M25_SPI_CS_PORT,cs,AO_M25_SPI_BUS)
 
 #define M25_BLOCK_SHIFT                        16
 #define M25_BLOCK                      65536L
-#define M25_POS_TO_SECTOR(pos)         ((uint8_t) ((pos) >> M25_BLOCK_SHIFT))
+#define M25_POS_TO_SECTOR(pos)         ((uint32_t) ((pos) >> M25_BLOCK_SHIFT))
 #define M25_SECTOR_TO_POS(sector)      (((uint32_t) (sector)) << M25_BLOCK_SHIFT)
 
 /*
@@ -123,7 +125,7 @@ ao_m25_wait_wip(ao_port_t cs)
                        ao_spi_recv(ao_m25_instruction, 1, AO_M25_SPI_BUS);
                } while (ao_m25_instruction[0] & M25_STATUS_WIP);
                M25_DESELECT(cs);
-               ao_m25_wip &= ~cs;
+               ao_m25_wip &= (ao_port_t) ~cs;
        }
 }
 
@@ -146,7 +148,7 @@ ao_m25_write_enable(ao_port_t cs)
 /*
  * Returns the number of 64kB sectors
  */
-static uint8_t
+static uint32_t
 ao_m25_read_capacity(ao_port_t cs)
 {
        uint8_t capacity;
@@ -172,7 +174,7 @@ ao_m25_set_address(uint32_t pos)
 {
        ao_port_t       mask;
 #if M25_MAX_CHIPS > 1
-       uint8_t size;
+       uint32_t        size;
        uint8_t         chip;
 
        for (chip = 0; chip < ao_m25_numchips; chip++) {
@@ -190,9 +192,9 @@ ao_m25_set_address(uint32_t pos)
 #endif
        ao_m25_wait_wip(mask);
 
-       ao_m25_instruction[1] = pos >> 16;
-       ao_m25_instruction[2] = pos >> 8;
-       ao_m25_instruction[3] = pos;
+       ao_m25_instruction[1] = (uint8_t) (pos >> 16);
+       ao_m25_instruction[2] = (uint8_t) (pos >> 8);
+       ao_m25_instruction[3] = (uint8_t) (pos);
        return mask;
 }
 
@@ -204,7 +206,8 @@ static uint8_t
 ao_m25_scan(void)
 {
 #if M25_MAX_CHIPS > 1
-       uint8_t pin, size;
+       uint8_t pin;
+       uint32_t size;
 #endif
 
        if (ao_m25_total)
@@ -239,7 +242,7 @@ ao_m25_scan(void)
  * Erase the specified sector
  */
 uint8_t
-ao_storage_erase(uint32_t pos) __reentrant
+ao_storage_device_erase(uint32_t pos)
 {
        ao_port_t       cs;
 
@@ -267,7 +270,7 @@ ao_storage_erase(uint32_t pos) __reentrant
  * Write to flash
  */
 uint8_t
-ao_storage_device_write(uint32_t pos, __xdata void *d, uint16_t len) __reentrant
+ao_storage_device_write(uint32_t pos, void *d, uint16_t len) 
 {
        ao_port_t       cs;
 
@@ -294,7 +297,7 @@ ao_storage_device_write(uint32_t pos, __xdata void *d, uint16_t len) __reentrant
  * Read from flash
  */
 uint8_t
-ao_storage_device_read(uint32_t pos, __xdata void *d, uint16_t len) __reentrant
+ao_storage_device_read(uint32_t pos, void *d, uint16_t len) 
 {
        ao_port_t       cs;
 
@@ -317,7 +320,7 @@ ao_storage_device_read(uint32_t pos, __xdata void *d, uint16_t len) __reentrant
 }
 
 void
-ao_storage_flush(void) __reentrant
+ao_storage_flush(void) 
 {
 }
 
@@ -330,7 +333,7 @@ ao_storage_setup(void)
 }
 
 void
-ao_storage_device_info(void) __reentrant
+ao_storage_device_info(void) 
 {
 #if M25_DEBUG
        ao_port_t       cs;
@@ -344,12 +347,12 @@ ao_storage_device_info(void) __reentrant
        ao_mutex_put(&ao_m25_mutex);
 
 #if M25_MAX_CHIPS > 1
-       printf ("Detected chips %d size %d\n", ao_m25_numchips, ao_m25_total);
+       printf ("Detected chips %d size %ld\n", ao_m25_numchips, ao_m25_total);
        for (chip = 0; chip < ao_m25_numchips; chip++)
                printf ("Flash chip %d select %02x size %d\n",
                        chip, ao_m25_pin[chip], ao_m25_size[chip]);
 #else
-       printf ("Detected chips 1 size %d\n", ao_m25_total);
+       printf ("Detected chips 1 size %ld\n", ao_m25_total);
 #endif
 
 #if M25_DEBUG