X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fcc1111%2Fao_arch.h;h=bacfabb87f53852ba1f63b1803e15f178f76f120;hp=44116b812d9a07820a41c99d24089e1790ebc5b5;hb=1085ec5d57e0ed5d132f2bbdac1a0b6a32c0ab4a;hpb=c04af7533bd3fd3f3260338c0753fde966131720 diff --git a/src/cc1111/ao_arch.h b/src/cc1111/ao_arch.h index 44116b81..bacfabb8 100644 --- a/src/cc1111/ao_arch.h +++ b/src/cc1111/ao_arch.h @@ -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 - * 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 @@ -40,6 +41,8 @@ #define AO_STACK_END 0xfe #define AO_STACK_SIZE (AO_STACK_END - AO_STACK_START + 1) +#define AO_PORT_TYPE uint8_t + #define ao_arch_reboot() do { \ WDCTL = WDCTL_EN | WDCTL_MODE_WATCHDOG | WDCTL_INT_64; \ ao_delay(AO_SEC_TO_TICKS(2)); \ @@ -59,10 +62,12 @@ #define AO_ROMCONFIG_VERSION 2 -extern __code __at (0x00a0) uint16_t ao_romconfig_version; -extern __code __at (0x00a2) uint16_t ao_romconfig_check; -extern __code __at (0x00a4) uint16_t ao_serial_number; -extern __code __at (0x00a6) uint32_t ao_radio_cal; +#define AO_ROMCONFIG_SYMBOL(a) __code __at(a) + +extern AO_ROMCONFIG_SYMBOL(0x00a0) uint16_t ao_romconfig_version; +extern AO_ROMCONFIG_SYMBOL(0x00a2) uint16_t ao_romconfig_check; +extern AO_ROMCONFIG_SYMBOL(0x00a4) uint16_t ao_serial_number; +extern AO_ROMCONFIG_SYMBOL(0x00a6) uint32_t ao_radio_cal; #ifndef HAS_USB #error Please define HAS_USB @@ -110,9 +115,7 @@ extern __code __at (0x00a6) uint32_t ao_radio_cal; /* Push ACC first, as when restoring the context it must be restored \ * last (it is used to set the IE register). */ \ push ACC \ - /* Store the IE register then enable interrupts. */ \ push _IEN0 \ - setb _EA \ push DPL \ push DPH \ push b \ @@ -145,11 +148,18 @@ extern __code __at (0x00a6) uint32_t ao_radio_cal; while (--stack_len); \ } -#define ao_arch_isr_stack() \ - /* Empty the stack; might as well let interrupts have the whole thing */ \ - (SP = AO_STACK_START - 1) +/* Empty the stack; might as well let interrupts have the whole thing */ +#define ao_arch_isr_stack() (SP = AO_STACK_START - 1) -#define ao_arch_cpu_idle() (PCON = PCON_IDLE) +#define ao_arch_block_interrupts() __asm clr _EA __endasm +#define ao_arch_release_interrupts() __asm setb _EA __endasm + +/* Idle the CPU, waking when an interrupt occurs */ +#define ao_arch_wait_interrupt() do { \ + ao_arch_release_interrupts(); \ + (PCON = PCON_IDLE); \ + ao_arch_block_interrupts(); \ + } while (0) #define ao_arch_restore_stack() { \ uint8_t stack_len; \ @@ -190,7 +200,7 @@ extern __code __at (0x00a6) uint32_t ao_radio_cal; 0098$: \ SETB _EA \ 0099$: \ - /* Finally pop off the ACC, which was the first register saved. */ \ + /* Finally restore ACC, which was the first register saved. */ \ pop ACC \ ret \ __endasm; \ @@ -198,16 +208,6 @@ extern __code __at (0x00a6) uint32_t ao_radio_cal; #define ao_arch_critical(b) __critical { b } -struct ao_adc { - int16_t accel; /* accelerometer */ - int16_t pres; /* pressure sensor */ - int16_t temp; /* temperature sensor */ - int16_t v_batt; /* battery voltage */ - int16_t sense_d; /* drogue continuity sense */ - int16_t sense_m; /* main continuity sense */ - int16_t accel_ref; /* acceleration reference */ -}; - #define AO_DATA_RING 32 /* ao_button.c */ @@ -229,7 +229,7 @@ void ao_button_init(void); char -ao_button_get(void) __critical; +ao_button_get(uint16_t timeout) __critical; void ao_button_clear(void) __critical; @@ -237,17 +237,17 @@ ao_button_clear(void) __critical; /* ao_string.c */ void -_ao_xmemcpy(__xdata void *dst, __xdata void *src, uint8_t count); +_ao_xmemcpy(__xdata void *dst, __xdata void *src, uint16_t count); #define ao_xmemcpy(d,s,c) _ao_xmemcpy(d,s,c) void -_ao_xmemset(__xdata void *dst, uint8_t value, uint8_t count); +_ao_xmemset(__xdata void *dst, uint8_t value, uint16_t count); #define ao_xmemset(d,v,c) _ao_xmemset(d,v,c) int8_t -_ao_xmemcmp(__xdata void *a, __xdata void *b, uint8_t count); +_ao_xmemcmp(__xdata void *a, __xdata void *b, uint16_t count); #define ao_xmemcmp(d,s,c) _ao_xmemcmp((d), (s), (c)) @@ -324,4 +324,11 @@ void ao_serial1_tx_isr(void) ao_arch_interrupt(14); #endif +#if HAS_EXTI_0 +void +ao_p0_isr(void) __interrupt(13); +#endif + +#define AO_ADC_MAX 32767 + #endif /* _AO_ARCH_H_ */