projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altos: Share common LCO functions in ao_lco_bits.c
[fw/altos]
/
src
/
drivers
/
ao_m25.c
diff --git
a/src/drivers/ao_m25.c
b/src/drivers/ao_m25.c
index c807cd686cb053c06921395d81448f82ec18a8cc..b506b0a7c9394ee5bac8fd36ace6a8ea065dfe4f 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
@@
-29,6
+30,7
@@
__pdata 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;
/* Storage unit size - device reads and writes must be within blocks of this size. Usually 256 bytes. */
__pdata 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,11
+83,11
@@
__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 __xdata uint8_t ao_m25_mutex;
@@
-99,7
+101,7
@@
static __xdata uint8_t ao_m25_mutex;
static __xdata uint8_t ao_m25_instruction[4];
static __xdata 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
;
}
/*
}
/*
@@
-238,7
+241,7
@@
ao_m25_scan(void)
uint8_t
ao_storage_erase(uint32_t pos) __reentrant
{
uint8_t
ao_storage_erase(uint32_t pos) __reentrant
{
-
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;
@@
-267,7
+269,7
@@
ao_storage_erase(uint32_t pos) __reentrant
uint8_t
ao_storage_device_write(uint32_t pos, __xdata void *d, uint16_t len) __reentrant
{
uint8_t
ao_storage_device_write(uint32_t pos, __xdata void *d, uint16_t len) __reentrant
{
-
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;
@@
-294,7
+296,7
@@
ao_storage_device_write(uint32_t pos, __xdata void *d, uint16_t len) __reentrant
uint8_t
ao_storage_device_read(uint32_t pos, __xdata void *d, uint16_t len) __reentrant
{
uint8_t
ao_storage_device_read(uint32_t pos, __xdata void *d, uint16_t len) __reentrant
{
-
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;
@@
-330,7
+332,9
@@
ao_storage_setup(void)
void
ao_storage_device_info(void) __reentrant
{
void
ao_storage_device_info(void) __reentrant
{
- 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