diff --git a/cores/arduino/sdk/libarm_cortexM4lf_math.a b/cores/arduino/sdk/libarm_cortexM4lf_math.a new file mode 100644 index 00000000..66efc87f Binary files /dev/null and b/cores/arduino/sdk/libarm_cortexM4lf_math.a differ diff --git a/libraries/PDM/src/PDM.cpp b/libraries/PDM/src/PDM.cpp index 360b261a..0a83408a 100644 --- a/libraries/PDM/src/PDM.cpp +++ b/libraries/PDM/src/PDM.cpp @@ -21,7 +21,8 @@ SOFTWARE. */ #include "PDM.h" -AP3_PDM *ap3_pdm_handle = 0; +AP3_PDM* ap3_pdm_handle = NULL; +static void* pdm_handle = NULL; // the apollo3 blue only has one PDM instance so let's keep it simple // AP3_PDM::AP3_PDM(uint16_t *userBuffer, uint32_t bufferSize) // { @@ -34,7 +35,8 @@ AP3_PDM *ap3_pdm_handle = 0; bool AP3_PDM::begin(pin_size_t pinPDMData, pin_size_t pinPDMClock) { - _PDMhandle = NULL; + pdm_handle = NULL; + ap3_pdm_handle = NULL; _PDMconfig = ap3_pdm_config_default; _pinPDMData = pinPDMData; _pinPDMClock = pinPDMClock; @@ -78,7 +80,7 @@ uint32_t AP3_PDM::_begin(void) } pincfg.uFuncSel = funcsel; // set the proper function select option for this instance/pin/type combination retval = am_hal_gpio_pinconfig(_pinPDMData, pincfg); - if (retval != AP3_OK) + if (retval != AM_HAL_STATUS_SUCCESS) { return retval; } @@ -90,7 +92,7 @@ uint32_t AP3_PDM::_begin(void) } pincfg.uFuncSel = funcsel; // set the proper function select option for this instance/pin/type combination retval = am_hal_gpio_pinconfig(_pinPDMClock, pincfg); - if (retval != AP3_OK) + if (retval != AM_HAL_STATUS_SUCCESS) { return retval; } @@ -98,51 +100,62 @@ uint32_t AP3_PDM::_begin(void) // Initialize, power-up, and configure the PDM. // //User may want to change settings mid-sketch. Only init PDM if it's new. - if (_PDMhandle == NULL) + if (pdm_handle == NULL) { // Now that pins are initialized start the actual driver - retval = (uint32_t)am_hal_pdm_initialize(0, &_PDMhandle); - if (retval != AP3_OK) + retval = (uint32_t)am_hal_pdm_initialize(0, &pdm_handle); + if (retval != AM_HAL_STATUS_SUCCESS) { return retval; } } - retval = (uint32_t)am_hal_pdm_power_control(_PDMhandle, AM_HAL_PDM_POWER_ON, false); - if (retval != AP3_OK) + retval = (uint32_t)am_hal_pdm_power_control(pdm_handle, AM_HAL_PDM_POWER_ON, false); + if (retval != AM_HAL_STATUS_SUCCESS) { return retval; } - retval = (uint32_t)am_hal_pdm_configure(_PDMhandle, &_PDMconfig); - if (retval != AP3_OK) + retval = (uint32_t)am_hal_pdm_configure(pdm_handle, &_PDMconfig); + if (retval != AM_HAL_STATUS_SUCCESS) { return retval; } - retval = (uint32_t)am_hal_pdm_enable(_PDMhandle); - if (retval != AP3_OK) + retval = (uint32_t)am_hal_pdm_enable(pdm_handle); + if (retval != AM_HAL_STATUS_SUCCESS) { return retval; } + Serial.println("pdm initialized and configured. now need to enable interrupts"); + // // Configure and enable PDM interrupts (set up to trigger on DMA // completion). // - am_hal_pdm_interrupt_enable(_PDMhandle, (AM_HAL_PDM_INT_DERR | AM_HAL_PDM_INT_DCMP | AM_HAL_PDM_INT_UNDFL | AM_HAL_PDM_INT_OVF)); - //am_hal_interrupt_master_enable(); + uint32_t ui32Status = 0x00; + am_hal_pdm_interrupt_status_get(pdm_handle, &ui32Status, false); + am_hal_pdm_interrupt_clear(pdm_handle, ui32Status); + am_hal_pdm_interrupt_enable(pdm_handle, (AM_HAL_PDM_INT_DERR | AM_HAL_PDM_INT_DCMP | AM_HAL_PDM_INT_UNDFL | AM_HAL_PDM_INT_OVF)); + am_hal_interrupt_master_enable(); NVIC_EnableIRQ(PDM_IRQn); - // Register the class into the local list + Serial.println("interrupts enabled"); + ap3_pdm_handle = this; + Serial.println("object registered"); + // Configure DMA and set target address of internal buffer. sTransfer.ui32TargetAddr = (uint32_t)_pdmDataBuffer; sTransfer.ui32TotalCount = _pdmBufferSize * 2; // Start the data transfer. - am_hal_pdm_enable(_PDMhandle); + am_hal_pdm_enable(pdm_handle); am_util_delay_ms(100); - am_hal_pdm_fifo_flush(_PDMhandle); - am_hal_pdm_dma_start(_PDMhandle, &sTransfer); + am_hal_pdm_fifo_flush(pdm_handle); + am_hal_pdm_dma_start(pdm_handle, &sTransfer); + + Serial.println("dma transfer started"); + Serial.println(retval); return retval; } @@ -230,9 +243,9 @@ uint32_t AP3_PDM::getDecimationRate() bool AP3_PDM::updateConfig(am_hal_pdm_config_t newConfiguration) { _PDMconfig = newConfiguration; - uint32_t retval = (uint32_t)am_hal_pdm_configure(_PDMhandle, &_PDMconfig); + uint32_t retval = (uint32_t)am_hal_pdm_configure(pdm_handle, &_PDMconfig); - am_hal_pdm_enable(_PDMhandle); //Reenable after changes + am_hal_pdm_enable(pdm_handle); //Reenable after changes if (retval != AP3_OK) { @@ -322,14 +335,8 @@ uint32_t AP3_PDM::getData(uint16_t *externalBuffer, uint32_t externalBufferSize) return (externalBufferSize); } -inline void AP3_PDM::pdm_isr(void) +inline void AP3_PDM::pdm_isr(uint32_t ui32Status) { - uint32_t ui32Status; - - // Read the interrupt status. - am_hal_pdm_interrupt_status_get(_PDMhandle, &ui32Status, true); - am_hal_pdm_interrupt_clear(_PDMhandle, ui32Status); - if (ui32Status & AM_HAL_PDM_INT_DCMP) { uint32_t tempReadAmt = _pdmBufferSize; @@ -389,7 +396,7 @@ inline void AP3_PDM::pdm_isr(void) } //Start next conversion - am_hal_pdm_dma_start(_PDMhandle, &sTransfer); + am_hal_pdm_dma_start(pdm_handle, &sTransfer); } } @@ -400,5 +407,12 @@ inline void AP3_PDM::pdm_isr(void) //***************************************************************************** extern "C" void am_pdm_isr(void) { - ap3_pdm_handle->pdm_isr(); + uint32_t ui32Status; + // Read the interrupt status. + am_hal_pdm_interrupt_status_get(pdm_handle, &ui32Status, true); + am_hal_pdm_interrupt_clear(pdm_handle, ui32Status); + + if(ap3_pdm_handle){ + ap3_pdm_handle->pdm_isr(ui32Status); + } } diff --git a/libraries/PDM/src/PDM.h b/libraries/PDM/src/PDM.h index 98a0bc7d..50b5ce2f 100644 --- a/libraries/PDM/src/PDM.h +++ b/libraries/PDM/src/PDM.h @@ -117,10 +117,9 @@ class AP3_PDM uint32_t getData(uint16_t *externalBuffer, uint32_t bufferSize); - void pdm_isr(void); + void pdm_isr(uint32_t ui32Status); private: - void *_PDMhandle; am_hal_pdm_config_t _PDMconfig; pin_size_t _pinPDMData; pin_size_t _pinPDMClock; diff --git a/platform.txt b/platform.txt index 18122780..365bd821 100644 --- a/platform.txt +++ b/platform.txt @@ -13,7 +13,7 @@ defines.arduino=-DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUIN defines.mbed=-DMBED_NO_GLOBAL_USING_DIRECTIVE defines.variant={build.defines} defines.extra= -defines.all={defines.variant} {defines.arduino} {defines.mbed} {defines.extra} -DCORDIO_ZERO_COPY_HCI +defines.all={defines.variant} {defines.arduino} {defines.mbed} {defines.extra} -DCORDIO_ZERO_COPY_HCI -DARM_MATH_CM4 defines.preproc={defines.all} defines.asm={defines.all} @{build.variant.path}/mbed/.asm-symbols defines.c={defines.all} @{build.variant.path}/mbed/.c-symbols @@ -29,7 +29,7 @@ includes.all={includes.core} {includes.mbed} {includes.variant} {includes.extra} # libraries libs.core=-Wl,--whole-archive {archive_file_path} -Wl,--no-whole-archive -libs.mbed={build.variant.path}/mbed/libmbed-os.a +libs.mbed={build.variant.path}/mbed/libmbed-os.a {build.variant.path}/lib/libarm_cortexM4l_math.a libs.variant={build.libs} libs.extra= libs.all={libs.core} {libs.mbed} {libs.variant} {libs.extra} @@ -42,11 +42,12 @@ compiler.warning_flags.more={compiler.warning_flags.default} compiler.warning_flags.all={compiler.warning_flags.default} -Wextra # flags +compiler.c_cxx_ld_common.flags=-mfloat-abi=softfp compiler.preproc.flags={compiler.cxx.flags} -w -x c++ -E -CC {compiler.preproc.extra_flags} compiler.asm.flags=-include {build.variant.path}/mbed/mbed_config.h -iprefix{runtime.platform.path}/cores/ @{build.variant.path}/mbed/.asm-flags {compiler.asm.extra_flags} -compiler.c.flags=-iprefix{runtime.platform.path}/cores/ @{build.variant.path}/mbed/.c-flags {compiler.c.extra_flags} -compiler.cxx.flags=-include {build.variant.path}/mbed/mbed_config.h -include {cores.path}/arduino/sdk/ArduinoSDK.h -iprefix{runtime.platform.path}/cores/ @{build.variant.path}/mbed/.cxx-flags {compiler.cxx.extra_flags} -compiler.ld.flags=@{build.variant.path}/mbed/.ld-flags {compiler.ld.extra_flags} --specs=nano.specs -lsupc++ -lstdc++ -lm +compiler.c.flags=-iprefix{runtime.platform.path}/cores/ @{build.variant.path}/mbed/.c-flags {compiler.c_cxx_ld_common.flags} {compiler.c.extra_flags} +compiler.cxx.flags=-include {build.variant.path}/mbed/mbed_config.h -include {cores.path}/arduino/sdk/ArduinoSDK.h -iprefix{runtime.platform.path}/cores/ @{build.variant.path}/mbed/.cxx-flags {compiler.c_cxx_ld_common.flags} {compiler.cxx.extra_flags} +compiler.ld.flags=@{build.variant.path}/mbed/.ld-flags {compiler.c_cxx_ld_common.flags} {compiler.ld.extra_flags} --specs=nano.specs -lsupc++ -lstdc++ -lm compiler.ar.flags=rcsP {compiler.ar.extra_flags} {compiler.ar.extra_flags} compiler.axf2bin.flags={compiler.axf2bin.extra_flags} {compiler.axf2bin.extra_flags} -O binary compiler.axf2hex.flags={compiler.axf2hex.extra_flags} {compiler.axf2hex.extra_flags} -O ihex diff --git a/variants/SFE_ARTEMIS/lib/libarm_cortexM4l_math.a b/variants/SFE_ARTEMIS/lib/libarm_cortexM4l_math.a new file mode 100644 index 00000000..3084c44e Binary files /dev/null and b/variants/SFE_ARTEMIS/lib/libarm_cortexM4l_math.a differ diff --git a/variants/SFE_ARTEMIS_ATP/lib/libarm_cortexM4l_math.a b/variants/SFE_ARTEMIS_ATP/lib/libarm_cortexM4l_math.a new file mode 100644 index 00000000..3084c44e Binary files /dev/null and b/variants/SFE_ARTEMIS_ATP/lib/libarm_cortexM4l_math.a differ diff --git a/variants/SFE_ARTEMIS_DK/lib/libarm_cortexM4l_math.a b/variants/SFE_ARTEMIS_DK/lib/libarm_cortexM4l_math.a new file mode 100644 index 00000000..3084c44e Binary files /dev/null and b/variants/SFE_ARTEMIS_DK/lib/libarm_cortexM4l_math.a differ diff --git a/variants/SFE_ARTEMIS_MM_PB/lib/libarm_cortexM4l_math.a b/variants/SFE_ARTEMIS_MM_PB/lib/libarm_cortexM4l_math.a new file mode 100644 index 00000000..3084c44e Binary files /dev/null and b/variants/SFE_ARTEMIS_MM_PB/lib/libarm_cortexM4l_math.a differ diff --git a/variants/SFE_ARTEMIS_NANO/lib/libarm_cortexM4l_math.a b/variants/SFE_ARTEMIS_NANO/lib/libarm_cortexM4l_math.a new file mode 100644 index 00000000..3084c44e Binary files /dev/null and b/variants/SFE_ARTEMIS_NANO/lib/libarm_cortexM4l_math.a differ diff --git a/variants/SFE_ARTEMIS_THING_PLUS/lib/libarm_cortexM4l_math.a b/variants/SFE_ARTEMIS_THING_PLUS/lib/libarm_cortexM4l_math.a new file mode 100644 index 00000000..3084c44e Binary files /dev/null and b/variants/SFE_ARTEMIS_THING_PLUS/lib/libarm_cortexM4l_math.a differ diff --git a/variants/SFE_EDGE/lib/libarm_cortexM4l_math.a b/variants/SFE_EDGE/lib/libarm_cortexM4l_math.a new file mode 100644 index 00000000..3084c44e Binary files /dev/null and b/variants/SFE_EDGE/lib/libarm_cortexM4l_math.a differ diff --git a/variants/SFE_EDGE2/lib/libarm_cortexM4l_math.a b/variants/SFE_EDGE2/lib/libarm_cortexM4l_math.a new file mode 100644 index 00000000..3084c44e Binary files /dev/null and b/variants/SFE_EDGE2/lib/libarm_cortexM4l_math.a differ