projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altosuilib: Get the Eeprom download progress bar working again
[fw/altos]
/
src
/
stm
/
ao_arch_funcs.h
diff --git
a/src/stm/ao_arch_funcs.h
b/src/stm/ao_arch_funcs.h
index 9bb2d7cd5d830c158bd0dbbeb01ec3a39b63d64c..42f1a2e5d75c5aeb4680dbf12c7c9b0f039e9ebb 100644
(file)
--- a/
src/stm/ao_arch_funcs.h
+++ b/
src/stm/ao_arch_funcs.h
@@
-64,6
+64,9
@@
#define AO_SPI_INDEX(id) ((id) & AO_SPI_INDEX_MASK)
#define AO_SPI_CONFIG(id) ((id) & AO_SPI_CONFIG_MASK)
#define AO_SPI_INDEX(id) ((id) & AO_SPI_INDEX_MASK)
#define AO_SPI_CONFIG(id) ((id) & AO_SPI_CONFIG_MASK)
+uint8_t
+ao_spi_try_get(uint8_t spi_index, uint32_t speed, uint8_t task_id);
+
void
ao_spi_get(uint8_t spi_index, uint32_t speed);
void
ao_spi_get(uint8_t spi_index, uint32_t speed);
@@
-71,11
+74,14
@@
void
ao_spi_put(uint8_t spi_index);
void
ao_spi_put(uint8_t spi_index);
void
-ao_spi_send(void *block, uint16_t len, uint8_t spi_index);
+ao_spi_send(
const
void *block, uint16_t len, uint8_t spi_index);
void
ao_spi_send_fixed(uint8_t value, uint16_t len, uint8_t spi_index);
void
ao_spi_send_fixed(uint8_t value, uint16_t len, uint8_t spi_index);
+void
+ao_spi_send_sync(void *block, uint16_t len, uint8_t spi_index);
+
void
ao_spi_recv(void *block, uint16_t len, uint8_t spi_index);
void
ao_spi_recv(void *block, uint16_t len, uint8_t spi_index);
@@
-95,6
+101,15
@@
ao_spi_init(void);
ao_spi_set_cs(reg,mask); \
} while (0)
ao_spi_set_cs(reg,mask); \
} while (0)
+static inline uint8_t
+ao_spi_try_get_mask(struct stm_gpio *reg, uint16_t mask, uint8_t bus, uint32_t speed, uint8_t task_id)
+{
+ if (!ao_spi_try_get(bus, speed, task_id))
+ return 0;
+ ao_spi_set_cs(reg, mask);
+ return 1;
+}
+
#define ao_spi_put_mask(reg,mask,bus) do { \
ao_spi_clr_cs(reg,mask); \
ao_spi_put(bus); \
#define ao_spi_put_mask(reg,mask,bus) do { \
ao_spi_clr_cs(reg,mask); \
ao_spi_put(bus); \
@@
-252,6
+267,8
@@
extern struct ao_stm_usart ao_stm_usart3;
#define ARM_PUSH32(stack, val) (*(--(stack)) = (val))
#define ARM_PUSH32(stack, val) (*(--(stack)) = (val))
+typedef uint32_t ao_arch_irq_t;
+
static inline uint32_t
ao_arch_irqsave(void) {
uint32_t primask;
static inline uint32_t
ao_arch_irqsave(void) {
uint32_t primask;
@@
-329,7
+346,7
@@
static inline void ao_arch_restore_stack(void) {
/* Restore APSR */
asm("pop {r0}");
/* Restore APSR */
asm("pop {r0}");
- asm("msr apsr,r0");
+ asm("msr apsr
_nczvq
,r0");
/* Restore general registers */
asm("pop {r0-r12,lr}\n");
/* Restore general registers */
asm("pop {r0-r12,lr}\n");
@@
-354,6
+371,7
@@
static inline void ao_arch_start_scheduler(void) {
asm("mrs %0,control" : "=&r" (control));
control |= (1 << 1);
asm("msr control,%0" : : "r" (control));
asm("mrs %0,control" : "=&r" (control));
control |= (1 << 1);
asm("msr control,%0" : : "r" (control));
+ asm("isb");
}
#endif
}
#endif
@@
-368,10
+386,10
@@
static inline void ao_arch_start_scheduler(void) {
ao_arch_block_interrupts(); \
} while (0)
ao_arch_block_interrupts(); \
} while (0)
-#define ao_arch_critical(b) do {
\
-
ao_arch_block_interrupts();
\
- do { b } while (0);
\
- ao_arch_
release_interrupts();
\
+#define ao_arch_critical(b) do { \
+
uint32_t __mask = ao_arch_irqsave();
\
+ do { b } while (0); \
+ ao_arch_
irqrestore(__mask);
\
} while (0)
#endif /* _AO_ARCH_FUNCS_H_ */
} while (0)
#endif /* _AO_ARCH_FUNCS_H_ */