projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altos/telefireone-v1.0: Track ao_led_init API change
[fw/altos]
/
src
/
drivers
/
ao_m25.c
diff --git
a/src/drivers/ao_m25.c
b/src/drivers/ao_m25.c
index c807cd686cb053c06921395d81448f82ec18a8cc..72617cc4504f24f18966e1a80f1be4699d2a1fc9 100644
(file)
--- a/
src/drivers/ao_m25.c
+++ b/
src/drivers/ao_m25.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
*
* 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
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
@@
-18,17
+19,18
@@
#include "ao.h"
/* Total bytes of available storage */
#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 */
/* 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 */
/* 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. */
/* 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
/*
* Each flash chip is arranged in 64kB sectors; the
* chip cannot erase in units smaller than that.
/*
* Each flash chip is arranged in 64kB sectors; the
* chip cannot erase in units smaller than that.
@@
-81,13
+83,13
@@
__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 */
#if M25_MAX_CHIPS > 1
static uint8_t ao_m25_size[M25_MAX_CHIPS]; /* number of sectors in each chip */
-static
uint8_t ao_m25_pin[M25_MAX_CHIPS];
/* chip select pin for 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 uint8_t ao_m25_numchips; /* number of chips detected */
#endif
static uint8_t ao_m25_total; /* total sectors available */
-static
uint8_t ao_m25_wip;
/* write in progress */
+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
/*
* This little array is abused to send and receive data. A particular
@@
-97,9
+99,9
@@
static __xdata uint8_t ao_m25_mutex;
* of which touch those last three bytes.
*/
* 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)
+#define M25_SELECT(cs) ao_spi_get_mask(AO_M25_SPI_CS_PORT,cs,AO_M25_SPI_BUS
, AO_SPI_SPEED_FAST
)
#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_DESELECT(cs) ao_spi_put_mask(AO_M25_SPI_CS_PORT,cs,AO_M25_SPI_BUS)
#define M25_BLOCK_SHIFT 16
@@
-111,7
+113,7
@@
static __xdata uint8_t ao_m25_instruction[4];
* Block until the specified chip is done writing
*/
static void
* Block until the specified chip is done writing
*/
static void
-ao_m25_wait_wip(
uint8
_t cs)
+ao_m25_wait_wip(
ao_port
_t cs)
{
if (ao_m25_wip & cs) {
M25_SELECT(cs);
{
if (ao_m25_wip & cs) {
M25_SELECT(cs);
@@
-131,7
+133,7
@@
ao_m25_wait_wip(uint8_t cs)
* so that future operations will block until the WIP bit goes off
*/
static void
* so that future operations will block until the WIP bit goes off
*/
static void
-ao_m25_write_enable(
uint8
_t cs)
+ao_m25_write_enable(
ao_port
_t cs)
{
M25_SELECT(cs);
ao_m25_instruction[0] = M25_WREN;
{
M25_SELECT(cs);
ao_m25_instruction[0] = M25_WREN;
@@
-145,7
+147,7
@@
ao_m25_write_enable(uint8_t cs)
* Returns the number of 64kB sectors
*/
static uint8_t
* Returns the number of 64kB sectors
*/
static uint8_t
-ao_m25_read_capacity(
uint8
_t cs)
+ao_m25_read_capacity(
ao_port
_t cs)
{
uint8_t capacity;
M25_SELECT(cs);
{
uint8_t capacity;
M25_SELECT(cs);
@@
-165,12
+167,13
@@
ao_m25_read_capacity(uint8_t cs)
return 1 << (capacity - 0x10);
}
return 1 << (capacity - 0x10);
}
-static
uint8
_t
+static
ao_port
_t
ao_m25_set_address(uint32_t pos)
{
ao_m25_set_address(uint32_t pos)
{
-
uint8_t chip
;
+
ao_port_t mask
;
#if M25_MAX_CHIPS > 1
uint8_t size;
#if M25_MAX_CHIPS > 1
uint8_t size;
+ uint8_t chip;
for (chip = 0; chip < ao_m25_numchips; chip++) {
size = ao_m25_size[chip];
for (chip = 0; chip < ao_m25_numchips; chip++) {
size = ao_m25_size[chip];
@@
-181,16
+184,16
@@
ao_m25_set_address(uint32_t pos)
if (chip == ao_m25_numchips)
return 0xff;
if (chip == ao_m25_numchips)
return 0xff;
-
chip
= ao_m25_pin[chip];
+
mask
= ao_m25_pin[chip];
#else
#else
-
chip
= AO_M25_SPI_CS_MASK;
+
mask
= AO_M25_SPI_CS_MASK;
#endif
#endif
- ao_m25_wait_wip(
chip
);
+ 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] = pos >> 16;
ao_m25_instruction[2] = pos >> 8;
ao_m25_instruction[3] = pos;
- return
chip
;
+ return
mask
;
}
/*
}
/*
@@
-236,9
+239,9
@@
ao_m25_scan(void)
* Erase the specified sector
*/
uint8_t
* Erase the specified sector
*/
uint8_t
-ao_storage_erase(uint32_t pos)
__reentrant
+ao_storage_erase(uint32_t pos)
{
{
-
uint8_t
cs;
+
ao_port_t
cs;
if (pos >= ao_storage_total || pos + ao_storage_block > ao_storage_total)
return 0;
if (pos >= ao_storage_total || pos + ao_storage_block > ao_storage_total)
return 0;
@@
-248,7
+251,6
@@
ao_storage_erase(uint32_t pos) __reentrant
cs = ao_m25_set_address(pos);
cs = ao_m25_set_address(pos);
- ao_m25_wait_wip(cs);
ao_m25_write_enable(cs);
ao_m25_instruction[0] = M25_SE;
ao_m25_write_enable(cs);
ao_m25_instruction[0] = M25_SE;
@@
-265,9
+267,9
@@
ao_storage_erase(uint32_t pos) __reentrant
* Write to flash
*/
uint8_t
* 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)
{
{
-
uint8_t
cs;
+
ao_port_t
cs;
if (pos >= ao_storage_total || pos + len > ao_storage_total)
return 0;
if (pos >= ao_storage_total || pos + len > ao_storage_total)
return 0;
@@
-292,9
+294,9
@@
ao_storage_device_write(uint32_t pos, __xdata void *d, uint16_t len) __reentrant
* Read from flash
*/
uint8_t
* 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)
{
{
-
uint8_t
cs;
+
ao_port_t
cs;
if (pos >= ao_storage_total || pos + len > ao_storage_total)
return 0;
if (pos >= ao_storage_total || pos + len > ao_storage_total)
return 0;
@@
-315,7
+317,7
@@
ao_storage_device_read(uint32_t pos, __xdata void *d, uint16_t len) __reentrant
}
void
}
void
-ao_storage_flush(void)
__reentrant
+ao_storage_flush(void)
{
}
{
}
@@
-328,9
+330,11
@@
ao_storage_setup(void)
}
void
}
void
-ao_storage_device_info(void)
__reentrant
+ao_storage_device_info(void)
{
{
- uint8_t cs;
+#if M25_DEBUG
+ ao_port_t cs;
+#endif
#if M25_MAX_CHIPS > 1
uint8_t chip;
#endif
#if M25_MAX_CHIPS > 1
uint8_t chip;
#endif
@@
-348,6
+352,7
@@
ao_storage_device_info(void) __reentrant
printf ("Detected chips 1 size %d\n", ao_m25_total);
#endif
printf ("Detected chips 1 size %d\n", ao_m25_total);
#endif
+#if M25_DEBUG
printf ("Available chips:\n");
for (cs = 1; cs != 0; cs <<= 1) {
if ((AO_M25_SPI_CS_MASK & cs) == 0)
printf ("Available chips:\n");
for (cs = 1; cs != 0; cs <<= 1) {
if ((AO_M25_SPI_CS_MASK & cs) == 0)
@@
-368,6
+373,7
@@
ao_storage_device_info(void) __reentrant
ao_m25_instruction[M25_UID_OFFSET]);
ao_mutex_put(&ao_m25_mutex);
}
ao_m25_instruction[M25_UID_OFFSET]);
ao_mutex_put(&ao_m25_mutex);
}
+#endif
}
void
}
void