diff options
| author | Bdale Garbee <bdale@gag.com> | 2014-09-09 23:28:39 -0600 | 
|---|---|---|
| committer | Bdale Garbee <bdale@gag.com> | 2014-09-09 23:28:39 -0600 | 
| commit | 16405fd3eb6f82ef3a709e3ed30fc48faef7b547 (patch) | |
| tree | c111819b3ba0c9357af41c81b798326b9df7adad /src/stm/ao_arch_funcs.h | |
| parent | 5a2f6ed6210844f7284fbf9f7ecba68c8a14fa52 (diff) | |
| parent | 28bd5057252e61bc5b1a35a00bc1f9fdfde097f7 (diff) | |
Merge branch 'branch-1.5' into debian
Conflicts:
	ChangeLog
	Releasing
	altosui/Instdrv/NSIS/Includes/java.nsh
	altosui/altos-windows.nsi.in
	configure.ac
	doc/Makefile
	doc/altusmetrum.xsl
	micropeak/micropeak-windows.nsi.in
	telegps/telegps-windows.nsi.in
Diffstat (limited to 'src/stm/ao_arch_funcs.h')
| -rw-r--r-- | src/stm/ao_arch_funcs.h | 25 | 
1 files changed, 21 insertions, 4 deletions
| diff --git a/src/stm/ao_arch_funcs.h b/src/stm/ao_arch_funcs.h index b461cd3f..7ad3b4b8 100644 --- 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) +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); @@ -77,6 +80,9 @@ 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 @@ -95,6 +101,15 @@ ao_spi_init(void);  		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);		\ @@ -252,6 +267,8 @@ extern struct ao_stm_usart	ao_stm_usart3;  #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; @@ -369,10 +386,10 @@ static inline void ao_arch_start_scheduler(void) {  		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_ */ | 
