projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altos: Add HAS_COMPANION to new boards with companion connectors
[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 1e78cabc5fbadb9a9519aaf9a63f1321a7a6d7a0..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);
@@
-87,13
+93,25
@@
extern uint16_t ao_spi_speed[STM_NUM_SPI];
void
ao_spi_init(void);
void
ao_spi_init(void);
+#define ao_spi_set_cs(reg,mask) ((reg)->bsrr = ((uint32_t) (mask)) << 16)
+#define ao_spi_clr_cs(reg,mask) ((reg)->bsrr = (mask))
+
#define ao_spi_get_mask(reg,mask,bus, speed) do { \
ao_spi_get(bus, speed); \
#define ao_spi_get_mask(reg,mask,bus, speed) do { \
ao_spi_get(bus, speed); \
-
(reg)->bsrr = ((uint32_t) mask) << 16;
\
+
ao_spi_set_cs(reg,mask);
\
} while (0)
} 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 { \
#define ao_spi_put_mask(reg,mask,bus) do { \
-
(reg)->bsrr = mask;
\
+
ao_spi_clr_cs(reg,mask);
\
ao_spi_put(bus); \
} while (0)
ao_spi_put(bus); \
} while (0)
@@
-249,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;
@@
-326,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");
@@
-335,6
+355,11
@@
static inline void ao_arch_restore_stack(void) {
asm("bx lr");
}
asm("bx lr");
}
+#ifndef HAS_SAMPLE_PROFILE
+#define HAS_SAMPLE_PROFILE 0
+#endif
+
+#if !HAS_SAMPLE_PROFILE
#define HAS_ARCH_START_SCHEDULER 1
static inline void ao_arch_start_scheduler(void) {
#define HAS_ARCH_START_SCHEDULER 1
static inline void ao_arch_start_scheduler(void) {
@@
-346,22
+371,25
@@
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
#define ao_arch_isr_stack()
#endif
#define ao_arch_isr_stack()
#endif
-#define ao_arch_wait_interrupt() do { \
- asm(".global ao_idle_loc\n\twfi\nao_idle_loc:"); \
- ao_arch_release_interrupts(); \
- ao_arch_block_interrupts(); \
+#define ao_arch_wait_interrupt() do { \
+ asm("\twfi\n"); \
+ ao_arch_release_interrupts(); \
+ asm(".global ao_idle_loc\nao_idle_loc:"); \
+ ao_arch_block_interrupts(); \
} while (0)
} 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_ */