diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 663795e8..6086382f 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -2,10 +2,6 @@ name: CI on: push: - branches: - - master - - dev - - main pull_request: branches: - master diff --git a/source/Core/BSP/BSP_Power.h b/source/Core/BSP/BSP_Power.h index 348dc7a7..d37106f1 100644 --- a/source/Core/BSP/BSP_Power.h +++ b/source/Core/BSP/BSP_Power.h @@ -8,6 +8,8 @@ #ifndef BSP_POWER_H_ #define BSP_POWER_H_ +#include "Types.h" + #ifdef __cplusplus extern "C" { #endif @@ -22,6 +24,8 @@ uint8_t getTipResistanceX10(); uint16_t getTipThermalMass(); uint16_t getTipInertia(); +TemperatureType_t getCustomTipMaxInC(); + #ifdef __cplusplus } #endif diff --git a/source/Core/BSP/Pinecilv2/BSP.cpp b/source/Core/BSP/Pinecilv2/BSP.cpp index 59314453..e019407e 100644 --- a/source/Core/BSP/Pinecilv2/BSP.cpp +++ b/source/Core/BSP/Pinecilv2/BSP.cpp @@ -9,12 +9,15 @@ #include "TipThermoModel.h" #include "USBPD.h" #include "Utils.h" +#include "bl702_adc.h" #include "configuration.h" #include "crc32.h" #include "hal_flash.h" #include "history.hpp" #include "main.hpp" +extern ADC_Gain_Coeff_Type adcGainCoeffCal; + // These control the period's of time used for the PWM const uint16_t powerPWM = 255; uint8_t holdoffTicks = 25; // This is the tick delay before temp measure starts (i.e. time for op-amp recovery) @@ -31,52 +34,44 @@ void resetWatchdog() { // Stored as ADCReading,Temp in degC static const int32_t NTCHandleLookup[] = { // ADC Reading , Temp in C x10 - - 3221, -400, // - 4144, -350, // - 5271, -300, // - 6622, -250, // - 8219, -200, // - 10075, -150, // - 12190, -100, // - 14554, -50, // - 17151, 0, // - 19937, 50, // - 22867, 100, // - 25886, 150, // - 28944, 200, // - 29546, 210, // - 30159, 220, // - 30769, 230, // - 31373, 240, // - 31969, 250, // - 32566, 260, // - 33159, 270, // - 33749, 280, // - 34334, 290, // - 34916, 300, // - 35491, 310, // - 36062, 320, // - 36628, 330, // - 37186, 340, // - 37739, 350, // - 38286, 360, // - 38825, 370, // - 39358, 380, // - 39884, 390, // - 40400, 400, // - 42879, 450, // - 45160, 500, // - 47235, 550, // - 49111, 600, // - 50792, 650, // - 52292, 700, // - 53621, 750, // - 54797, 800, // - 55836, 850, // - 56748, 900, // - 57550, 950, // - 58257, 1000, // + // Based on NTCG163JF103FTDS thermocouple datasheet values, + // arranged in a voltage divider configuration, with the NTC + // pulling up towards 3.3V, and with a 10k 1% pull-down resistor. + // ADC Reading = 3.3V * 10 / (10 + TypkOhm) / 3.2V * (2 ^ 16) + 3405, -400, // + 4380, -350, // + 5572, -300, // + 6999, -250, // + 8688, -200, // + 10650, -150, // + 12885, -100, // + 15384, -50, // + 18129, 0, // + 21074, 50, // + 24172, 100, // + 27362, 150, // + 30595, 200, // + 33792, 250, // + 36907, 300, // + 39891, 350, // + 42704, 400, // + 45325, 450, // + 47736, 500, // + 49929, 550, // + 51912, 600, // + 53689, 650, // + 55274, 700, // + 56679, 750, // + 57923, 800, // + 59020, 850, // + 59984, 900, // + 60832, 950, // + 61580, 1000, // + 62232, 1050, // + 62810, 1100, // + 63316, 1150, // + 63765, 1200, // + 64158, 1250, // }; #endif @@ -282,3 +277,16 @@ void showBootLogo(void) { BootLogo::handleShowingLogo(scratch); } + +TemperatureType_t getCustomTipMaxInC() { + // have to lookup the max temp while being aware of the coe scaling value + float max_reading = ADC_MAX_READING - 1.0; + + if (adcGainCoeffCal.adcGainCoeffEnable) { + max_reading /= adcGainCoeffCal.coe; + } + + TemperatureType_t maximumTipTemp = TipThermoModel::convertTipRawADCToDegC(max_reading); + maximumTipTemp += getHandleTemperature(0) / 10; // Add handle offset + return maximumTipTemp - 1; +} \ No newline at end of file diff --git a/source/Core/BSP/Pinecilv2/FreeRTOSConfig.h b/source/Core/BSP/Pinecilv2/FreeRTOSConfig.h index 718036a6..f0005d77 100644 --- a/source/Core/BSP/Pinecilv2/FreeRTOSConfig.h +++ b/source/Core/BSP/Pinecilv2/FreeRTOSConfig.h @@ -52,8 +52,8 @@ extern "C" { header file. */ void vAssertCalled(void); -#define configASSERT(x) \ - if ((x) == 0) \ +#define configASSERT(x) \ + if ((x) == 0) \ vAssertCalled() #ifdef __cplusplus @@ -75,7 +75,7 @@ void vApplicationSleep(uint32_t xExpectedIdleTime); #define INCLUDE_xTaskGetCurrentTaskHandle 1 #define INCLUDE_uxTaskGetStackHighWaterMark 1 #define INCLUDE_xTaskGetIdleTaskHandle 1 -#define INCLUDE_eTaskGetState 0 +#define INCLUDE_eTaskGetState 1 #define INCLUDE_xEventGroupSetBitFromISR 1 #define INCLUDE_xTimerPendFunctionCall 0 #define INCLUDE_xTaskAbortDelay 0 diff --git a/source/Core/BSP/Pinecilv2/IRQ.cpp b/source/Core/BSP/Pinecilv2/IRQ.cpp index 7a857b18..1fbb4e1c 100644 --- a/source/Core/BSP/Pinecilv2/IRQ.cpp +++ b/source/Core/BSP/Pinecilv2/IRQ.cpp @@ -24,40 +24,48 @@ history ADC_Vin; history ADC_Temp; history ADC_Tip; -// IRQ is called at the end of the 8 set readings, pop these from the FIFO and send to filters -void adc_fifo_irq(void) { - if (ADC_GetIntStatus(ADC_INT_FIFO_READY) == SET) { - // Read out all entries in the fifo - while (ADC_Get_FIFO_Count()) { - uint32_t reading = ADC_Read_FIFO(); - // As per manual, 26 bit reading; lowest 16 are the ADC - uint16_t sample = reading & 0xFFFF; - uint8_t source = (reading >> 21) & 0b11111; - switch (source) { +void read_adc_fifo(void) { + // Read out all entries in the fifo + uint8_t pending_readings = ADC_Get_FIFO_Count(); + + // There _should_ always be 8 readings here. If there are not, it means that the adc didnt start when we wanted and timing slipped + // So if there isn't 8 readings, we throw them out + if (pending_readings != 8) { + MSG((char *)"Discarding out of sync adc %d\r\n", pending_readings); + } else { + while (pending_readings) { + pending_readings--; + uint32_t raw_reading = ADC_Read_FIFO(); + ADC_Result_Type parsed = {0, 0, 0}; + ADC_Parse_Result(&raw_reading, 1, &parsed); + // Rollover prevention + if (parsed.value > ((1 << 14) - 1)) { + parsed.value = ((1 << 14) - 1); + } + + switch (parsed.posChan) { case TMP36_ADC_CHANNEL: - ADC_Temp.update(sample); - break; - case TIP_TEMP_ADC_CHANNEL: - ADC_Tip.update(sample); + ADC_Temp.update(parsed.value << 2); break; + case TIP_TEMP_ADC_CHANNEL: { + ADC_Tip.update(parsed.value << 2); + } break; case VIN_ADC_CHANNEL: - ADC_Vin.update(sample); + ADC_Vin.update(parsed.value << 2); break; default: break; } } - // unblock the PID controller thread - if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) { - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - if (pidTaskNotification) { - vTaskNotifyGiveFromISR(pidTaskNotification, &xHigherPriorityTaskWoken); - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - } + } + // unblock the PID controller thread + if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) { + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + if (pidTaskNotification) { + vTaskNotifyGiveFromISR(pidTaskNotification, &xHigherPriorityTaskWoken); + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } } - // Clear IRQ - ADC_IntClr(ADC_INT_ALL); } volatile bool inFastPWMMode = false; @@ -69,7 +77,24 @@ volatile uint16_t PWMSafetyTimer = 0; volatile uint8_t pendingPWM = 0; volatile bool pendingNextPeriodIsFast = false; -void start_PWM_output(void) { +void timer0_comp0_callback(void) { + // Trigged at end of output cycle; turn off the tip PWM + PWM_Channel_Disable(PWM_Channel); + TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_0); +} + +// Timer 0 is used to co-ordinate the ADC and the output PWM +void timer0_comp1_callback(void) { + ADC_FIFO_Clear(); + ADC_Start(); + TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_1); +} +void timer0_comp2_callback(void) { + // Triggered at end of timer cycle; re-start the tip driver + ADC_Stop(); + TIMER_Disable(TIMER_CH0); + // Read the ADC data _now_. So that if things have gone out of sync, we know about it + read_adc_fifo(); if (PWMSafetyTimer) { PWMSafetyTimer--; @@ -82,64 +107,28 @@ void start_PWM_output(void) { } // Update trigger for the end point of the PWM cycle if (pendingPWM > 0) { - TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_1, pendingPWM - 1); + TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, pendingPWM - 1); // Turn on output PWM_Channel_Enable(PWM_Channel); } else { - // Leave output off PWM_Channel_Disable(PWM_Channel); } } else { PWM_Channel_Disable(PWM_Channel); - switchToFastPWM(); } -} - -// Timer 0 is used to co-ordinate the ADC and the output PWM -void timer0_comp0_callback(void) { - if (PWM_Channel_Is_Enabled(PWM_Channel)) { - // So there appears to be a bug _somewhere_ where sometimes the comparator doesn't fire - // Its not re-occurring with specific values, so suspect its a weird bug - // For now, we just skip the cycle and throw away the ADC readings. Its a waste but - // It stops stupid glitches in readings, i'd take slight instability from the time jump - // Over the readings we get that are borked as the header is left on - // - PWM_Channel_Disable(PWM_Channel); - // MSG("ALERT PWM Glitch\r\n"); - // Triger the PID now instead - if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) { - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - if (pidTaskNotification) { - vTaskNotifyGiveFromISR(pidTaskNotification, &xHigherPriorityTaskWoken); - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - } - } - } else { - ADC_Start(); - } - TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_0); -} -void timer0_comp1_callback(void) { - // Trigged at end of output cycle; turn off the tip PWM - PWM_Channel_Disable(PWM_Channel); - TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_1); -} - -void timer0_comp2_callback(void) { - // Triggered at end of timer cycle; re-start the tip driver - start_PWM_output(); + TIMER_Enable(TIMER_CH0); TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_2); } + void switchToFastPWM(void) { inFastPWMMode = true; - holdoffTicks = 10; + holdoffTicks = 20; tempMeasureTicks = 10; totalPWM = powerPWM + tempMeasureTicks + holdoffTicks; + + TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_1, powerPWM + holdoffTicks); + TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM); - - // ~10Hz - TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, powerPWM + holdoffTicks); - // Set divider to 10 ~= 10.5Hz uint32_t tmpVal = BL_RD_REG(TIMER_BASE, TIMER_TCDR); @@ -151,14 +140,14 @@ void switchToFastPWM(void) { void switchToSlowPWM(void) { // 5Hz inFastPWMMode = false; - holdoffTicks = 5; + holdoffTicks = 10; tempMeasureTicks = 5; totalPWM = powerPWM + tempMeasureTicks + holdoffTicks; - TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM); // Adjust ADC - TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, powerPWM + holdoffTicks); + TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_1, powerPWM + holdoffTicks); + TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM); // Set divider for ~ 5Hz uint32_t tmpVal = BL_RD_REG(TIMER_BASE, TIMER_TCDR); @@ -167,9 +156,11 @@ void switchToSlowPWM(void) { BL_WR_REG(TIMER_BASE, TIMER_TCDR, tmpVal); } + void setTipPWM(const uint8_t pulse, const bool shouldUseFastModePWM) { - PWMSafetyTimer = 10; // This is decremented in the handler for PWM so that the tip pwm is - // disabled if the PID task is not scheduled often enough. + PWMSafetyTimer = 10; + // This is decremented in the handler for PWM so that the tip pwm is + // disabled if the PID task is not scheduled often enough. pendingPWM = pulse; pendingNextPeriodIsFast = shouldUseFastModePWM; } diff --git a/source/Core/BSP/Pinecilv2/IRQ.h b/source/Core/BSP/Pinecilv2/IRQ.h index 4f6d6814..bc7dca72 100644 --- a/source/Core/BSP/Pinecilv2/IRQ.h +++ b/source/Core/BSP/Pinecilv2/IRQ.h @@ -19,7 +19,6 @@ extern "C" { void timer0_comp0_callback(void); void timer0_comp1_callback(void); void timer0_comp2_callback(void); -void adc_fifo_irq(void); void GPIO_IRQHandler(void); #ifdef __cplusplus } diff --git a/source/Core/BSP/Pinecilv2/Setup.cpp b/source/Core/BSP/Pinecilv2/Setup.cpp index 7e8ea542..f70068de 100644 --- a/source/Core/BSP/Pinecilv2/Setup.cpp +++ b/source/Core/BSP/Pinecilv2/Setup.cpp @@ -50,9 +50,10 @@ void hardware_init() { gpio_set_mode(OLED_RESET_Pin, GPIO_OUTPUT_MODE); gpio_set_mode(KEY_A_Pin, GPIO_INPUT_PD_MODE); gpio_set_mode(KEY_B_Pin, GPIO_INPUT_PD_MODE); - gpio_set_mode(TMP36_INPUT_Pin, GPIO_INPUT_MODE); - gpio_set_mode(TIP_TEMP_Pin, GPIO_INPUT_MODE); - gpio_set_mode(VIN_Pin, GPIO_INPUT_MODE); + + gpio_set_mode(TMP36_INPUT_Pin, GPIO_HZ_MODE); + gpio_set_mode(TIP_TEMP_Pin, GPIO_HZ_MODE); + gpio_set_mode(VIN_Pin, GPIO_HZ_MODE); gpio_set_mode(TIP_RESISTANCE_SENSE, GPIO_OUTPUT_MODE); gpio_write(TIP_RESISTANCE_SENSE, 0); @@ -66,7 +67,7 @@ void hardware_init() { // Note on I2C clock rate @ 100Khz the screen update == 20ms which is too long for USB-PD to work // 200kHz and above works I2C_ClockSet(I2C0_ID, 300000); // Sets clock to around 25 kHz less than set here - TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_1, 0); + TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, 0); } void setup_pwm(void) { // Setup PWM we use for driving the tip @@ -77,7 +78,7 @@ void setup_pwm(void) { PWM_POL_NORMAL, // Normal Polarity 60, // Clock Div 100, // Period - 0, // Thres 1 - start at beginng + 0, // Thres 1 - start at beginning 50, // Thres 2 - turn off at 50% 0, // Interrupt pulse count }; @@ -86,8 +87,8 @@ void setup_pwm(void) { PWM_Channel_Disable(PWM_Channel); } -const ADC_Chan_Type adc_tip_pos_chans[] = {TIP_TEMP_ADC_CHANNEL, TMP36_ADC_CHANNEL, TIP_TEMP_ADC_CHANNEL, VIN_ADC_CHANNEL, - TIP_TEMP_ADC_CHANNEL, TMP36_ADC_CHANNEL, TIP_TEMP_ADC_CHANNEL, VIN_ADC_CHANNEL}; +const ADC_Chan_Type adc_tip_pos_chans[] = {TMP36_ADC_CHANNEL, TIP_TEMP_ADC_CHANNEL, VIN_ADC_CHANNEL, TIP_TEMP_ADC_CHANNEL, + TMP36_ADC_CHANNEL, TIP_TEMP_ADC_CHANNEL, VIN_ADC_CHANNEL, TIP_TEMP_ADC_CHANNEL}; const ADC_Chan_Type adc_tip_neg_chans[] = {ADC_CHAN_GND, ADC_CHAN_GND, ADC_CHAN_GND, ADC_CHAN_GND, ADC_CHAN_GND, ADC_CHAN_GND, ADC_CHAN_GND, ADC_CHAN_GND}; static_assert(sizeof(adc_tip_pos_chans) == sizeof(adc_tip_neg_chans)); @@ -96,21 +97,55 @@ void setup_adc(void) { ADC_CFG_Type adc_cfg = {}; ADC_FIFO_Cfg_Type adc_fifo_cfg = {}; - CPU_Interrupt_Disable(GPADC_DMA_IRQn); + // Please also see PR #1529 for even more context - ADC_IntMask(ADC_INT_ALL, MASK); + /* + A note on ADC settings + + The bl70x ADC seems to be very sensitive to various analog settings. + It has been a challenge to determine what is the most correct way to + configure it in order to get accurate readings that can be transformed + into millivolts, for accurate measurements. + + This latest set of ADC parameters, matches the latest configuration from + the upstream bl_mcu_sdk repository from commit hash: + 9e189b69cbc0a75ffa170f600a28820848d56432 + except for one difference. + (Note: bl_mcu_sdk has been heavily refactored since it has been imported into IronOS.) + + You can make it match exactly by defining ENABLE_MIC2_DIFF, see the code + #ifdef ENABLE_MIC2_DIFF below. + I have decided to not apply this change because it appeared to make the + lower end of the input less precise. + + Note that this configuration uses an ADC trimming value that is stored in the Efuse + of the bl70x chip. The actual reading is divided by this "coe" value. + We have found the following coe values on 3 different chips: + 0.9629, 0.9438, 0.9876 + + Additional note for posterity: + PGA = programmable gain amplifier. + We would have expected to achieve the highest accuracy by disabling this amplifier, + however we found that not to be the case, and in almost all cases we have found + that there is a scaling error compared to the ideal Vref. + The only other configuration we have found to be accurate was if we had: + PGA disabled + Vref=2V + biasSel=AON + without trimming from the efuse. + But we can't use it because a Vref=2V limits the higher end of temperature and voltage readings. + Also we don't know if this other configuration is really accurate on all chips, or only + happened to be accurate on the one chip on which it has been found. + */ adc_cfg.clkDiv = ADC_CLK_DIV_4; adc_cfg.vref = ADC_VREF_3P2V; adc_cfg.resWidth = ADC_DATA_WIDTH_14_WITH_16_AVERAGE; adc_cfg.inputMode = ADC_INPUT_SINGLE_END; - adc_cfg.v18Sel = ADC_V18_SEL_1P72V; + adc_cfg.v18Sel = ADC_V18_SEL_1P82V; adc_cfg.v11Sel = ADC_V11_SEL_1P1V; - adc_cfg.gain1 = ADC_PGA_GAIN_NONE; - adc_cfg.gain2 = ADC_PGA_GAIN_NONE; - adc_cfg.chopMode = ADC_CHOP_MOD_AZ_ON; + adc_cfg.gain1 = ADC_PGA_GAIN_1; + adc_cfg.gain2 = ADC_PGA_GAIN_1; + adc_cfg.chopMode = ADC_CHOP_MOD_AZ_PGA_ON; adc_cfg.biasSel = ADC_BIAS_SEL_MAIN_BANDGAP; - adc_cfg.vcm = ADC_PGA_VCM_1P6V; + adc_cfg.vcm = ADC_PGA_VCM_1P2V; adc_cfg.offsetCalibEn = DISABLE; adc_cfg.offsetCalibVal = 0; @@ -119,16 +154,32 @@ void setup_adc(void) { ADC_Reset(); ADC_Init(&adc_cfg); +#ifdef ENABLE_MIC2_DIFF + // This is the change that enables MIC2_DIFF, for now deciding not to enable it, since it seems to make results slightly worse + { + uint32_t tmpVal; + tmpVal = BL_RD_REG(AON_BASE, AON_GPADC_REG_CMD); + tmpVal = BL_SET_REG_BITS_VAL(tmpVal, AON_GPADC_MIC2_DIFF, 1); + BL_WR_REG(AON_BASE, AON_GPADC_REG_CMD, tmpVal); + } +#endif + +#if 1 + // this sets the CVSP field (ADC conversion speed) + { + uint32_t regCfg2; + regCfg2 = BL_RD_REG(AON_BASE, AON_GPADC_REG_CONFIG2); + regCfg2 = BL_SET_REG_BITS_VAL(regCfg2, AON_GPADC_DLY_SEL, 0x02); + BL_WR_REG(AON_BASE, AON_GPADC_REG_CONFIG2, regCfg2); + } +#endif + adc_fifo_cfg.dmaEn = DISABLE; - adc_fifo_cfg.fifoThreshold = ADC_FIFO_THRESHOLD_8; // Triger FIFO when all 8 measurements are done + adc_fifo_cfg.fifoThreshold = ADC_FIFO_THRESHOLD_1; ADC_FIFO_Cfg(&adc_fifo_cfg); ADC_MIC_Bias_Disable(); ADC_Tsen_Disable(); - - // Enable FiFo IRQ - Interrupt_Handler_Register(GPADC_DMA_IRQn, adc_fifo_irq); - ADC_IntMask(ADC_INT_FIFO_READY, UNMASK); - CPU_Interrupt_Enable(GPADC_DMA_IRQn); + ADC_Gain_Trim(); ADC_Stop(); ADC_FIFO_Clear(); ADC_Scan_Channel_Config(adc_tip_pos_chans, adc_tip_neg_chans, sizeof(adc_tip_pos_chans) / sizeof(ADC_Chan_Type), DISABLE); @@ -143,10 +194,10 @@ void setup_timer_scheduler() { TIMER_PRELOAD_TRIG_COMP2, // Trigger; reset after trigger 0 TIMER_COUNT_PRELOAD, // Counter mode 22, // Clock div - (uint16_t)(powerPWM + holdoffTicks), // CH0 compare (adc) - (uint16_t)(powerPWM), // CH1 compare (pwm out) + (uint16_t)(powerPWM), // CH0 compare (pwm out) + (uint16_t)(powerPWM + holdoffTicks), // CH1 compare (adc) (uint16_t)(powerPWM + holdoffTicks + tempMeasureTicks), // CH2 compare end of cycle - 0, // Preload + 0, // Preload, copied to counter on trigger of comp2 }; TIMER_Init(&cfg); diff --git a/source/Core/BSP/Pinecilv2/bl_irq.c b/source/Core/BSP/Pinecilv2/bl_irq.c new file mode 100644 index 00000000..b8cda6f9 --- /dev/null +++ b/source/Core/BSP/Pinecilv2/bl_irq.c @@ -0,0 +1,29 @@ +#include "bl_irq.h" + +extern pFunc __Interrupt_Handlers[IRQn_LAST]; + +void bl_irq_enable(unsigned int source) { *(volatile uint8_t *)(CLIC_HART0_ADDR + CLIC_INTIE + source) = 1; } + +void bl_irq_disable(unsigned int source) { *(volatile uint8_t *)(CLIC_HART0_ADDR + CLIC_INTIE + source) = 0; } + +void bl_irq_pending_set(unsigned int source) { *(volatile uint8_t *)(CLIC_HART0_ADDR + CLIC_INTIP + source) = 1; } + +void bl_irq_pending_clear(unsigned int source) { *(volatile uint8_t *)(CLIC_HART0_ADDR + CLIC_INTIP + source) = 0; } + +void bl_irq_register(int irqnum, void *handler) { + if (irqnum < IRQn_LAST) { + __Interrupt_Handlers[irqnum] = handler; + } +} + +void bl_irq_unregister(int irqnum, void *handler) { + if (irqnum < IRQn_LAST) { + __Interrupt_Handlers[irqnum] = NULL; + } +} + +void bl_irq_handler_get(int irqnum, void **handler) { + if (irqnum < IRQn_LAST) { + *handler = __Interrupt_Handlers[irqnum]; + } +} diff --git a/source/Core/BSP/Pinecilv2/bl_irq.h b/source/Core/BSP/Pinecilv2/bl_irq.h new file mode 100644 index 00000000..5b79e255 --- /dev/null +++ b/source/Core/BSP/Pinecilv2/bl_irq.h @@ -0,0 +1,19 @@ +#ifndef __BL_IRQ_H__ +#define __BL_IRQ_H__ + + +#include "bl702_glb.h" +#include "risc-v/Core/Include/clic.h" +#include "risc-v/Core/Include/riscv_encoding.h" + + +void bl_irq_enable(unsigned int source); +void bl_irq_disable(unsigned int source); +void bl_irq_pending_set(unsigned int source); +void bl_irq_pending_clear(unsigned int source); +void bl_irq_register(int irqnum, void *handler); +void bl_irq_unregister(int irqnum, void *handler); +void bl_irq_handler_get(int irqnum, void **handler); + + +#endif diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/ReleaseNotes b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/ReleaseNotes index e55bbfb8..9b4041e7 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/ReleaseNotes +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/ReleaseNotes @@ -3,6 +3,34 @@ bl mcu sdk Release Notes 此文件包含 bl mcu sdk 软件开发包的发行说明。 每个版本的文字说明与发布时的说明保持一致(可能会有错别字的勘误)。 +bl mcu sdk Release V1.4.4 +---------------------------- + +新增功能说明: + 1. 增加 adc dma, uart dma p2p, at client, tensorflow vww demo + 2. boot2 更新 + 3. 删除 timer basic 和 dac_from_flash demo + 4. 更新 bflb flash tool 到 1.7.1 + 5. ble lib 更新,使用 t-head 10.2 工具链构建(小于此工具链版本编译将报错) + +修复问题说明: + 1. 修正 dma 相关命令宏,重命名 DMA_BURST_xBYTE 防止误导 + 2. 修正 readme 中相关编译命令 + +bl mcu sdk Release V1.4.3 +---------------------------- + +新增功能说明: + 1. 增加 pikascript 和 mac154 组件 + 2. 增加 ble pds 的 demo + 3. doc 缓存文件移出 + 4. 增加 cklink 和 jlink 在 eclipse 中的调试 + +修复问题说明: + 1. driver 更新 + 2. Os to O2 + 3. uart sig 选定功能后,对与其他 sig 使用相同功能进行调整 + bl mcu sdk Release V1.4.2 ---------------------------- diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/bsp/bsp_common/platform/cpp_new.cpp b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/bsp/bsp_common/platform/cpp_new.cpp new file mode 100644 index 00000000..ba2f1e08 --- /dev/null +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/bsp/bsp_common/platform/cpp_new.cpp @@ -0,0 +1,10 @@ +#include +#include + +void *operator new(size_t size) { return malloc(size); } + +void *operator new[](size_t size) { return malloc(size); } + +void operator delete(void *ptr) { free(ptr); } + +void operator delete[](void *ptr) { free(ptr); } \ No newline at end of file diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/common/misc/compiler/common.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/common/misc/compiler/common.h index c72036f9..7bed6f27 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/common/misc/compiler/common.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/common/misc/compiler/common.h @@ -12,12 +12,12 @@ #define BL_WR_BYTE(addr, val) ((*(volatile uint8_t *)(uintptr_t)(addr)) = (val)) #define BL_RDWD_FRM_BYTEP(p) ((p[3] << 24) | (p[2] << 16) | (p[1] << 8) | (p[0])) -#define BL_WRWD_TO_BYTEP(p, val) \ - { \ - p[0] = val & 0xff; \ - p[1] = (val >> 8) & 0xff; \ - p[2] = (val >> 16) & 0xff; \ - p[3] = (val >> 24) & 0xff; \ +#define BL_WRWD_TO_BYTEP(p, val) \ + { \ + p[0] = val & 0xff; \ + p[1] = (val >> 8) & 0xff; \ + p[2] = (val >> 16) & 0xff; \ + p[3] = (val >> 24) & 0xff; \ } /** * @brief Register access macro @@ -27,29 +27,29 @@ #define BL_RD_REG(addr, regname) BL_RD_WORD(addr + regname##_OFFSET) #define BL_WR_REG(addr, regname, val) BL_WR_WORD(addr + regname##_OFFSET, val) #define BL_SET_REG_BIT(val, bitname) ((val) | (1U << bitname##_POS)) -#define BL_CLR_REG_BIT(val, bitname) ((val)&bitname##_UMSK) -#define BL_GET_REG_BITS_VAL(val, bitname) (((val)&bitname##_MSK) >> bitname##_POS) -#define BL_SET_REG_BITS_VAL(val, bitname, bitval) (((val)&bitname##_UMSK) | ((uint32_t)(bitval) << bitname##_POS)) +#define BL_CLR_REG_BIT(val, bitname) ((val) & bitname##_UMSK) +#define BL_GET_REG_BITS_VAL(val, bitname) (((val) & bitname##_MSK) >> bitname##_POS) +#define BL_SET_REG_BITS_VAL(val, bitname, bitval) (((val) & bitname##_UMSK) | ((uint32_t)(bitval) << bitname##_POS)) #define BL_IS_REG_BIT_SET(val, bitname) (((val) & (1U << (bitname##_POS))) != 0) -#define BL_DRV_DUMMY \ - { \ - __ASM volatile("nop"); \ - __ASM volatile("nop"); \ - __ASM volatile("nop"); \ - __ASM volatile("nop"); \ +#define BL_DRV_DUMMY \ + { \ + __ASM volatile("nop"); \ + __ASM volatile("nop"); \ + __ASM volatile("nop"); \ + __ASM volatile("nop"); \ } /* Std driver attribute macro*/ #ifndef BFLB_USE_CUSTOM_LD_SECTIONS // #define ATTR_UNI_SYMBOL -#define ATTR_STRINGIFY(x) #x -#define ATTR_TOSTRING(x) ATTR_STRINGIFY(x) -#define ATTR_UNI_SYMBOL __FILE__ ATTR_TOSTRING(__LINE__) -#define ATTR_CLOCK_SECTION __attribute__((section(".sclock_rlt_code." ATTR_UNI_SYMBOL))) -#define ATTR_CLOCK_CONST_SECTION __attribute__((section(".sclock_rlt_const." ATTR_UNI_SYMBOL))) -#define ATTR_TCM_SECTION __attribute__((section(".tcm_code." ATTR_UNI_SYMBOL))) -#define ATTR_TCM_CONST_SECTION __attribute__((section(".tcm_const." ATTR_UNI_SYMBOL))) -// #define ATTR_DTCM_SECTION __attribute__((section(".tcm_data"))) +#define ATTR_STRINGIFY(x) #x +#define ATTR_TOSTRING(x) ATTR_STRINGIFY(x) +#define ATTR_UNI_SYMBOL __FILE__ ATTR_TOSTRING(__LINE__) +#define ATTR_CLOCK_SECTION __attribute__((section(".sclock_rlt_code." ATTR_UNI_SYMBOL))) +#define ATTR_CLOCK_CONST_SECTION __attribute__((section(".sclock_rlt_const." ATTR_UNI_SYMBOL))) +#define ATTR_TCM_SECTION __attribute__((section(".tcm_code." ATTR_UNI_SYMBOL))) +#define ATTR_TCM_CONST_SECTION __attribute__((section(".tcm_const." ATTR_UNI_SYMBOL))) +#define ATTR_DTCM_SECTION __attribute__((section(".tcm_data"))) #define ATTR_HSRAM_SECTION __attribute__((section(".hsram_code"))) #define ATTR_DMA_RAM_SECTION __attribute__((section(".system_ram"))) #define ATTR_NOCACHE_RAM_SECTION __attribute__((section(".nocache_ram"))) diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/bl702_rf/lib/libbl702_rf.a b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/bl702_rf/lib/libbl702_rf.a index eb99532e..dc37ffcd 100644 Binary files a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/bl702_rf/lib/libbl702_rf.a and b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/bl702_rf/lib/libbl702_rf.a differ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/bl_hci_wrapper/bl_hci_wrapper.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/bl_hci_wrapper/bl_hci_wrapper.c index 5778665e..81a1c69a 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/bl_hci_wrapper/bl_hci_wrapper.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/bl_hci_wrapper/bl_hci_wrapper.c @@ -11,8 +11,8 @@ *****************************************************************************************/ #include "bl_hci_wrapper.h" -#include "../common/include/errno.h" #include "byteorder.h" +#include "errno.h" #include "hci_driver.h" #include "hci_host.h" #include "hci_onchip.h" @@ -184,12 +184,14 @@ void bl_packet_to_host(uint8_t pkt_type, uint16_t src_id, uint8_t *param, uint8_ memcpy(buf_data, param, param_len); break; } +#if defined(CONFIG_BT_CONN) case BT_HCI_ACL_DATA: { prio = false; bt_buf_set_type(buf, BT_BUF_ACL_IN); tlt_len = bt_onchiphci_hanlde_rx_acl(param, buf_data); break; } +#endif default: { net_buf_unref(buf); return; @@ -213,15 +215,18 @@ void bl_trigger_queued_msg() { unsigned int lock = irq_lock(); if (k_queue_is_empty(&msg_queue)) { + irq_unlock(lock); break; } if (bt_buf_get_rx_avail_cnt() <= CONFIG_BT_RX_BUF_RSV_COUNT) { + irq_unlock(lock); break; } buf = bt_buf_get_rx(BT_BUF_ACL_IN, K_NO_WAIT); if (!buf) { + irq_unlock(lock); break; } @@ -249,7 +254,9 @@ static void bl_onchiphci_rx_packet_handler(uint8_t pkt_type, uint16_t src_id, ui buf = bt_buf_get_cmd_complete(K_FOREVER); bl_packet_to_host(pkt_type, src_id, param, param_len, buf); return; - } else if (pkt_type == BT_HCI_LE_EVT && param[0] == BT_HCI_EVT_LE_ADVERTISING_REPORT) { + } +#if defined(CONFIG_BT_OBSERVER) || defined(CONFIG_BT_CENTRAL) || defined(CONFIG_BT_ALLROLES) + else if (pkt_type == BT_HCI_LE_EVT && param[0] == BT_HCI_EVT_LE_ADVERTISING_REPORT) { if (bt_buf_get_rx_avail_cnt() <= CONFIG_BT_RX_BUF_RSV_COUNT) { BT_INFO("Discard adv report."); #if defined(BFLB_BLE_NOTIFY_ADV_DISCARDED) @@ -258,11 +265,12 @@ static void bl_onchiphci_rx_packet_handler(uint8_t pkt_type, uint16_t src_id, ui return; } buf = bt_buf_get_rx(BT_BUF_ACL_IN, K_NO_WAIT); - if (buf) { + if (buf) bl_packet_to_host(pkt_type, src_id, param, param_len, buf); - } return; - } else { + } +#endif /*(CONFIG_BT_OBSERVER || CONFIG_BT_CENTRAL || CONFIG_BT_ALLROLES)*/ + else { if (pkt_type != BT_HCI_ACL_DATA) { /* Using the reserved buf (CONFIG_BT_RX_BUF_RSV_COUNT) firstly. */ buf = bt_buf_get_rx(BT_BUF_ACL_IN, K_NO_WAIT); diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/bl_hci_wrapper/bl_hci_wrapper.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/bl_hci_wrapper/bl_hci_wrapper.h index 6d13fa9a..7f97f4d8 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/bl_hci_wrapper/bl_hci_wrapper.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/bl_hci_wrapper/bl_hci_wrapper.h @@ -1,26 +1,21 @@ #ifndef __BL_HCI_WRAPPER_H__ #define __BL_HCI_WRAPPER_H__ -#include "net/buf.h" #include "bluetooth.h" +#include "net/buf.h" struct rx_msg_struct { - uint8_t pkt_type; - uint16_t src_id; - uint8_t *param; - uint8_t param_len; + uint8_t pkt_type; + uint16_t src_id; + uint8_t *param; + uint8_t param_len; } __packed; -typedef enum { - DATA_TYPE_COMMAND = 1, - DATA_TYPE_ACL = 2, - DATA_TYPE_SCO = 3, - DATA_TYPE_EVENT = 4 -} serial_data_type_t; +typedef enum { DATA_TYPE_COMMAND = 1, DATA_TYPE_ACL = 2, DATA_TYPE_SCO = 3, DATA_TYPE_EVENT = 4 } serial_data_type_t; uint8_t bl_onchiphci_interface_init(void); -void bl_onchiphci_interface_deinit(void); -void bl_trigger_queued_msg(void); -int bl_onchiphci_send_2_controller(struct net_buf *buf); +void bl_onchiphci_interface_deinit(void); +void bl_trigger_queued_msg(void); +int bl_onchiphci_send_2_controller(struct net_buf *buf); #endif //__BL_CONTROLLER_H__ \ No newline at end of file diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/atomic_c.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/atomic_c.c index 34beb7ce..9f46a6e6 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/atomic_c.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/atomic_c.c @@ -17,9 +17,9 @@ * * (originally from x86's atomic.c) */ + #include "bl_port.h" -#include -#include +#include // #include // #include diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/buf.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/buf.c index bb3a5b54..b6951fe9 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/buf.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/buf.c @@ -28,6 +28,10 @@ #include "bl_hci_wrapper.h" #endif +#if (BFLB_STATIC_ALLOC_MEM) +#include "l2cap.h" +#endif + #if defined(CONFIG_NET_BUF_LOG) #define NET_BUF_DBG(fmt, ...) LOG_DBG("(%p) " fmt, k_current_get(), ##__VA_ARGS__) #define NET_BUF_ERR(fmt, ...) LOG_ERR(fmt, ##__VA_ARGS__) @@ -58,21 +62,41 @@ #if defined(BFLB_DYNAMIC_ALLOC_MEM) extern struct net_buf_pool hci_cmd_pool; extern struct net_buf_pool hci_rx_pool; +#if (BFLB_STATIC_ALLOC_MEM) +__attribute__((section(".tcm_data"))) u8_t hci_cmd_data_pool[CONFIG_BT_HCI_CMD_COUNT * BT_BUF_RX_SIZE]; +__attribute__((section(".tcm_data"))) u8_t hci_rx_data_pool[CONFIG_BT_RX_BUF_COUNT * BT_BUF_RX_SIZE]; +#endif #if defined(CONFIG_BT_CONN) extern struct net_buf_pool acl_tx_pool; extern struct net_buf_pool num_complete_pool; +#if (BFLB_STATIC_ALLOC_MEM) +__attribute__((section(".tcm_data"))) u8_t acl_tx_data_pool[CONFIG_BT_L2CAP_TX_BUF_COUNT * BT_L2CAP_BUF_SIZE(CONFIG_BT_L2CAP_TX_MTU)]; +__attribute__((section(".tcm_data"))) u8_t num_complete_data_pool[1 * BT_BUF_RX_SIZE]; +#endif #if CONFIG_BT_ATT_PREPARE_COUNT > 0 extern struct net_buf_pool prep_pool; +#if (BFLB_STATIC_ALLOC_MEM) +__attribute__((section(".tcm_data"))) u8_t prep_data_pool[CONFIG_BT_ATT_PREPARE_COUNT * BT_ATT_MTU]; +#endif #endif #if defined(CONFIG_BT_HCI_ACL_FLOW_CONTROL) extern struct net_buf_pool acl_in_pool; +#if (BFLB_STATIC_ALLOC_MEM) +__attribute__((section(".tcm_data"))) u8_t acl_in_data_pool[CONFIG_BT_ACL_RX_COUNT * ACL_IN_SIZE]; +#endif #endif #if CONFIG_BT_ATT_PREPARE_COUNT > 0 extern struct net_buf_pool frag_pool; +#if (BFLB_STATIC_ALLOC_MEM) +__attribute__((section(".tcm_data"))) u8_t frag_data_pool[CONFIG_BT_L2CAP_TX_FRAG_COUNT * FRAG_SIZE]; +#endif #endif #endif // CONFIG_BT_CONN #if defined(CONFIG_BT_DISCARDABLE_BUF_COUNT) extern struct net_buf_pool discardable_pool; +#if (BFLB_STATIC_ALLOC_MEM) +__attribute__((section(".tcm_data"))) u8_t discardable_data_pool[CONFIG_BT_DISCARDABLE_BUF_COUNT * BT_BUF_RX_SIZE]; +#endif #endif #ifdef CONFIG_BT_MESH extern struct net_buf_pool adv_buf_pool; @@ -130,16 +154,62 @@ extern struct net_buf_pool _net_buf_pool_list[]; #endif // BFLB_DYNAMIC_ALLOC_MEM #if defined(BFLB_DYNAMIC_ALLOC_MEM) -void net_buf_init(struct net_buf_pool *buf_pool, u16_t buf_count, size_t data_size, destroy_cb_t destroy) { +#if (BFLB_STATIC_ALLOC_MEM) +void net_buf_init(u8_t buf_type, struct net_buf_pool *buf_pool, u16_t buf_count, size_t data_size, destroy_cb_t destroy) +#else +void net_buf_init(struct net_buf_pool *buf_pool, u16_t buf_count, size_t data_size, destroy_cb_t destroy) +#endif +{ struct net_buf_pool_fixed *buf_fixed; - buf_pool->alloc = (struct net_buf_data_alloc *)k_malloc(sizeof(void *)); - buf_pool->alloc->alloc_data = (struct net_buf_pool_fixed *)k_malloc(sizeof(void *)); + buf_pool->alloc = (struct net_buf_data_alloc *)k_malloc(sizeof(struct net_buf_data_alloc)); + buf_pool->alloc->alloc_data = (struct net_buf_pool_fixed *)k_malloc(sizeof(struct net_buf_pool_fixed)); buf_fixed = (struct net_buf_pool_fixed *)buf_pool->alloc->alloc_data; - buf_pool->alloc->cb = &net_buf_fixed_cb; - buf_fixed->data_size = data_size; - buf_fixed->data_pool = (u8_t *)k_malloc(buf_count * data_size); + buf_pool->alloc->cb = &net_buf_fixed_cb; + buf_fixed->data_size = data_size; +#if (BFLB_STATIC_ALLOC_MEM) + switch (buf_type) { + case HCI_CMD: + buf_fixed->data_pool = hci_cmd_data_pool; + break; + case HCI_RX: + buf_fixed->data_pool = hci_rx_data_pool; + break; +#if defined(CONFIG_BT_CONN) + case ACL_TX: + buf_fixed->data_pool = acl_tx_data_pool; + break; + case NUM_COMPLETE: + buf_fixed->data_pool = num_complete_data_pool; + break; +#if CONFIG_BT_ATT_PREPARE_COUNT > 0 + case PREP: + buf_fixed->data_pool = prep_data_pool; + break; +#endif +#if defined(CONFIG_BT_HCI_ACL_FLOW_CONTROL) + case ACL_IN: + buf_fixed->data_pool = acl_in_data_pool; + break; +#endif +#if CONFIG_BT_L2CAP_TX_FRAG_COUNT > 0 + case FRAG: + buf_fixed->data_pool = frag_data_pool; + break; +#endif +#endif +#if defined(CONFIG_BT_DISCARDABLE_BUF_COUNT) + case DISCARDABLE: + buf_fixed->data_pool = discardable_data_pool; + break; +#endif + default: + break; + } +#else + buf_fixed->data_pool = (u8_t *)k_malloc(buf_count * data_size); +#endif buf_pool->__bufs = (struct net_buf *)k_malloc(buf_count * sizeof(struct net_buf)); buf_pool->buf_count = buf_count; buf_pool->uninit_count = buf_count; @@ -156,7 +226,9 @@ void net_buf_deinit(struct net_buf_pool *buf_pool) { bt_delete_queue((struct k_fifo *)(&(buf_pool->free))); struct net_buf_pool_fixed *buf_fixed = (struct net_buf_pool_fixed *)buf_pool->alloc->alloc_data; +#if !(BFLB_STATIC_ALLOC_MEM) k_free(buf_fixed->data_pool); +#endif k_free(buf_pool->__bufs); k_free(buf_pool->alloc->alloc_data); k_free(buf_pool->alloc); @@ -353,6 +425,12 @@ struct net_buf *net_buf_alloc_len(struct net_buf_pool *pool, size_t size, s32_t NET_BUF_DBG("%s():%d: pool %p size %zu timeout %d", func, line, pool, size, timeout); +#if (BFLB_BT_CO_THREAD) + extern struct k_thread co_thread_data; + if (k_is_current_thread(&co_thread_data)) + timeout = K_NO_WAIT; +#endif + /* We need to lock interrupts temporarily to prevent race conditions * when accessing pool->uninit_count. */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/net/buf.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/net/buf.h index b1b58fba..b6e4f774 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/net/buf.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/net/buf.h @@ -14,7 +14,7 @@ #include #include #include -#include "ble_config.h" +#include "../../port/include/ble_config.h" #ifdef __cplusplus extern "C" { @@ -66,6 +66,19 @@ extern "C" { .__buf = net_buf_data_##_name, \ } +#if (BFLB_STATIC_ALLOC_MEM) +enum { + HCI_CMD = 0, + HCI_RX, + NUM_COMPLETE, + ACL_IN, + DISCARDABLE, + ACL_TX, + FRAG, + PREP, + +}; +#endif /** @brief Simple network buffer representation. * * This is a simpler variant of the net_buf object (in fact net_buf uses @@ -827,7 +840,11 @@ extern const struct net_buf_data_cb net_buf_var_cb; #endif #if defined(BFLB_DYNAMIC_ALLOC_MEM) +#if (BFLB_STATIC_ALLOC_MEM) +void net_buf_init(u8_t buf_type, struct net_buf_pool *buf_pool, u16_t buf_count, size_t data_size, destroy_cb_t destroy); +#else void net_buf_init(struct net_buf_pool *buf_pool, u16_t buf_count, size_t data_size, destroy_cb_t destroy); +#endif void net_buf_deinit(struct net_buf_pool *buf_pool); #endif /** diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/zephyr/types.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/zephyr/types.h index 3b07e3b1..ac12b55b 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/zephyr/types.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/include/zephyr/types.h @@ -15,12 +15,12 @@ extern "C" { typedef signed char s8_t; typedef signed short s16_t; -typedef signed int s32_t; +typedef int32_t s32_t; typedef signed long long s64_t; typedef unsigned char u8_t; typedef unsigned short u16_t; -typedef unsigned int u32_t; +typedef uint32_t u32_t; typedef unsigned long long u64_t; #ifdef __cplusplus diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/log.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/log.c index 2f43ff2b..d81239ea 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/log.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/log.c @@ -22,7 +22,7 @@ const char *bt_hex_real(const void *buf, size_t len) { static const char hex[] = "0123456789abcdef"; #if defined(CONFIG_BT_DEBUG_MONITOR) - static char str[255]; + static char str[512]; #else static char str[128]; #endif diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/log.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/log.h index 74f9ec72..0ff18b6a 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/log.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/log.h @@ -21,8 +21,8 @@ #include #include "FreeRTOS.h" -#include "task.h" #include "FreeRTOSConfig.h" +#include "task.h" #ifdef __cplusplus extern "C" { @@ -38,16 +38,20 @@ extern "C" { #define LOG_LEVEL CONFIG_BT_LOG_LEVEL #endif -//LOG_MODULE_REGISTER(LOG_MODULE_NAME, LOG_LEVEL); +// LOG_MODULE_REGISTER(LOG_MODULE_NAME, LOG_LEVEL); #if defined(BFLB_BLE) #if defined(BL_MCU_SDK) -#define BT_DBG(fmt, ...) //bflb_platform_printf(fmt", %s\r\n", ##__VA_ARGS__, __func__) -#define BT_ERR(fmt, ...) bflb_platform_printf(fmt ", %s\r\n", ##__VA_ARGS__, __func__) +#define BT_DBG(fmt, ...) // bflb_platform_printf(fmt", %s\r\n", ##__VA_ARGS__, __func__) +#define BT_ERR(fmt, ...) bflb_platform_printf(fmt ", %s\r\n", ##__VA_ARGS__, __func__) +#define BT_WARN(fmt, ...) bflb_platform_printf(fmt ", %s\r\n", ##__VA_ARGS__, __func__) +#define BT_INFO(fmt, ...) // bflb_platform_printf(fmt", %s\r\n", ##__VA_ARGS__, __func__) #else -#define BT_DBG(fmt, ...) //printf(fmt", %s\r\n", ##__VA_ARGS__, __func__) -#define BT_ERR(fmt, ...) printf(fmt ", %s\r\n", ##__VA_ARGS__, __func__) +#define BT_DBG(fmt, ...) // printf(fmt", %s\r\n", ##__VA_ARGS__, __func__) +#define BT_ERR(fmt, ...) printf(fmt ", %s\r\n", ##__VA_ARGS__, __func__) +#define BT_WARN(fmt, ...) printf(fmt ", %s\r\n", ##__VA_ARGS__, __func__) +#define BT_INFO(fmt, ...) // printf(fmt", %s\r\n", ##__VA_ARGS__, __func__) #endif #if defined(CONFIG_BT_STACK_PTS) || defined(CONFIG_BT_MESH_PTS) @@ -56,14 +60,6 @@ extern "C" { #else #define BT_PTS(fmt, ...) printf(fmt "\r\n", ##__VA_ARGS__) #endif - -#endif -#if defined(BL_MCU_SDK) -#define BT_WARN(fmt, ...) bflb_platform_printf(fmt ", %s\r\n", ##__VA_ARGS__, __func__) -#define BT_INFO(fmt, ...) //bflb_platform_printf(fmt", %s\r\n", ##__VA_ARGS__, __func__) -#else -#define BT_WARN(fmt, ...) printf(fmt ", %s\r\n", ##__VA_ARGS__, __func__) -#define BT_INFO(fmt, ...) //printf(fmt", %s\r\n", ##__VA_ARGS__, __func__) #endif #else /*BFLB_BLE*/ @@ -89,17 +85,16 @@ extern "C" { #if defined(CONFIG_BT_ASSERT) #if defined(BFLB_BLE) -extern void vAssertCalled(void); -#define BT_ASSERT(cond) \ - if ((cond) == 0) \ - vAssertCalled() +extern void user_vAssertCalled(void); +#define BT_ASSERT(cond) \ + if ((cond) == 0) \ + user_vAssertCalled() #else -#define BT_ASSERT(cond) \ - if (!(cond)) { \ - BT_ASSERT_PRINT("assert: '" #cond \ - "' failed\n"); \ - BT_ASSERT_DIE(); \ - } +#define BT_ASSERT(cond) \ + if (!(cond)) { \ + BT_ASSERT_PRINT("assert: '" #cond "' failed\n"); \ + BT_ASSERT_DIE(); \ + } #endif /*BFLB_BLE*/ #else #if defined(BFLB_BLE) @@ -109,14 +104,10 @@ extern void vAssertCalled(void); #endif /*BFLB_BLE*/ #endif /* CONFIG_BT_ASSERT*/ -#define BT_HEXDUMP_DBG(_data, _length, _str) \ - LOG_HEXDUMP_DBG((const u8_t *)_data, _length, _str) +#define BT_HEXDUMP_DBG(_data, _length, _str) LOG_HEXDUMP_DBG((const u8_t *)_data, _length, _str) #if defined(BFLB_BLE) -static inline char *log_strdup(const char *str) -{ - return (char *)str; -} +static inline char *log_strdup(const char *str) { return (char *)str; } #endif /* NOTE: These helper functions always encodes into the same buffer storage. diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/poll.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/poll.c index 8dce95e2..40fe5dd9 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/poll.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/poll.c @@ -139,12 +139,23 @@ static inline void set_event_ready(struct k_poll_event *event, u32_t state) { event->state |= state; } -static bool polling_events(struct k_poll_event *events, int num_events, s32_t timeout, int *last_registered) { +#if (BFLB_BT_CO_THREAD) +static bool polling_events(struct k_poll_event *events, int num_events, int total_evt_array_cnt, s32_t timeout, int *last_registered) +#else +static bool polling_events(struct k_poll_event *events, int num_events, s32_t timeout, int *last_registered) +#endif +{ int rc; bool polling = true; unsigned int key; +#if (BFLB_BT_CO_THREAD) + for (int ii = 0; ii < total_evt_array_cnt; ii++) { + if (ii >= num_events && ii != total_evt_array_cnt - 1) + continue; +#else for (int ii = 0; ii < num_events; ii++) { +#endif u32_t state; key = irq_lock(); if (is_condition_met(&events[ii], &state)) { @@ -163,7 +174,12 @@ static bool polling_events(struct k_poll_event *events, int num_events, s32_t ti return polling; } -int k_poll(struct k_poll_event *events, int num_events, s32_t timeout) { +#if (BFLB_BT_CO_THREAD) +int k_poll(struct k_poll_event *events, int num_events, int total_evt_array_cnt, s32_t timeout, u8_t *to_process) +#else +int k_poll(struct k_poll_event *events, int num_events, s32_t timeout) +#endif +{ __ASSERT(events, "NULL events\n"); __ASSERT(num_events > 0, "zero events\n"); @@ -172,16 +188,32 @@ int k_poll(struct k_poll_event *events, int num_events, s32_t timeout) { bool polling = true; /* find events whose condition is already fulfilled */ +#if (BFLB_BT_CO_THREAD) + polling = polling_events(events, num_events, total_evt_array_cnt, timeout, &last_registered); +#else polling = polling_events(events, num_events, timeout, &last_registered); +#endif if (polling == false) { goto exit; } +#if (BFLB_BT_CO_THREAD) + if (timeout != K_NO_WAIT) +#endif + { + k_sem_take(&g_poll_sem, timeout); + last_registered = -1; +#if (BFLB_BT_CO_THREAD) + polling = polling_events(events, num_events, total_evt_array_cnt, timeout, &last_registered); +#else + polling_events(events, num_events, timeout, &last_registered); +#endif + } - k_sem_take(&g_poll_sem, timeout); - - last_registered = -1; - polling_events(events, num_events, timeout, &last_registered); +#if (BFLB_BT_CO_THREAD) + if (to_process) + *to_process = polling ? 0 : 1; +#endif exit: key = irq_lock(); clear_event_registrations(events, last_registered, key); diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/rpa.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/rpa.c index ef5d96c2..fab3edea 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/rpa.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/rpa.c @@ -10,9 +10,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include +#include #include -#include #include #include #include diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/rpa.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/rpa.h index dca68f15..148afc0b 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/rpa.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/rpa.h @@ -13,4 +13,4 @@ #include "hci_host.h" bool bt_rpa_irk_matches(const u8_t irk[16], const bt_addr_t *addr); -int bt_rpa_create(const u8_t irk[16], bt_addr_t *rpa); +int bt_rpa_create(const u8_t irk[16], bt_addr_t *rpa); diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc.c index e9281a59..c7b86bce 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc.c @@ -52,10 +52,11 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include "ecc.h" #include "../include/tinycrypt/ecc.h" -#include "../include/tinycrypt/ecc_platform_specific.h" -#include +#include "ecc_platform_specific.h" #include + /* IMPORTANT: Make sure a cryptographically-secure PRNG is set and the platform * has access to enough entropy in order to feed the PRNG regularly. */ #if default_RNG_defined @@ -752,9 +753,8 @@ int uECC_valid_point(const uECC_word_t *point, uECC_Curve curve) { curve->x_side(tmp2, point, curve); /* tmp2 = x^3 + ax + b */ /* Make sure that y^2 == x^3 + ax + b */ - if (uECC_vli_equal(tmp1, tmp2, num_words) != 0) { + if (uECC_vli_equal(tmp1, tmp2, num_words) != 0) return -3; - } return 0; } diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc_platform_specific.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc_platform_specific.c index f958eb95..261ca747 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc_platform_specific.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/ecc_platform_specific.c @@ -70,9 +70,8 @@ int default_CSPRNG(uint8_t *dest, unsigned int size) { /* input sanity check: */ - if (dest == (uint8_t *)0 || (size <= 0)) { + if (dest == (uint8_t *)0 || (size <= 0)) return 0; - } int fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC); if (fd == -1) { diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/hmac_prng.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/hmac_prng.c index 1c9971bd..3fe12044 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/hmac_prng.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/tinycrypt/source/hmac_prng.c @@ -87,12 +87,10 @@ static void update(TCHmacPrng_t prng, const uint8_t *data, unsigned int datalen, (void)tc_hmac_update(&prng->h, prng->v, sizeof(prng->v)); (void)tc_hmac_update(&prng->h, &separator0, sizeof(separator0)); - if (data && datalen) { + if (data && datalen) (void)tc_hmac_update(&prng->h, data, datalen); - } - if (additional_data && additional_datalen) { + if (additional_data && additional_datalen) (void)tc_hmac_update(&prng->h, additional_data, additional_datalen); - } (void)tc_hmac_final(prng->key, sizeof(prng->key), &prng->h); @@ -104,9 +102,8 @@ static void update(TCHmacPrng_t prng, const uint8_t *data, unsigned int datalen, (void)tc_hmac_update(&prng->h, prng->v, sizeof(prng->v)); (void)tc_hmac_final(prng->v, sizeof(prng->v), &prng->h); - if (data == 0 || datalen == 0) { + if (data == 0 || datalen == 0) return; - } /* configure the new prng key into the prng's instance of hmac */ tc_hmac_set_key(&prng->h, prng->key, sizeof(prng->key)); @@ -116,9 +113,8 @@ static void update(TCHmacPrng_t prng, const uint8_t *data, unsigned int datalen, (void)tc_hmac_update(&prng->h, prng->v, sizeof(prng->v)); (void)tc_hmac_update(&prng->h, &separator1, sizeof(separator1)); (void)tc_hmac_update(&prng->h, data, datalen); - if (additional_data && additional_datalen) { + if (additional_data && additional_datalen) (void)tc_hmac_update(&prng->h, additional_data, additional_datalen); - } (void)tc_hmac_final(prng->key, sizeof(prng->key), &prng->h); /* configure the new prng key into the prng's instance of hmac */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/work_q.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/work_q.c index 86d2285c..722c6f03 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/work_q.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/common/work_q.c @@ -24,10 +24,24 @@ struct k_work_q g_work_queue_main; static void k_work_submit_to_queue(struct k_work_q *work_q, struct k_work *work) { if (!atomic_test_and_set_bit(work->flags, K_WORK_STATE_PENDING)) { k_fifo_put(&work_q->fifo, work); +#if (BFLB_BT_CO_THREAD) + extern struct k_sem g_poll_sem; + k_sem_give(&g_poll_sem); +#endif } } #if defined(BFLB_BLE) +#if (BFLB_BT_CO_THREAD) +void handle_work_queue(void) { + struct k_work *work; + work = k_fifo_get(&g_work_queue_main.fifo, K_NO_WAIT); + + if (atomic_test_and_clear_bit(work->flags, K_WORK_STATE_PENDING)) { + work->handler(work); + } +} +#else static void work_queue_main(void *p1) { struct k_work *work; UNUSED(p1); @@ -47,6 +61,7 @@ int k_work_q_start(void) { k_fifo_init(&g_work_queue_main.fifo, 20); return k_thread_create(&work_q_thread, "work_q_thread", CONFIG_BT_WORK_QUEUE_STACK_SIZE, work_queue_main, CONFIG_BT_WORK_QUEUE_PRIO); } +#endif int k_work_init(struct k_work *work, k_work_handler_t handler) { ASSERT(work, "work is NULL"); @@ -170,9 +185,8 @@ s32_t k_delayed_work_remaining_get(struct k_delayed_work *work) { } void k_delayed_work_del_timer(struct k_delayed_work *work) { - if (NULL == work || NULL == work->timer.timer.hdl) { + if (NULL == work || NULL == work->timer.timer.hdl) return; - } k_timer_delete(&work->timer); work->timer.timer.hdl = NULL; diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/hci_onchip/hci_driver.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/hci_onchip/hci_driver.c index 47b1daf6..7cc42b9b 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/hci_onchip/hci_driver.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/hci_onchip/hci_driver.c @@ -14,8 +14,7 @@ // #include // #include // #include -#include -#include +#include #include #include @@ -51,11 +50,6 @@ static K_SEM_DEFINE(sem_prio_recv, 0, BT_UINT_MAX); #endif K_FIFO_DEFINE(recv_fifo); -#if (BFLB_BLE_CO_THREAD) -extern struct k_sem g_poll_sem; -static int recv_fifo_count = 0; -#endif - #if !defined(BFLB_BLE) struct k_thread prio_recv_thread_data; static BT_STACK_NOINIT(prio_recv_thread_stack, CONFIG_BT_CTLR_RX_PRIO_STACK_SIZE); @@ -280,35 +274,6 @@ static inline struct net_buf *process_hbuf(struct radio_pdu_node_rx *n) { #endif #if defined(BFLB_BLE) -#if (BFLB_BLE_CO_THREAD) -void co_rx_thread() { - struct net_buf *buf = NULL; - buf = net_buf_get(&recv_fifo, K_NO_WAIT); - if (buf) { - BT_DBG("Calling bt_recv(%p)", buf); - bt_recv(buf); - } -} - -void co_tx_rx_thread(void *p1) { - UNUSED(p1); - BT_DBG("using %s\n", __func__); - while (1) { - if (k_sem_count_get(&g_poll_sem) > 0) { - co_tx_thread(); - } - - if (recv_fifo_count > 0) { - recv_fifo_count--; - co_rx_thread(); - } - - k_sleep(portTICK_PERIOD_MS); - k_yield(); - } -} - -#else static void recv_thread(void *p1) { UNUSED(p1); #if defined(CONFIG_BT_HCI_ACL_FLOW_CONTROL) @@ -379,7 +344,6 @@ static void recv_thread(void *p1) { } } #endif -#endif #if !defined(BFLB_BLE) static int cmd_handle(struct net_buf *buf) { @@ -474,12 +438,11 @@ static int hci_driver_open(void) { hci_init(NULL); #endif #endif +#if (!BFLB_BT_CO_THREAD) k_fifo_init(&recv_fifo, 20); - +#endif #if defined(BFLB_BLE) -#if (BFLB_BLE_CO_THREAD) - k_thread_create(&recv_thread_data, "co_tx_rx_thread", CONFIG_BT_RX_STACK_SIZE, co_tx_rx_thread, K_PRIO_COOP(CONFIG_BT_RX_PRIO)); -#else +#if (!BFLB_BT_CO_THREAD) k_thread_create(&recv_thread_data, "recv_thread", CONFIG_BT_RX_STACK_SIZE /*K_THREAD_STACK_SIZEOF(recv_thread_stack)*/, recv_thread, K_PRIO_COOP(CONFIG_BT_RX_PRIO)); #endif #else @@ -493,8 +456,9 @@ static int hci_driver_open(void) { void hci_driver_enque_recvq(struct net_buf *buf) { net_buf_put(&recv_fifo, buf); -#if (BFLB_BLE_CO_THREAD) - recv_fifo_count++; +#if (BFLB_BT_CO_THREAD) + extern struct k_sem g_poll_sem; + k_sem_give(&g_poll_sem); #endif } diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/a2dp.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/a2dp.c deleted file mode 100644 index 6a7ddc1b..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/a2dp.c +++ /dev/null @@ -1,280 +0,0 @@ -/** @file - * @brief Advance Audio Distribution Profile. - */ - -/* - * Copyright (c) 2015-2016 Intel Corporation - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_DEBUG_A2DP) -#define LOG_MODULE_NAME bt_a2dp -#include "log.h" - -#include "a2dp-codec.h" -#include "a2dp_internal.h" -#include "avdtp_internal.h" -#include "conn_internal.h" -#include "hci_core.h" -#include "oi_codec_sbc.h" - -#define A2DP_NO_SPACE (-1) - -struct bt_a2dp { - struct bt_avdtp session; -}; - -typedef struct { - OI_CODEC_SBC_DECODER_CONTEXT decoder_context; - uint32_t context_data[CODEC_DATA_WORDS(SBC_MAX_CHANNELS, SBC_CODEC_FAST_FILTER_BUFFERS)]; - int16_t decode_buf[15 * SBC_MAX_SAMPLES_PER_FRAME * SBC_MAX_CHANNELS]; -} A2DP_SBC_DECODER; - -static A2DP_SBC_DECODER sbc_decoder; - -/* Connections */ -static struct bt_a2dp connection[CONFIG_BT_MAX_CONN]; -static struct bt_avdtp_stream stream[CONFIG_BT_MAX_CONN]; - -static struct bt_sdp_attribute a2dp_attrs[] = { - BT_SDP_NEW_SERVICE, - BT_SDP_LIST(BT_SDP_ATTR_SVCLASS_ID_LIST, BT_SDP_TYPE_SIZE_VAR(BT_SDP_SEQ8, 3), BT_SDP_DATA_ELEM_LIST({BT_SDP_TYPE_SIZE(BT_SDP_UUID16), BT_SDP_ARRAY_16(BT_SDP_AUDIO_SINK_SVCLASS)}, )), - BT_SDP_LIST(BT_SDP_ATTR_PROTO_DESC_LIST, BT_SDP_TYPE_SIZE_VAR(BT_SDP_SEQ8, 16), - BT_SDP_DATA_ELEM_LIST({BT_SDP_TYPE_SIZE_VAR(BT_SDP_SEQ8, 6), BT_SDP_DATA_ELEM_LIST({BT_SDP_TYPE_SIZE(BT_SDP_UUID16), BT_SDP_ARRAY_16(BT_SDP_PROTO_L2CAP)}, - {BT_SDP_TYPE_SIZE(BT_SDP_UINT16), BT_SDP_ARRAY_16(BT_L2CAP_PSM_AVDTP)}, )}, - {BT_SDP_TYPE_SIZE_VAR(BT_SDP_SEQ8, 6), - BT_SDP_DATA_ELEM_LIST({BT_SDP_TYPE_SIZE(BT_SDP_UUID16), BT_SDP_ARRAY_16(BT_L2CAP_PSM_AVDTP)}, {BT_SDP_TYPE_SIZE(BT_SDP_UINT16), BT_SDP_ARRAY_16(0x0102)}, )}, )), - BT_SDP_LIST(BT_SDP_ATTR_PROFILE_DESC_LIST, BT_SDP_TYPE_SIZE_VAR(BT_SDP_SEQ8, 8), - BT_SDP_DATA_ELEM_LIST({BT_SDP_TYPE_SIZE_VAR(BT_SDP_SEQ8, 6), BT_SDP_DATA_ELEM_LIST({BT_SDP_TYPE_SIZE(BT_SDP_UUID16), BT_SDP_ARRAY_16(BT_SDP_ADVANCED_AUDIO_SVCLASS)}, - {BT_SDP_TYPE_SIZE(BT_SDP_UINT16), BT_SDP_ARRAY_16(0x0102)}, )}, )), - BT_SDP_SERVICE_NAME("A2DP sink"), -}; - -static struct bt_sdp_record a2dp_rec = BT_SDP_RECORD(a2dp_attrs); - -struct bt_a2dp_endpoint endpoint_1; -struct bt_a2dp_endpoint endpoint_2; - -struct bt_a2dp_codec_sbc_params sbc_info; - -void bt_a2dp_set_sbc_codec_info() { - sbc_info.config[0] = - // Sampling Frequency - A2DP_SBC_SAMP_FREQ_48000 | A2DP_SBC_SAMP_FREQ_44100 | A2DP_SBC_SAMP_FREQ_32000 | A2DP_SBC_SAMP_FREQ_16000 | - // Channel Mode - A2DP_SBC_CH_MODE_JOINT | A2DP_SBC_CH_MODE_STREO | A2DP_SBC_CH_MODE_DUAL | A2DP_SBC_CH_MODE_MONO; - sbc_info.config[1] = - // Block Length - A2DP_SBC_BLK_LEN_16 | A2DP_SBC_BLK_LEN_12 | A2DP_SBC_BLK_LEN_8 | A2DP_SBC_BLK_LEN_4 | - // Subbands - A2DP_SBC_SUBBAND_8 | A2DP_SBC_SUBBAND_4 | - // Allocation Method - A2DP_SBC_ALLOC_MTHD_SNR | A2DP_SBC_ALLOC_MTHD_LOUDNESS; - sbc_info.min_bitpool = 2; - sbc_info.max_bitpool = 53; -} - -void a2d_reset(struct bt_a2dp *a2dp_conn) { (void)memset(a2dp_conn, 0, sizeof(struct bt_a2dp)); } - -void stream_reset(struct bt_avdtp_stream *stream_conn) { (void)memset(stream_conn, 0, sizeof(struct bt_avdtp_stream)); } - -struct bt_a2dp *get_new_connection(struct bt_conn *conn) { - int8_t i, free; - - free = A2DP_NO_SPACE; - - if (!conn) { - BT_ERR("Invalid Input (err: %d)", -EINVAL); - return NULL; - } - - /* Find a space */ - for (i = 0; i < CONFIG_BT_MAX_CONN; i++) { - if (connection[i].session.br_chan.chan.conn == conn) { - BT_DBG("Conn already exists"); - if (!connection[i].session.streams->chan.chan.conn) { - BT_DBG("Create AV stream"); - return &connection[i]; - } else { - BT_DBG("A2DP signal stream and AV stream already exists"); - return NULL; - } - } - - if (!connection[i].session.br_chan.chan.conn && free == A2DP_NO_SPACE) { - BT_DBG("Create signal stream"); - free = i; - } - } - - if (free == A2DP_NO_SPACE) { - BT_DBG("More connection cannot be supported"); - return NULL; - } - - /* Clean the memory area before returning */ - a2d_reset(&connection[free]); - stream_reset(&stream[free]); - connection[free].session.streams = &stream[free]; - - return &connection[free]; -} - -int a2dp_accept(struct bt_conn *conn, struct bt_avdtp **session) { - struct bt_a2dp *a2dp_conn; - - a2dp_conn = get_new_connection(conn); - if (!a2dp_conn) { - return -ENOMEM; - } - - *session = &(a2dp_conn->session); - BT_DBG("session: %p", &(a2dp_conn->session)); - - return 0; -} - -int a2dp_sbc_decode_init() { - OI_STATUS status = OI_CODEC_SBC_DecoderReset(&sbc_decoder.decoder_context, sbc_decoder.context_data, sizeof(sbc_decoder.context_data), 2, 2, false, false); - if (!OI_SUCCESS(status)) { - BT_ERR("decode init failed with error: %d\n", status); - return status; - } - - return 0; -} - -#if PCM_PRINTF -extern int16_t cool_edit[]; -extern uint32_t byte_index; -#endif -int a2dp_sbc_decode_process(uint8_t media_data[], uint16_t data_len) { - // remove media header, expose sbc frame - const OI_BYTE *data = media_data + 12 + 1; - OI_UINT32 data_size = data_len - 12 - 1; - - if (data_size <= 0) { - BT_ERR("empty packet\n"); - return -1; - } - - if (data[0] != 0x9c) { - BT_ERR("sbc frame syncword error \n"); - } - - OI_INT16 *pcm = sbc_decoder.decode_buf; - OI_UINT32 pcm_size = sizeof(sbc_decoder.decode_buf); - - OI_INT16 frame_count = OI_CODEC_SBC_FrameCount((OI_BYTE *)data, data_size); - BT_DBG("frame_count: %d\n", frame_count); - - for (int i = 0; i < frame_count; i++) { - OI_STATUS status = OI_CODEC_SBC_DecodeFrame(&sbc_decoder.decoder_context, &data, &data_size, pcm, &pcm_size); - if (!OI_SUCCESS(status)) { - BT_ERR("decoding failure with error: %d \n", status); - return -1; - } - -#if PCM_PRINTF - memcpy((OI_INT8 *)cool_edit + byte_index, pcm, pcm_size); - byte_index += pcm_size; -#endif - } - - return 0; -} - -/* Callback for incoming requests */ -static struct bt_avdtp_ind_cb cb_ind = { - /*TODO*/ -}; - -/* The above callback structures need to be packed and passed to AVDTP */ -static struct bt_avdtp_event_cb avdtp_cb = {.ind = &cb_ind, .accept = a2dp_accept}; - -int bt_a2dp_init(void) { - int err; - - /* Register event handlers with AVDTP */ - err = bt_avdtp_register(&avdtp_cb); - if (err < 0) { - BT_ERR("A2DP registration failed"); - return err; - } - - /* Register SDP record */ - err = bt_sdp_register_service(&a2dp_rec); - if (err < 0) { - BT_ERR("A2DP regist sdp record failed"); - return err; - } - - int reg_1 = bt_a2dp_register_endpoint(&endpoint_1, BT_A2DP_AUDIO, BT_A2DP_SINK); - int reg_2 = bt_a2dp_register_endpoint(&endpoint_2, BT_A2DP_AUDIO, BT_A2DP_SINK); - if (reg_1 || reg_2) { - BT_ERR("A2DP registration endpoint 1 failed"); - return err; - } - - bt_a2dp_set_sbc_codec_info(); - - err = a2dp_sbc_decode_init(); - if (err < 0) { - BT_ERR("sbc codec init failed"); - return err; - } - - BT_DBG("A2DP Initialized successfully."); - return 0; -} - -struct bt_a2dp *bt_a2dp_connect(struct bt_conn *conn) { - struct bt_a2dp *a2dp_conn; - int err; - - a2dp_conn = get_new_connection(conn); - if (!a2dp_conn) { - BT_ERR("Cannot allocate memory"); - return NULL; - } - - err = bt_avdtp_connect(conn, &(a2dp_conn->session)); - if (err < 0) { - /* If error occurs, undo the saving and return the error */ - a2d_reset(a2dp_conn); - BT_DBG("AVDTP Connect failed"); - return NULL; - } - - BT_DBG("Connect request sent"); - return a2dp_conn; -} - -int bt_a2dp_register_endpoint(struct bt_a2dp_endpoint *endpoint, uint8_t media_type, uint8_t role) { - int err; - - BT_ASSERT(endpoint); - - err = bt_avdtp_register_sep(media_type, role, &(endpoint->info)); - if (err < 0) { - return err; - } - - return 0; -} diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/a2dp_internal.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/a2dp_internal.h deleted file mode 100644 index 08e8b76b..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/a2dp_internal.h +++ /dev/null @@ -1,12 +0,0 @@ -/** @file - * @brief Advance Audio Distribution Profile Internal header. - */ - -/* - * Copyright (c) 2015-2016 Intel Corporation - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/* To be called when first SEP is being registered */ -int bt_a2dp_init(void); diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/att.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/att.c index 52f2ad92..fa41cc28 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/att.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/att.c @@ -8,12 +8,13 @@ #include #include -#include -#include #include #include #include +#include +#include + #include #include #include @@ -23,13 +24,15 @@ #define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_DEBUG_ATT) #include "log.h" -#include "att_internal.h" -#include "conn_internal.h" -#include "gatt_internal.h" #include "hci_core.h" + +#include "conn_internal.h" #include "l2cap_internal.h" #include "smp.h" +#include "att_internal.h" +#include "gatt_internal.h" + #define ATT_CHAN(_ch) CONTAINER_OF(_ch, struct bt_att, chan.chan) #define ATT_REQ(_node) CONTAINER_OF(_node, struct bt_att_req, node) @@ -283,9 +286,8 @@ static u8_t att_mtu_req(struct bt_att *att, struct net_buf *buf) { BT_DBG("Negotiated MTU %u", att->chan.rx.mtu); #if defined(BFLB_BLE_MTU_CHANGE_CB) - if (att->chan.chan.ops->mtu_changed) { + if (att->chan.chan.ops->mtu_changed) att->chan.chan.ops->mtu_changed(&(att->chan.chan), att->chan.rx.mtu); - } #endif return 0; @@ -366,7 +368,9 @@ static u8_t att_handle_rsp(struct bt_att *att, void *pdu, u16_t len, u8_t err) { func = att->req->func; att->req->func = NULL; - func(att->chan.chan.conn, err, pdu, len, att->req); + if (func) { + func(att->chan.chan.conn, err, pdu, len, att->req); + } /* Don't destroy if callback had reused the request */ if (!att->req->func) { @@ -828,9 +832,8 @@ static u8_t att_read_type_rsp(struct bt_att *att, struct bt_uuid *uuid, u16_t st } #if defined(CONFIG_BT_STACK_PTS) - if (event_flag == att_read_by_type_ind) { + if (event_flag == att_read_by_type_ind) BT_PTS("handle : [0x%04x]\r\n", data.rsp->data->handle); - } #endif (void)bt_l2cap_send_cb(conn, BT_L2CAP_CID_ATT, data.buf, att_rsp_sent, NULL); @@ -1491,9 +1494,8 @@ static int att_change_security(struct bt_conn *conn, u8_t err) { switch (err) { case BT_ATT_ERR_INSUFFICIENT_ENCRYPTION: - if (conn->sec_level >= BT_SECURITY_L2) { + if (conn->sec_level >= BT_SECURITY_L2) return -EALREADY; - } sec = BT_SECURITY_L2; break; case BT_ATT_ERR_AUTHENTICATION: @@ -1981,9 +1983,8 @@ static void bt_att_disconnected(struct bt_l2cap_chan *chan) { bt_gatt_disconnected(ch->chan.conn); #ifdef BFLB_BLE_PATCH_FREE_ALLOCATED_BUFFER_IN_OS - if (att->timeout_work.timer.timer.hdl) { + if (att->timeout_work.timer.timer.hdl) k_delayed_work_del_timer(&att->timeout_work); - } if (att->tx_queue._queue.hdl) { k_queue_free(&att->tx_queue._queue); @@ -1997,9 +1998,8 @@ static void bt_att_disconnected(struct bt_l2cap_chan *chan) { } #endif - if (att->tx_sem.sem.hdl) { + if (att->tx_sem.sem.hdl) k_sem_delete(&att->tx_sem); - } #endif } @@ -2030,7 +2030,14 @@ static void bt_att_encrypt_change(struct bt_l2cap_chan *chan, u8_t hci_status) { return; } +#if (BFLB_BT_CO_THREAD) + if (k_sem_take(&att->tx_sem, K_NO_WAIT) < 0) { + k_fifo_put(&att->tx_queue, att->req->buf); + return; + } +#else k_sem_take(&att->tx_sem, K_FOREVER); +#endif if (!att_is_connected(att)) { BT_WARN("Disconnected"); k_sem_give(&att->tx_sem); @@ -2100,8 +2107,12 @@ void bt_att_init(void) { #if CONFIG_BT_ATT_PREPARE_COUNT > 0 #if defined(BFLB_DYNAMIC_ALLOC_MEM) +#if (BFLB_STATIC_ALLOC_MEM) + net_buf_init(PREP, &prep_pool, CONFIG_BT_ATT_PREPARE_COUNT, BT_ATT_MTU, NULL); +#else net_buf_init(&prep_pool, CONFIG_BT_ATT_PREPARE_COUNT, BT_ATT_MTU, NULL); #endif +#endif #endif bt_gatt_init(); diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/att_internal.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/att_internal.h index 68fd8348..f591a8b8 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/att_internal.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/att_internal.h @@ -5,7 +5,7 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#include "conn_internal.h" + #define BT_ATT_DEFAULT_LE_MTU 23 #if BT_L2CAP_RX_MTU < CONFIG_BT_L2CAP_TX_MTU diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/avdtp_internal.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/avdtp_internal.h index 7825a6e4..e182689f 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/avdtp_internal.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/avdtp_internal.h @@ -7,9 +7,6 @@ */ #include -#include "l2cap.h" -#ifndef BLE_STACK_HOST_AVDTP_INTERNAL_H_ -#define BLE_STACK_HOST_AVDTP_INTERNAL_H_ /* @brief A2DP ROLE's */ #define A2DP_SRC_ROLE 0x00 @@ -176,5 +173,3 @@ int bt_avdtp_register_sep(uint8_t media_type, uint8_t role, /* AVDTP Discover Request */ int bt_avdtp_discover(struct bt_avdtp *session, struct bt_avdtp_discover_params *param); - -#endif \ No newline at end of file diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/conn.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/conn.c index 1e389fae..4e3a54cf 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/conn.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/conn.c @@ -17,24 +17,27 @@ #include #include -#include +#include + #include #include #include -#include + +#include #define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_DEBUG_CONN) #define LOG_MODULE_NAME bt_conn #include "log.h" -#include "att_internal.h" -#include "gatt_internal.h" #include "hci_core.h" + +#include "conn_internal.h" #include "keys.h" #include "l2cap_internal.h" #include "smp.h" -#include "conn_internal.h" +#include "att_internal.h" +#include "gatt_internal.h" #if defined(BFLB_BLE) #include "ble_config.h" @@ -155,12 +158,12 @@ static void notify_connected(struct bt_conn *conn) { } } - if (!conn->err) { + if (conn->type == BT_CONN_TYPE_LE && !conn->err) { bt_gatt_connected(conn); } } -static void notify_disconnected(struct bt_conn *conn) { +void notify_disconnected(struct bt_conn *conn) { struct bt_conn_cb *cb; #if defined(CONFIG_BT_BREDR) @@ -199,6 +202,16 @@ void notify_le_param_updated(struct bt_conn *conn) { } } +void notify_le_phy_updated(struct bt_conn *conn, u8_t tx_phy, u8_t rx_phy) { + struct bt_conn_cb *cb; + + for (cb = callback_list; cb; cb = cb->_next) { + if (cb->le_phy_updated) { + cb->le_phy_updated(conn, tx_phy, rx_phy); + } + } +} + bool le_param_req(struct bt_conn *conn, struct bt_le_conn_param *param) { struct bt_conn_cb *cb; @@ -312,7 +325,9 @@ static void conn_update_timeout(struct k_work *work) { if (conn->state == BT_CONN_DISCONNECTED) { bt_l2cap_disconnected(conn); +#if !defined(BFLB_BLE) notify_disconnected(conn); +#endif /* Release the reference we took for the very first * state transition. @@ -406,7 +421,7 @@ static struct bt_conn *conn_new(void) { #if defined(BFLB_BLE) bool le_check_valid_conn(void) { - size_t i; + int i; for (i = 0; i < ARRAY_SIZE(conns); i++) { if (atomic_get(&conns[i].ref)) { @@ -419,7 +434,7 @@ bool le_check_valid_conn(void) { #if defined(BFLB_HOST_ASSISTANT) void bt_notify_disconnected(void) { - size_t i; + int i; for (i = 0; i < ARRAY_SIZE(conns); i++) { if (atomic_get(&conns[i].ref)) { @@ -506,6 +521,7 @@ struct bt_conn *bt_conn_create_br(const bt_addr_t *peer, const struct bt_br_conn bt_conn_set_state(conn, BT_CONN_CONNECT); conn->role = BT_CONN_ROLE_MASTER; + bt_conn_unref(conn); return conn; } @@ -569,7 +585,7 @@ struct bt_conn *bt_conn_create_sco(const bt_addr_t *peer) { } struct bt_conn *bt_conn_lookup_addr_sco(const bt_addr_t *peer) { - size_t i; + int i; for (i = 0; i < ARRAY_SIZE(sco_conns); i++) { if (!atomic_get(&sco_conns[i].ref)) { @@ -589,7 +605,7 @@ struct bt_conn *bt_conn_lookup_addr_sco(const bt_addr_t *peer) { } struct bt_conn *bt_conn_lookup_addr_br(const bt_addr_t *peer) { - size_t i; + int i; for (i = 0; i < ARRAY_SIZE(conns); i++) { if (!atomic_get(&conns[i].ref)) { @@ -1269,10 +1285,21 @@ int bt_conn_send_cb(struct bt_conn *conn, struct net_buf *buf, bt_conn_tx_cb_t c tx_data(buf)->tx = NULL; } +#if (BFLB_BT_CO_THREAD) + if (k_is_current_thread(bt_get_co_thread())) + bt_conn_process_tx(conn, buf); + else + net_buf_put(&conn->tx_queue, buf); +#if defined(BFLB_BLE) + k_sem_give(&g_poll_sem); +#endif +#else // BFLB_BT_CO_THREAD + net_buf_put(&conn->tx_queue, buf); #if defined(BFLB_BLE) k_sem_give(&g_poll_sem); #endif +#endif // BFLB_BT_CO_THREAD return 0; } @@ -1446,9 +1473,8 @@ static void conn_cleanup(struct bt_conn *conn) { // k_queue_free(&conn->tx_notify._queue); conn->tx_queue._queue.hdl = NULL; // conn->tx_notify._queue.hdl = NULL; - if (conn->update_work.timer.timer.hdl) { + if (conn->update_work.timer.timer.hdl) k_delayed_work_del_timer(&conn->update_work); - } #endif } @@ -1485,7 +1511,12 @@ int bt_conn_prepare_events(struct k_poll_event events[]) { return ev_count; } -void bt_conn_process_tx(struct bt_conn *conn) { +#if (BFLB_BT_CO_THREAD) +void bt_conn_process_tx(struct bt_conn *conn, struct net_buf *tx_buf) +#else +void bt_conn_process_tx(struct bt_conn *conn) +#endif +{ struct net_buf *buf; BT_DBG("conn %p", conn); @@ -1495,9 +1526,15 @@ void bt_conn_process_tx(struct bt_conn *conn) { conn_cleanup(conn); return; } - +#if (BFLB_BT_CO_THREAD) + if (tx_buf) + buf = tx_buf; + else + buf = net_buf_get(&conn->tx_queue, K_NO_WAIT); +#else /* Get next ACL packet for connection */ buf = net_buf_get(&conn->tx_queue, K_NO_WAIT); +#endif BT_ASSERT(buf); if (!send_buf(conn, buf)) { net_buf_unref(buf); @@ -1676,7 +1713,7 @@ void bt_conn_set_state(struct bt_conn *conn, bt_conn_state_t state) { } struct bt_conn *bt_conn_lookup_handle(u16_t handle) { - size_t i; + int i; for (i = 0; i < ARRAY_SIZE(conns); i++) { if (!atomic_get(&conns[i].ref)) { @@ -1728,7 +1765,7 @@ int bt_conn_addr_le_cmp(const struct bt_conn *conn, const bt_addr_le_t *peer) { } struct bt_conn *bt_conn_lookup_addr_le(u8_t id, const bt_addr_le_t *peer) { - size_t i; + int i; for (i = 0; i < ARRAY_SIZE(conns); i++) { if (!atomic_get(&conns[i].ref)) { @@ -1748,7 +1785,7 @@ struct bt_conn *bt_conn_lookup_addr_le(u8_t id, const bt_addr_le_t *peer) { } struct bt_conn *bt_conn_lookup_state_le(const bt_addr_le_t *peer, const bt_conn_state_t state) { - size_t i; + int i; for (i = 0; i < ARRAY_SIZE(conns); i++) { if (!atomic_get(&conns[i].ref)) { @@ -1772,7 +1809,7 @@ struct bt_conn *bt_conn_lookup_state_le(const bt_addr_le_t *peer, const bt_conn_ } void bt_conn_foreach(int type, void (*func)(struct bt_conn *conn, void *data), void *data) { - size_t i; + int i; for (i = 0; i < ARRAY_SIZE(conns); i++) { if (!atomic_get(&conns[i].ref)) { @@ -1857,7 +1894,7 @@ int bt_conn_get_info(const struct bt_conn *conn, struct bt_conn_info *info) { int bt_conn_get_remote_dev_info(struct bt_conn_info *info) { int link_num = 0; - for (size_t i = 0; i < ARRAY_SIZE(conns); i++) { + for (int i = 0; i < ARRAY_SIZE(conns); i++) { if (!atomic_get(&conns[i].ref)) { continue; } @@ -2446,14 +2483,22 @@ int bt_conn_init(void) { #if defined(CONFIG_BT_SMP) int err; #endif - size_t i; + int i; #if defined(BFLB_BLE) #if defined(BFLB_DYNAMIC_ALLOC_MEM) +#if (BFLB_STATIC_ALLOC_MEM) + net_buf_init(ACL_TX, &acl_tx_pool, CONFIG_BT_L2CAP_TX_BUF_COUNT, BT_L2CAP_BUF_SIZE(CONFIG_BT_L2CAP_TX_MTU), NULL); +#else net_buf_init(&acl_tx_pool, CONFIG_BT_L2CAP_TX_BUF_COUNT, BT_L2CAP_BUF_SIZE(CONFIG_BT_L2CAP_TX_MTU), NULL); +#endif #if CONFIG_BT_L2CAP_TX_FRAG_COUNT > 0 +#if (BFLB_STATIC_ALLOC_MEM) + net_buf_init(FRAG, &frag_pool, CONFIG_BT_L2CAP_TX_FRAG_COUNT, FRAG_SIZE, NULL); +#else net_buf_init(&frag_pool, CONFIG_BT_L2CAP_TX_FRAG_COUNT, FRAG_SIZE, NULL); #endif +#endif #else // BFLB_DYNAMIC_ALLOC_MEM struct net_buf_pool num_complete_pool; struct net_buf_pool acl_tx_pool; diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/conn_internal.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/conn_internal.h index 180864e3..2ba9a9c8 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/conn_internal.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/conn_internal.h @@ -1,80 +1,65 @@ /** @file * @brief Internal APIs for Bluetooth connection handling. */ -#ifndef BLE_STACK_HOST_CONN_INTERNAL_H_ -#define BLE_STACK_HOST_CONN_INTERNAL_H_ -#include "addr.h" -#include "atomic.h" -#include "slist.h" -#include "types.h" -#include "work_q.h" -#include -#include -#include "conn.h" - - -#ifdef __cplusplus -extern "C" { -#endif /* * Copyright (c) 2015 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ typedef enum __packed { - BT_CONN_DISCONNECTED, - BT_CONN_CONNECT_SCAN, - BT_CONN_CONNECT_DIR_ADV, - BT_CONN_CONNECT, - BT_CONN_CONNECTED, - BT_CONN_DISCONNECT, + BT_CONN_DISCONNECTED, + BT_CONN_CONNECT_SCAN, + BT_CONN_CONNECT_DIR_ADV, + BT_CONN_CONNECT, + BT_CONN_CONNECTED, + BT_CONN_DISCONNECT, } bt_conn_state_t; /* bt_conn flags: the flags defined here represent connection parameters */ enum { - BT_CONN_AUTO_CONNECT, - BT_CONN_BR_LEGACY_SECURE, /* 16 digits legacy PIN tracker */ - BT_CONN_USER, /* user I/O when pairing */ - BT_CONN_BR_PAIRING, /* BR connection in pairing context */ - BT_CONN_BR_NOBOND, /* SSP no bond pairing tracker */ - BT_CONN_BR_PAIRING_INITIATOR, /* local host starts authentication */ - BT_CONN_CLEANUP, /* Disconnected, pending cleanup */ - BT_CONN_AUTO_PHY_UPDATE, /* Auto-update PHY */ - BT_CONN_SLAVE_PARAM_UPDATE, /* If slave param update timer fired */ - BT_CONN_SLAVE_PARAM_SET, /* If slave param were set from app */ - BT_CONN_SLAVE_PARAM_L2CAP, /* If should force L2CAP for CPUP */ - BT_CONN_FORCE_PAIR, /* Pairing even with existing keys. */ + BT_CONN_AUTO_CONNECT, + BT_CONN_BR_LEGACY_SECURE, /* 16 digits legacy PIN tracker */ + BT_CONN_USER, /* user I/O when pairing */ + BT_CONN_BR_PAIRING, /* BR connection in pairing context */ + BT_CONN_BR_NOBOND, /* SSP no bond pairing tracker */ + BT_CONN_BR_PAIRING_INITIATOR, /* local host starts authentication */ + BT_CONN_CLEANUP, /* Disconnected, pending cleanup */ + BT_CONN_AUTO_PHY_UPDATE, /* Auto-update PHY */ + BT_CONN_SLAVE_PARAM_UPDATE, /* If slave param update timer fired */ + BT_CONN_SLAVE_PARAM_SET, /* If slave param were set from app */ + BT_CONN_SLAVE_PARAM_L2CAP, /* If should force L2CAP for CPUP */ + BT_CONN_FORCE_PAIR, /* Pairing even with existing keys. */ - BT_CONN_AUTO_PHY_COMPLETE, /* Auto-initiated PHY procedure done */ - BT_CONN_AUTO_FEATURE_EXCH, /* Auto-initiated LE Feat done */ - BT_CONN_AUTO_VERSION_INFO, /* Auto-initiated LE version done */ + BT_CONN_AUTO_PHY_COMPLETE, /* Auto-initiated PHY procedure done */ + BT_CONN_AUTO_FEATURE_EXCH, /* Auto-initiated LE Feat done */ + BT_CONN_AUTO_VERSION_INFO, /* Auto-initiated LE version done */ - /* Total number of flags - must be at the end of the enum */ - BT_CONN_NUM_FLAGS, + /* Total number of flags - must be at the end of the enum */ + BT_CONN_NUM_FLAGS, }; struct bt_conn_le { - bt_addr_le_t dst; + bt_addr_le_t dst; - bt_addr_le_t init_addr; - bt_addr_le_t resp_addr; + bt_addr_le_t init_addr; + bt_addr_le_t resp_addr; - u16_t interval; - u16_t interval_min; - u16_t interval_max; + u16_t interval; + u16_t interval_min; + u16_t interval_max; - u16_t latency; - u16_t timeout; - u16_t pending_latency; - u16_t pending_timeout; + u16_t latency; + u16_t timeout; + u16_t pending_latency; + u16_t pending_timeout; - u8_t features[8]; + u8_t features[8]; - struct bt_keys *keys; + struct bt_keys *keys; #if defined(CONFIG_BT_STACK_PTS) - u8_t own_adder_type; + u8_t own_adder_type; #endif }; @@ -83,107 +68,107 @@ struct bt_conn_le { #define LMP_MAX_PAGES 2 struct bt_conn_br { - bt_addr_t dst; - u8_t remote_io_capa; - u8_t remote_auth; - u8_t pairing_method; - /* remote LMP features pages per 8 bytes each */ - u8_t features[LMP_MAX_PAGES][8]; + bt_addr_t dst; + u8_t remote_io_capa; + u8_t remote_auth; + u8_t pairing_method; + /* remote LMP features pages per 8 bytes each */ + u8_t features[LMP_MAX_PAGES][8]; - struct bt_keys_link_key *link_key; + struct bt_keys_link_key *link_key; }; struct bt_conn_sco { - /* Reference to ACL Connection */ - struct bt_conn *acl; - u16_t pkt_type; + /* Reference to ACL Connection */ + struct bt_conn *acl; + u16_t pkt_type; }; #endif struct bt_conn_iso { - /* Reference to ACL Connection */ - struct bt_conn *acl; - /* CIG ID */ - uint8_t cig_id; - /* CIS ID */ - uint8_t cis_id; + /* Reference to ACL Connection */ + struct bt_conn *acl; + /* CIG ID */ + uint8_t cig_id; + /* CIS ID */ + uint8_t cis_id; }; typedef void (*bt_conn_tx_cb_t)(struct bt_conn *conn, void *user_data); struct bt_conn_tx { - sys_snode_t node; + sys_snode_t node; - bt_conn_tx_cb_t cb; - void *user_data; + bt_conn_tx_cb_t cb; + void *user_data; - /* Number of pending packets without a callback after this one */ - u32_t pending_no_cb; + /* Number of pending packets without a callback after this one */ + u32_t pending_no_cb; }; struct bt_conn { - u16_t handle; - u8_t type; - u8_t role; + u16_t handle; + u8_t type; + u8_t role; - ATOMIC_DEFINE(flags, BT_CONN_NUM_FLAGS); + ATOMIC_DEFINE(flags, BT_CONN_NUM_FLAGS); - /* Which local identity address this connection uses */ - u8_t id; + /* Which local identity address this connection uses */ + u8_t id; #if defined(CONFIG_BT_SMP) || defined(CONFIG_BT_BREDR) - bt_security_t sec_level; - bt_security_t required_sec_level; - u8_t encrypt; + bt_security_t sec_level; + bt_security_t required_sec_level; + u8_t encrypt; #endif /* CONFIG_BT_SMP || CONFIG_BT_BREDR */ - /* Connection error or reason for disconnect */ - u8_t err; + /* Connection error or reason for disconnect */ + u8_t err; - bt_conn_state_t state; + bt_conn_state_t state; - u16_t rx_len; - struct net_buf *rx; + u16_t rx_len; + struct net_buf *rx; - /* Sent but not acknowledged TX packets with a callback */ - sys_slist_t tx_pending; - /* Sent but not acknowledged TX packets without a callback before - * the next packet (if any) in tx_pending. - */ - u32_t pending_no_cb; + /* Sent but not acknowledged TX packets with a callback */ + sys_slist_t tx_pending; + /* Sent but not acknowledged TX packets without a callback before + * the next packet (if any) in tx_pending. + */ + u32_t pending_no_cb; - /* Completed TX for which we need to call the callback */ - sys_slist_t tx_complete; - struct k_work tx_complete_work; + /* Completed TX for which we need to call the callback */ + sys_slist_t tx_complete; + struct k_work tx_complete_work; - /* Queue for outgoing ACL data */ - struct k_fifo tx_queue; + /* Queue for outgoing ACL data */ + struct k_fifo tx_queue; - /* Active L2CAP channels */ - sys_slist_t channels; + /* Active L2CAP channels */ + sys_slist_t channels; - atomic_t ref; + atomic_t ref; - /* Delayed work for connection update and other deferred tasks */ - struct k_delayed_work update_work; + /* Delayed work for connection update and other deferred tasks */ + struct k_delayed_work update_work; - union { - struct bt_conn_le le; + union { + struct bt_conn_le le; #if defined(CONFIG_BT_BREDR) - struct bt_conn_br br; - struct bt_conn_sco sco; + struct bt_conn_br br; + struct bt_conn_sco sco; #endif #if defined(CONFIG_BT_AUDIO) - struct bt_conn_iso iso; + struct bt_conn_iso iso; #endif - }; + }; #if defined(CONFIG_BT_REMOTE_VERSION) - struct bt_conn_rv { - u8_t version; - u16_t manufacturer; - u16_t subversion; - } rv; + struct bt_conn_rv { + u8_t version; + u16_t manufacturer; + u16_t subversion; + } rv; #endif }; @@ -193,19 +178,23 @@ void bt_conn_reset_rx_state(struct bt_conn *conn); void bt_conn_recv(struct bt_conn *conn, struct net_buf *buf, u8_t flags); /* Send data over a connection */ -int bt_conn_send_cb(struct bt_conn *conn, struct net_buf *buf, bt_conn_tx_cb_t cb, void *user_data); +int bt_conn_send_cb(struct bt_conn *conn, struct net_buf *buf, + bt_conn_tx_cb_t cb, void *user_data); -static inline int bt_conn_send(struct bt_conn *conn, struct net_buf *buf) { return bt_conn_send_cb(conn, buf, NULL, NULL); } +static inline int bt_conn_send(struct bt_conn *conn, struct net_buf *buf) +{ + return bt_conn_send_cb(conn, buf, NULL, NULL); +} /* Add a new LE connection */ struct bt_conn *bt_conn_add_le(u8_t id, const bt_addr_le_t *peer); /** Connection parameters for ISO connections */ struct bt_iso_create_param { - uint8_t id; - uint8_t num_conns; - struct bt_conn **conns; - struct bt_iso_chan **chans; + uint8_t id; + uint8_t num_conns; + struct bt_conn **conns; + struct bt_iso_chan **chans; }; /* Bind ISO connections parameters */ @@ -262,22 +251,27 @@ struct bt_conn *bt_conn_lookup_id(u8_t id); /* Look up a connection state. For BT_ADDR_LE_ANY, returns the first connection * with the specific state */ -struct bt_conn *bt_conn_lookup_state_le(const bt_addr_le_t *peer, const bt_conn_state_t state); +struct bt_conn *bt_conn_lookup_state_le(const bt_addr_le_t *peer, + const bt_conn_state_t state); /* Set connection object in certain state and perform action related to state */ void bt_conn_set_state(struct bt_conn *conn, bt_conn_state_t state); -int bt_conn_le_conn_update(struct bt_conn *conn, const struct bt_le_conn_param *param); +int bt_conn_le_conn_update(struct bt_conn *conn, + const struct bt_le_conn_param *param); void notify_remote_info(struct bt_conn *conn); void notify_le_param_updated(struct bt_conn *conn); +void notify_le_phy_updated(struct bt_conn *conn, u8_t tx_phy, u8_t rx_phy); + bool le_param_req(struct bt_conn *conn, struct bt_le_conn_param *param); #if defined(CONFIG_BT_SMP) /* rand and ediv should be in BT order */ -int bt_conn_le_start_encryption(struct bt_conn *conn, u8_t rand[8], u8_t ediv[2], const u8_t *ltk, size_t len); +int bt_conn_le_start_encryption(struct bt_conn *conn, u8_t rand[8], + u8_t ediv[2], const u8_t *ltk, size_t len); /* Notify higher layers that RPA was resolved */ void bt_conn_identity_resolved(struct bt_conn *conn); @@ -290,27 +284,41 @@ void bt_conn_security_changed(struct bt_conn *conn, enum bt_security_err err); /* Prepare a PDU to be sent over a connection */ #if defined(CONFIG_NET_BUF_LOG) -struct net_buf *bt_conn_create_pdu_timeout_debug(struct net_buf_pool *pool, size_t reserve, s32_t timeout, const char *func, int line); -#define bt_conn_create_pdu_timeout(_pool, _reserve, _timeout) bt_conn_create_pdu_timeout_debug(_pool, _reserve, _timeout, __func__, __LINE__) +struct net_buf *bt_conn_create_pdu_timeout_debug(struct net_buf_pool *pool, + size_t reserve, s32_t timeout, + const char *func, int line); +#define bt_conn_create_pdu_timeout(_pool, _reserve, _timeout) \ + bt_conn_create_pdu_timeout_debug(_pool, _reserve, _timeout, \ + __func__, __LINE__) -#define bt_conn_create_pdu(_pool, _reserve) bt_conn_create_pdu_timeout_debug(_pool, _reserve, K_FOREVER, __func__, __line__) +#define bt_conn_create_pdu(_pool, _reserve) \ + bt_conn_create_pdu_timeout_debug(_pool, _reserve, K_FOREVER, \ + __func__, __line__) #else -struct net_buf *bt_conn_create_pdu_timeout(struct net_buf_pool *pool, size_t reserve, s32_t timeout); +struct net_buf *bt_conn_create_pdu_timeout(struct net_buf_pool *pool, + size_t reserve, s32_t timeout); -#define bt_conn_create_pdu(_pool, _reserve) bt_conn_create_pdu_timeout(_pool, _reserve, K_FOREVER) +#define bt_conn_create_pdu(_pool, _reserve) \ + bt_conn_create_pdu_timeout(_pool, _reserve, K_FOREVER) #endif /* Prepare a PDU to be sent over a connection */ #if defined(CONFIG_NET_BUF_LOG) -struct net_buf *bt_conn_create_frag_timeout_debug(size_t reserve, s32_t timeout, const char *func, int line); +struct net_buf *bt_conn_create_frag_timeout_debug(size_t reserve, s32_t timeout, + const char *func, int line); -#define bt_conn_create_frag_timeout(_reserve, _timeout) bt_conn_create_frag_timeout_debug(_reserve, _timeout, __func__, __LINE__) +#define bt_conn_create_frag_timeout(_reserve, _timeout) \ + bt_conn_create_frag_timeout_debug(_reserve, _timeout, \ + __func__, __LINE__) -#define bt_conn_create_frag(_reserve) bt_conn_create_frag_timeout_debug(_reserve, K_FOREVER, __func__, __LINE__) +#define bt_conn_create_frag(_reserve) \ + bt_conn_create_frag_timeout_debug(_reserve, K_FOREVER, \ + __func__, __LINE__) #else struct net_buf *bt_conn_create_frag_timeout(size_t reserve, s32_t timeout); -#define bt_conn_create_frag(_reserve) bt_conn_create_frag_timeout(_reserve, K_FOREVER) +#define bt_conn_create_frag(_reserve) \ + bt_conn_create_frag_timeout(_reserve, K_FOREVER) #endif /* Initialize connection management */ @@ -320,8 +328,13 @@ int bt_conn_init(void); struct k_sem *bt_conn_get_pkts(struct bt_conn *conn); /* k_poll related helpers for the TX thread */ -int bt_conn_prepare_events(struct k_poll_event events[]); +int bt_conn_prepare_events(struct k_poll_event events[]); + +#if (BFLB_BT_CO_THREAD) +void bt_conn_process_tx(struct bt_conn *conn, struct net_buf *tx_buf); +#else void bt_conn_process_tx(struct bt_conn *conn); +#endif #if defined(BFLB_BLE) /** @brief Get connection handle for a connection. @@ -333,9 +346,3 @@ void bt_conn_process_tx(struct bt_conn *conn); */ int bt_hci_get_conn_handle(const struct bt_conn *conn, u16_t *conn_handle); #endif - -#ifdef __cplusplus -}; -#endif - -#endif //BLE_STACK_HOST_CONN_INTERNAL_H_ \ No newline at end of file diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/ecc.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/ecc.h index f740dc18..10514263 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/ecc.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/ecc.h @@ -8,17 +8,17 @@ /* @brief Container for public key callback */ struct bt_pub_key_cb { - /** @brief Callback type for Public Key generation. - * - * Used to notify of the local public key or that the local key is not - * available (either because of a failure to read it or because it is - * being regenerated). - * - * @param key The local public key, or NULL in case of no key. - */ - void (*func)(const u8_t key[64]); + /** @brief Callback type for Public Key generation. + * + * Used to notify of the local public key or that the local key is not + * available (either because of a failure to read it or because it is + * being regenerated). + * + * @param key The local public key, or NULL in case of no key. + */ + void (*func)(const u8_t key[64]); - struct bt_pub_key_cb *_next; + struct bt_pub_key_cb *_next; }; /* @brief Generate a new Public Key. diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/gatt.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/gatt.c index b972b7d6..43b82d8e 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/gatt.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/gatt.c @@ -18,11 +18,13 @@ #include #if defined(CONFIG_BT_GATT_CACHING) -#include -#include -#include #include #include + +#include + +#include +#include #endif /* CONFIG_BT_GATT_CACHING */ #include #include @@ -48,15 +50,18 @@ extern u8_t event_flag; #define LOG_MODULE_NAME bt_gatt #include "log.h" -#include "att_internal.h" -#include "conn_internal.h" -#include "gatt_internal.h" #include "hci_core.h" + +#include "conn_internal.h" #include "keys.h" #include "l2cap_internal.h" #include "settings.h" #include "smp.h" +#include "att_internal.h" + +#include "gatt_internal.h" + #define SC_TIMEOUT K_MSEC(10) #define CCC_STORE_DELAY K_SECONDS(1) @@ -72,6 +77,13 @@ struct ccc_store { #if defined(CONFIG_BT_GATT_CLIENT) static sys_slist_t subscriptions; +#if defined(BFLB_BLE_NOTIFY_ALL) +bt_notification_all_cb_t gatt_notify_all_cb; +#endif +#if defined(BFLB_BLE_DISCOVER_ONGOING) +uint8_t discover_ongoing = BT_GATT_ITER_STOP; +extern int bt_gatt_discover_continue(struct bt_conn *conn, struct bt_gatt_discover_params *params); +#endif #endif /* CONFIG_BT_GATT_CLIENT */ static const u16_t gap_appearance = CONFIG_BT_DEVICE_APPEARANCE; @@ -480,9 +492,8 @@ static u8_t gen_hash_m(const struct bt_gatt_attr *attr, void *user_data) { ssize_t len; u16_t value; - if (attr->uuid->type != BT_UUID_TYPE_16) { + if (attr->uuid->type != BT_UUID_TYPE_16) return BT_GATT_ITER_CONTINUE; - } u16 = (struct bt_uuid_16 *)attr->uuid; @@ -844,11 +855,9 @@ int service_change_test(struct bt_gatt_indicate_params *params, const struct bt_ params->data = &sc_range[0]; params->len = sizeof(sc_range); - if (bt_gatt_indicate(con, params)) { - /* No connections to indicate */ - return; - } + return bt_gatt_indicate(con, params); } + #endif #if defined(CONFIG_BT_SETTINGS_CCC_STORE_ON_WRITE) @@ -1686,7 +1695,7 @@ static u8_t match_uuid(const struct bt_gatt_attr *attr, void *user_data) { int bt_gatt_notify_cb(struct bt_conn *conn, struct bt_gatt_notify_params *params) { struct notify_data data; const struct bt_gatt_attr *attr; - u16_t handle = 0; + u16_t handle; __ASSERT(params, "invalid parameters\n"); __ASSERT(params->attr, "invalid parameters\n"); @@ -2067,11 +2076,18 @@ bool bt_gatt_is_subscribed(struct bt_conn *conn, const struct bt_gatt_attr *attr } #if defined(CONFIG_BT_GATT_CLIENT) +#if defined(BFLB_BLE_NOTIFY_ALL) +void bt_gatt_register_notification_callback(bt_notification_all_cb_t cb) { gatt_notify_all_cb = cb; } +#endif void bt_gatt_notification(struct bt_conn *conn, u16_t handle, const void *data, u16_t length) { struct bt_gatt_subscribe_params *params, *tmp; BT_DBG("handle 0x%04x length %u", handle, length); - +#if defined(BFLB_BLE_NOTIFY_ALL) + if (gatt_notify_all_cb) { + gatt_notify_all_cb(conn, handle, data, length); + } +#endif SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&subscriptions, params, tmp, node) { if (bt_conn_addr_le_cmp(conn, ¶ms->_peer) || handle != params->value_handle) { continue; @@ -2188,9 +2204,8 @@ int bt_gatt_exchange_mtu(struct bt_conn *conn, struct bt_gatt_exchange_params *p static void gatt_discover_next(struct bt_conn *conn, u16_t last_handle, struct bt_gatt_discover_params *params) { /* Skip if last_handle is not set */ - if (!last_handle) { + if (!last_handle) goto discover; - } /* Continue from the last found handle */ params->start_handle = last_handle; @@ -2207,12 +2222,19 @@ static void gatt_discover_next(struct bt_conn *conn, u16_t last_handle, struct b discover: /* Discover next range */ +#if defined(BFLB_BLE_DISCOVER_ONGOING) + if (!bt_gatt_discover_continue(conn, params)) { +#else if (!bt_gatt_discover(conn, params)) { +#endif return; } done: params->func(conn, NULL, params); +#if defined(BFLB_BLE_DISCOVER_ONGOING) + discover_ongoing = BT_GATT_ITER_STOP; +#endif } static void gatt_find_type_rsp(struct bt_conn *conn, u8_t err, const void *pdu, u16_t length, void *user_data) { @@ -2250,6 +2272,9 @@ static void gatt_find_type_rsp(struct bt_conn *conn, u8_t err, const void *pdu, attr.user_data = &value; if (params->func(conn, &attr, params) == BT_GATT_ITER_STOP) { +#if defined(BFLB_BLE_DISCOVER_ONGOING) + discover_ongoing = BT_GATT_ITER_STOP; +#endif return; } } @@ -2264,6 +2289,9 @@ static void gatt_find_type_rsp(struct bt_conn *conn, u8_t err, const void *pdu, return; done: params->func(conn, NULL, params); +#if defined(BFLB_BLE_DISCOVER_ONGOING) + discover_ongoing = BT_GATT_ITER_STOP; +#endif } static int gatt_find_type(struct bt_conn *conn, struct bt_gatt_discover_params *params) { @@ -2513,9 +2541,8 @@ static u16_t parse_characteristic(struct bt_conn *conn, const void *pdu, struct #if defined(CONFIG_BT_STACK_PTS) if (event_flag != gatt_discover_chara) { /* Skip if UUID is set but doesn't match */ - if (params->uuid && bt_uuid_cmp(&u.uuid, params->uuid)) { + if (params->uuid && bt_uuid_cmp(&u.uuid, params->uuid)) continue; - } } #else /* Skip if UUID is set but doesn't match */ @@ -2550,6 +2577,9 @@ static void gatt_read_type_rsp(struct bt_conn *conn, u8_t err, const void *pdu, if (err) { params->func(conn, NULL, params); +#if defined(BFLB_BLE_DISCOVER_ONGOING) + discover_ongoing = BT_GATT_ITER_STOP; +#endif return; } @@ -2560,6 +2590,9 @@ static void gatt_read_type_rsp(struct bt_conn *conn, u8_t err, const void *pdu, } if (!handle) { +#if defined(BFLB_BLE_DISCOVER_ONGOING) + discover_ongoing = BT_GATT_ITER_STOP; +#endif return; } @@ -2675,11 +2708,17 @@ static void gatt_read_group_rsp(struct bt_conn *conn, u8_t err, const void *pdu, if (err) { params->func(conn, NULL, params); +#if defined(BFLB_BLE_DISCOVER_ONGOING) + discover_ongoing = BT_GATT_ITER_STOP; +#endif return; } handle = parse_service(conn, pdu, params, length); if (!handle) { +#if defined(BFLB_BLE_DISCOVER_ONGOING) + discover_ongoing = BT_GATT_ITER_STOP; +#endif return; } @@ -2804,6 +2843,9 @@ static void gatt_find_info_rsp(struct bt_conn *conn, u8_t err, const void *pdu, attr->handle = handle; if (params->func(conn, attr, params) == BT_GATT_ITER_STOP) { +#if defined(BFLB_BLE_DISCOVER_ONGOING) + discover_ongoing = BT_GATT_ITER_STOP; +#endif return; } } @@ -2814,6 +2856,9 @@ static void gatt_find_info_rsp(struct bt_conn *conn, u8_t err, const void *pdu, done: params->func(conn, NULL, params); +#if defined(BFLB_BLE_DISCOVER_ONGOING) + discover_ongoing = BT_GATT_ITER_STOP; +#endif } static int gatt_find_info(struct bt_conn *conn, struct bt_gatt_discover_params *params) { @@ -2844,6 +2889,16 @@ int bt_gatt_discover(struct bt_conn *conn, struct bt_gatt_discover_params *param return -ENOTCONN; } +#if defined(BFLB_BLE_DISCOVER_ONGOING) + if (discover_ongoing != BT_GATT_ITER_STOP) { + return -EINPROGRESS; + } + discover_ongoing = BT_GATT_ITER_CONTINUE; + + return bt_gatt_discover_continue(conn, params); +} +int bt_gatt_discover_continue(struct bt_conn *conn, struct bt_gatt_discover_params *params) { +#endif switch (params->type) { case BT_GATT_DISCOVER_PRIMARY: case BT_GATT_DISCOVER_SECONDARY: @@ -3131,11 +3186,10 @@ static int gatt_exec_write(struct bt_conn *conn, struct bt_gatt_write_params *pa req = net_buf_add(buf, sizeof(*req)); #if defined(CONFIG_BT_STACK_PTS) - if (event_flag == gatt_cancel_write_req) { + if (event_flag == gatt_cancel_write_req) req->flags = BT_ATT_FLAG_CANCEL; - } else { + else req->flags = BT_ATT_FLAG_EXEC; - } #else req->flags = BT_ATT_FLAG_EXEC; #endif @@ -3514,9 +3568,8 @@ static int ccc_set(const char *name, size_t len_rd, settings_read_cb read_cb, vo #if defined(BFLB_BLE) err = bt_settings_get_bin(key, (u8_t *)ccc_store, CCC_STORE_MAX, &len); - if (err) { + if (err) return err; - } load.addr_with_id.id = id; load.addr_with_id.addr = addr; @@ -3797,9 +3850,8 @@ void bt_gatt_disconnected(struct bt_conn *conn) { #if defined(BFLB_BLE_MTU_CHANGE_CB) void bt_gatt_mtu_changed(struct bt_conn *conn, u16_t mtu) { - if (gatt_mtu_changed_cb) { + if (gatt_mtu_changed_cb) gatt_mtu_changed_cb(conn, (int)mtu); - } } void bt_gatt_register_mtu_callback(bt_gatt_mtu_changed_cb_t cb) { gatt_mtu_changed_cb = cb; } @@ -4062,9 +4114,8 @@ static int sc_set(const char *name, size_t len_rd, settings_read_cb read_cb, voi } err = bt_settings_get_bin(key, (u8_t *)cfg, sizeof(*cfg), NULL); - if (err) { + if (err) memset(cfg, 0, sizeof(*cfg)); - } return err; #else if (!name) { @@ -4230,3 +4281,22 @@ static int db_hash_commit(void) { SETTINGS_STATIC_HANDLER_DEFINE(bt_hash, "bt/hash", NULL, db_hash_set, db_hash_commit, NULL); #endif /*CONFIG_BT_GATT_CACHING */ #endif /* CONFIG_BT_SETTINGS */ + +#if defined(CONFIG_BT_GATT_DYNAMIC_DB) +uint16_t bt_gatt_get_last_handle(void) { + struct bt_gatt_service *last; + u16_t handle, last_handle; + + if (sys_slist_is_empty(&db)) { + handle = last_static_handle; + last_handle = handle; + goto last; + } + + last = SYS_SLIST_PEEK_TAIL_CONTAINER(&db, last, node); + handle = last->attrs[last->attr_count - 1].handle; + last_handle = handle; +last: + return last_handle; +} +#endif diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/hci_core.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/hci_core.c index bfcdc05b..5cce24c2 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/hci_core.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/hci_core.c @@ -45,12 +45,15 @@ #include "smp.h" #if defined(BFLB_BLE) #include "bl_hci_wrapper.h" +#include "ble_lib_api.h" #if defined(BL602) #include "bl602_hbn.h" #elif defined(BL702) #include "bl702_hbn.h" -#elif defined(BL606p) +#elif defined(BL606P) || defined(BL616) #include "bl606p_hbn.h" +#elif defined(BL808) // no bl808_hbn.h currently, comment it out temporarily +#include "bl808_hbn.h" #endif #include "work_q.h" #endif @@ -64,12 +67,18 @@ #define HCI_CMD_TIMEOUT K_SECONDS(10) +extern struct k_fifo recv_fifo; +extern struct k_work_q g_work_queue_main; /* Stacks for the threads */ #if !defined(CONFIG_BT_RECV_IS_RX_THREAD) static struct k_thread rx_thread_data; static K_THREAD_STACK_DEFINE(rx_thread_stack, CONFIG_BT_RX_STACK_SIZE); #endif -#if (!BFLB_BLE_CO_THREAD) +#if (BFLB_BT_CO_THREAD) +struct k_thread co_thread_data; +static void process_events(struct k_poll_event *ev, int count, int total_evt_array_cnt); +static void send_cmd(struct net_buf *tx_buf); +#else static struct k_thread tx_thread_data; #endif #if !defined(BFLB_BLE) @@ -139,6 +148,24 @@ volatile u8_t event_flag = 0; struct blhast_cb *host_assist_cb; #endif +#if (BFLB_BT_CO_THREAD) +#if defined(CONFIG_BT_CONN) +/* command FIFO + conn_change signal +tx queue + rxqueue + workQueue + MAX_CONN */ +#define EV_COUNT (4 + CONFIG_BT_MAX_CONN) +#else +/* command FIFO */ +#define EV_COUNT 2 +#endif +#else +#if defined(CONFIG_BT_CONN) +/* command FIFO + conn_change signal + MAX_CONN */ +#define EV_COUNT (2 + CONFIG_BT_MAX_CONN) +#else +/* command FIFO */ +#define EV_COUNT 1 +#endif +#endif // BFLB_BT_CO_THREAD + struct cmd_state_set { atomic_t *target; int bit; @@ -164,7 +191,9 @@ struct cmd_data { /** The state to update when command completes with success. */ struct cmd_state_set *state; - +#if (BFLB_BT_CO_THREAD) + uint8_t sync_state; +#endif /** Used by bt_hci_cmd_send_sync. */ struct k_sem *sync; }; @@ -184,7 +213,7 @@ struct acl_data { extern struct k_sem g_poll_sem; #endif -static struct cmd_data cmd_data[CONFIG_BT_HCI_CMD_COUNT]; +__attribute__((section(".tcm_data"))) static struct cmd_data cmd_data[CONFIG_BT_HCI_CMD_COUNT]; #define cmd(buf) (&cmd_data[net_buf_id(buf)]) #define acl(buf) ((struct acl_data *)net_buf_user_data(buf)) @@ -220,7 +249,9 @@ struct net_buf_pool discardable_pool; #endif #endif /*!defined(BFLB_DYNAMIC_ALLOC_MEM)*/ +#if defined CONFIG_BT_HFP extern bool hfp_codec_msbc; +#endif struct event_handler { u8_t event; @@ -373,6 +404,43 @@ int bt_hci_cmd_send(u16_t opcode, struct net_buf *buf) { return 0; } +#if (BFLB_BT_CO_THREAD) +struct k_thread *bt_get_co_thread(void) { return &co_thread_data; } + +static void bt_hci_sync_check(struct net_buf *buf) { + static struct k_poll_event events[EV_COUNT] = { + [0] = K_POLL_EVENT_STATIC_INITIALIZER(K_POLL_TYPE_FIFO_DATA_AVAILABLE, K_POLL_MODE_NOTIFY_ONLY, &g_work_queue_main.fifo, BT_EVENT_WORK_QUEUE), + [1] = K_POLL_EVENT_STATIC_INITIALIZER(K_POLL_TYPE_FIFO_DATA_AVAILABLE, K_POLL_MODE_NOTIFY_ONLY, &bt_dev.cmd_tx_queue, BT_EVENT_CMD_TX), + [EV_COUNT - 1] = K_POLL_EVENT_STATIC_INITIALIZER(K_POLL_TYPE_FIFO_DATA_AVAILABLE, K_POLL_MODE_NOTIFY_ONLY, &recv_fifo, BT_EVENT_RX_QUEUE), + }; + + uint32_t time_start = k_uptime_get_32(); + send_cmd(buf); + + while (1) { + int ev_count, err; + u8_t to_process = 0; + + events[0].state = K_POLL_STATE_NOT_READY; + events[1].state = K_POLL_STATE_NOT_READY; + events[EV_COUNT - 1].state = K_POLL_STATE_NOT_READY; + ev_count = 2; + + if (IS_ENABLED(CONFIG_BT_CONN)) { + ev_count += bt_conn_prepare_events(&events[2]); + } + err = k_poll(events, ev_count, EV_COUNT, K_NO_WAIT, &to_process); + BT_ASSERT(err == 0); + if (to_process) + process_events(events, ev_count, EV_COUNT); + + if ((cmd(buf)->sync_state == BT_CMD_SYNC_TX_DONE) || (k_uptime_get_32() - time_start) >= HCI_CMD_TIMEOUT) { + break; + } + } +} +#endif + #if defined(BFLB_HOST_ASSISTANT) extern void blhast_bt_reset(void); uint16_t hci_cmd_to_cnt = 0; @@ -380,6 +448,9 @@ uint16_t hci_cmd_to_cnt = 0; int bt_hci_cmd_send_sync(u16_t opcode, struct net_buf *buf, struct net_buf **rsp) { struct k_sem sync_sem; int err; +#if (BFLB_BT_CO_THREAD) + bool is_bt_co_thread = k_is_current_thread(&co_thread_data); +#endif if (!buf) { buf = bt_hci_cmd_create(opcode, 0); @@ -390,8 +461,19 @@ int bt_hci_cmd_send_sync(u16_t opcode, struct net_buf *buf, struct net_buf **rsp BT_DBG("buf %p opcode 0x%04x len %u", buf, opcode, buf->len); +#if (BFLB_BT_CO_THREAD) + if (is_bt_co_thread) { + cmd(buf)->sync_state = BT_CMD_SYNC_TX; + cmd(buf)->sync = NULL; + } else { + k_sem_init(&sync_sem, 0, 1); + cmd(buf)->sync = &sync_sem; + cmd(buf)->sync_state = BT_CMD_SYNC_NONE; + } +#else k_sem_init(&sync_sem, 0, 1); cmd(buf)->sync = &sync_sem; +#endif #if defined(BFLB_BLE) /*Assign a initial value to status in order to check if hci cmd timeout*/ @@ -401,6 +483,21 @@ int bt_hci_cmd_send_sync(u16_t opcode, struct net_buf *buf, struct net_buf **rsp /* Make sure the buffer stays around until the command completes */ net_buf_ref(buf); +#if (BFLB_BT_CO_THREAD) + if (is_bt_co_thread) + bt_hci_sync_check(buf); + else { + net_buf_put(&bt_dev.cmd_tx_queue, buf); +#if defined(BFLB_BLE) + k_sem_give(&g_poll_sem); +#endif + err = k_sem_take(&sync_sem, HCI_CMD_TIMEOUT); +#ifdef BFLB_BLE_PATCH_FREE_ALLOCATED_BUFFER_IN_OS + k_sem_delete(&sync_sem); +#endif + __ASSERT(err == 0, "k_sem_take failed with err %d", err); + } +#else net_buf_put(&bt_dev.cmd_tx_queue, buf); #if defined(BFLB_BLE) k_sem_give(&g_poll_sem); @@ -410,6 +507,7 @@ int bt_hci_cmd_send_sync(u16_t opcode, struct net_buf *buf, struct net_buf **rsp k_sem_delete(&sync_sem); #endif __ASSERT(err == 0, "k_sem_take failed with err %d", err); +#endif // #if (BFLB_BT_CO_THREAD) BT_DBG("opcode 0x%04x status 0x%02x", opcode, cmd(buf)->status); @@ -646,6 +744,10 @@ static int le_set_non_resolv_private_addr(u8_t id) { bt_addr_t nrpa; int err; + if (atomic_test_bit(bt_dev.flags, BT_DEV_SETTED_NON_RESOLV_ADDR)) { + return 0; + } + err = bt_rand(nrpa.val, sizeof(nrpa.val)); if (err) { return err; @@ -656,6 +758,19 @@ static int le_set_non_resolv_private_addr(u8_t id) { return set_random_address(&nrpa); } +int le_set_non_resolv_private_addr_ext(u8_t id, bt_addr_t *addr) { + bt_addr_t *nrpa = addr; + int err; + + err = bt_rand(nrpa->val, sizeof(nrpa->val)); + if (err) { + return err; + } + + nrpa->val[5] &= 0x3f; + atomic_clear_bit(bt_dev.flags, BT_DEV_RPA_VALID); + return set_random_address(nrpa); +} #endif #else @@ -1059,6 +1174,9 @@ static void hci_disconn_complete(struct net_buf *buf) { } #endif bt_conn_unref(conn); +#if defined(CONFIG_BT_BREDR) + notify_disconnected(conn); +#endif return; } @@ -1079,6 +1197,10 @@ static void hci_disconn_complete(struct net_buf *buf) { hci_release_conn_related_cmd(); #endif +#if defined(BFLB_BLE) + notify_disconnected(conn); +#endif + #if defined(CONFIG_BLE_RECONNECT_TEST) if (conn->role == BT_CONN_ROLE_MASTER) { struct bt_le_conn_param param = { @@ -1089,9 +1211,9 @@ static void hci_disconn_complete(struct net_buf *buf) { }; if (bt_conn_create_le(&conn->le.dst, ¶m)) { - printf("Reconnecting. \n"); + BT_DBG("Reconnecting. \n"); } else { - printf("Reconnect fail. \n"); + BT_DBG("Reconnect fail. \n"); } } #endif @@ -1177,7 +1299,7 @@ int bt_le_set_data_len(struct bt_conn *conn, u16_t tx_octets, u16_t tx_time) { return bt_hci_cmd_send(BT_HCI_OP_LE_SET_DATA_LEN, buf); } -int hci_le_set_phy(struct bt_conn *conn) { +int hci_le_set_phy(struct bt_conn *conn, uint8_t all_phys, uint8_t pref_tx_phy, uint8_t pref_rx_phy, uint8_t phy_opts) { struct bt_hci_cp_le_set_phy *cp; struct net_buf *buf; @@ -1188,16 +1310,15 @@ int hci_le_set_phy(struct bt_conn *conn) { cp = net_buf_add(buf, sizeof(*cp)); cp->handle = sys_cpu_to_le16(conn->handle); - cp->all_phys = 0U; - cp->tx_phys = BT_HCI_LE_PHY_PREFER_2M; - cp->rx_phys = BT_HCI_LE_PHY_PREFER_2M; - cp->phy_opts = BT_HCI_LE_PHY_CODED_ANY; - bt_hci_cmd_send(BT_HCI_OP_LE_SET_PHY, buf); + cp->all_phys = all_phys; + cp->tx_phys = pref_tx_phy; + cp->rx_phys = pref_rx_phy; + cp->phy_opts = phy_opts; - return 0; + return bt_hci_cmd_send(BT_HCI_OP_LE_SET_PHY, buf); } -int hci_le_set_default_phy(struct bt_conn *conn, u8_t default_phy) { +int hci_le_set_default_phy(u8_t default_phy) { struct bt_hci_cp_le_set_default_phy *cp; struct net_buf *buf; @@ -1390,11 +1511,10 @@ static void enh_conn_complete(struct bt_hci_evt_le_enh_conn_complete *evt) { if (IS_ENABLED(CONFIG_BT_PRIVACY)) { #if defined(BFLB_BLE_PATCH_DHKEY_CHECK_FAILED) - if (memcmp(&evt->local_rpa, BT_ADDR_ANY, sizeof(bt_addr_t))) { + if (memcmp(&evt->local_rpa, BT_ADDR_ANY, sizeof(bt_addr_t))) bt_addr_copy(&conn->le.resp_addr.a, &evt->local_rpa); - } else { + else bt_addr_copy(&conn->le.resp_addr.a, &bt_dev.random_addr.a); - } #else bt_addr_copy(&conn->le.resp_addr.a, &evt->local_rpa); #endif @@ -1433,11 +1553,10 @@ static void enh_conn_complete(struct bt_hci_evt_le_enh_conn_complete *evt) { if (IS_ENABLED(CONFIG_BT_PRIVACY)) { #if defined(BFLB_BLE_PATCH_DHKEY_CHECK_FAILED) - if (memcmp(&evt->local_rpa, BT_ADDR_ANY, sizeof(bt_addr_t))) { + if (memcmp(&evt->local_rpa, BT_ADDR_ANY, sizeof(bt_addr_t))) bt_addr_copy(&conn->le.init_addr.a, &evt->local_rpa); - } else { + else bt_addr_copy(&conn->le.init_addr.a, &bt_dev.random_addr.a); - } #else bt_addr_copy(&conn->le.init_addr.a, &evt->local_rpa); #endif @@ -1472,7 +1591,7 @@ static void enh_conn_complete(struct bt_hci_evt_le_enh_conn_complete *evt) { } if (IS_ENABLED(CONFIG_BT_AUTO_PHY_UPDATE) && BT_FEAT_LE_PHY_2M(bt_dev.le.features)) { - err = hci_le_set_phy(conn); + err = hci_le_set_phy(conn, 0U, BT_HCI_LE_PHY_PREFER_2M, BT_HCI_LE_PHY_PREFER_2M, BT_HCI_LE_PHY_CODED_ANY); if (!err) { atomic_set_bit(conn->flags, BT_CONN_AUTO_PHY_UPDATE); goto done; @@ -1554,7 +1673,7 @@ static void le_remote_feat_complete(struct net_buf *buf) { if (IS_ENABLED(CONFIG_BT_AUTO_PHY_UPDATE) && BT_FEAT_LE_PHY_2M(bt_dev.le.features) && BT_FEAT_LE_PHY_2M(conn->le.features)) { int err; - err = hci_le_set_phy(conn); + err = hci_le_set_phy(conn, 0U, BT_HCI_LE_PHY_PREFER_2M, BT_HCI_LE_PHY_PREFER_2M, BT_HCI_LE_PHY_CODED_ANY); if (!err) { atomic_set_bit(conn->flags, BT_CONN_AUTO_PHY_UPDATE); goto done; @@ -1617,6 +1736,8 @@ static void le_phy_update_complete(struct net_buf *buf) { BT_DBG("PHY updated: status: 0x%02x, tx: %u, rx: %u", evt->status, evt->tx_phy, evt->rx_phy); + notify_le_phy_updated(conn, evt->tx_phy, evt->rx_phy); + if (!IS_ENABLED(CONFIG_BT_AUTO_PHY_UPDATE) || !atomic_test_and_clear_bit(conn->flags, BT_CONN_AUTO_PHY_UPDATE)) { goto done; } @@ -1968,20 +2089,19 @@ static int accept_sco_conn(const bt_addr_t *bdaddr, struct bt_conn *sco_conn) { bt_addr_copy(&cp->bdaddr, bdaddr); cp->pkt_type = sco_conn->sco.pkt_type; - cp->tx_bandwidth = 0x00001f40; - cp->rx_bandwidth = 0x00001f40; + cp->tx_bandwidth = 0x00001f40; + cp->rx_bandwidth = 0x00001f40; + cp->max_latency = 0x0007; + cp->retrans_effort = 0x01; + cp->content_format = BT_VOICE_CVSD_16BIT; +#if defined CONFIG_BT_HFP if (!hfp_codec_msbc) { - cp->max_latency = 0x0007; - cp->retrans_effort = 0x01; - cp->content_format = BT_VOICE_CVSD_16BIT; - BT_DBG("eSCO air coding CVSD!"); - } else { cp->max_latency = 0x000d; cp->retrans_effort = 0x02; cp->content_format = BT_VOICE_MSBC_16BIT; BT_DBG("eSCO air coding mSBC!"); } - +#endif err = bt_hci_cmd_send_sync(BT_HCI_OP_ACCEPT_SYNC_CONN_REQ, buf, NULL); if (err) { return err; @@ -2548,6 +2668,22 @@ static int request_name(const bt_addr_t *addr, u8_t pscan, u16_t offset) { return bt_hci_cmd_send_sync(BT_HCI_OP_REMOTE_NAME_REQUEST, buf, NULL); } +bredr_name_callback name_callback = NULL; +int remote_name_req(const bt_addr_t *addr, bredr_name_callback cb) { + u8_t pscan = 0x01; + u16_t clock_offset = 0x00; + + name_callback = cb; + + return request_name(addr, pscan, clock_offset); +} + +void remote_name_complete(u8_t *name) { + if (name_callback) { + name_callback((const char *)name); + } +} + #define EIR_SHORT_NAME 0x08 #define EIR_COMPLETE_NAME 0x09 @@ -2749,6 +2885,11 @@ static void remote_name_request_complete(struct net_buf *buf) { int eir_len = 240; u8_t *eir; int i; + BT_DBG("remote name:%s", evt->name); + + if (evt->name) { + remote_name_complete(evt->name); + } result = get_result_slot(&evt->bdaddr, 0xff); if (!result) { @@ -3497,11 +3638,21 @@ static void hci_cmd_done(u16_t opcode, u8_t status, struct net_buf *buf) { atomic_set_bit_to(update->target, update->bit, update->val); } +#if (BFLB_BT_CO_THREAD) /* If the command was synchronous wake up bt_hci_cmd_send_sync() */ + if (cmd(buf)->sync || cmd(buf)->sync_state) { + cmd(buf)->status = status; + if (cmd(buf)->sync_state) + cmd(buf)->sync_state = BT_CMD_SYNC_TX_DONE; + else + k_sem_give(cmd(buf)->sync); + } +#else if (cmd(buf)->sync) { cmd(buf)->status = status; k_sem_give(cmd(buf)->sync); } +#endif // BFLB_BT_CO_THREAD } static void hci_cmd_complete(struct net_buf *buf) { @@ -3638,24 +3789,21 @@ static int start_le_scan_with_isrpa(u8_t scan_type, u16_t interval, u16_t window set_param.filter_policy = 0x00; if (IS_ENABLED(CONFIG_BT_PRIVACY)) { - if (addre_type == 1) { + if (addre_type == 1) err = le_set_private_addr(BT_ID_DEFAULT); - } else if (addre_type == 0) { + else if (addre_type == 0) err = le_set_non_resolv_private_addr(BT_ID_DEFAULT); - } if (err) { return err; } if (BT_FEAT_LE_PRIVACY(bt_dev.le.features)) { - if (addre_type == 2) { + if (addre_type == 2) set_param.addr_type = BT_ADDR_LE_PUBLIC; - } - if (addre_type == 1) { + if (addre_type == 1) set_param.addr_type = BT_HCI_OWN_ADDR_RPA_OR_RANDOM; - } else if (addre_type == 0) { + else if (addre_type == 0) set_param.addr_type = BT_ADDR_LE_RANDOM; - } } else { set_param.addr_type = BT_ADDR_LE_RANDOM; } @@ -3941,13 +4089,26 @@ static void hci_event(struct net_buf *buf) { net_buf_unref(buf); } -static void send_cmd(void) { +#if (BFLB_BT_CO_THREAD) +static void send_cmd(struct net_buf *tx_buf) +#else +static void send_cmd(void) +#endif +{ struct net_buf *buf; int err; +#if (BFLB_BT_CO_THREAD) + if (tx_buf) { + buf = tx_buf; + } else { + buf = net_buf_get(&bt_dev.cmd_tx_queue, K_NO_WAIT); + } +#else /* Get next command */ BT_DBG("calling net_buf_get"); buf = net_buf_get(&bt_dev.cmd_tx_queue, K_NO_WAIT); +#endif BT_ASSERT(buf); /* Wait until ncmd > 0 */ @@ -3976,24 +4137,61 @@ static void send_cmd(void) { } } -static void process_events(struct k_poll_event *ev, int count) { +#if (BFLB_BT_CO_THREAD) +static void handle_rx_queue(void) { + struct net_buf *buf = NULL; + buf = net_buf_get(&recv_fifo, K_NO_WAIT); + if (buf) { + BT_DBG("Calling bt_recv(%p)", buf); + bt_recv(buf); + } +} +#endif + +#if (BFLB_BT_CO_THREAD) +static void process_events(struct k_poll_event *ev, int count, int total_evt_array_cnt) +#else +static void process_events(struct k_poll_event *ev, int count) +#endif +{ BT_DBG("count %d", count); - +#if (BFLB_BT_CO_THREAD) + for (int ii = 0; ii < total_evt_array_cnt; ev++, ii++) { + if (ii >= count && ii != total_evt_array_cnt - 1) + continue; +#else for (; count; ev++, count--) { +#endif BT_DBG("ev->state %u", ev->state); - switch (ev->state) { case K_POLL_STATE_SIGNALED: break; case K_POLL_STATE_FIFO_DATA_AVAILABLE: if (ev->tag == BT_EVENT_CMD_TX) { +#if (BFLB_BT_CO_THREAD) + send_cmd(NULL); +#else send_cmd(); - } else if (IS_ENABLED(CONFIG_BT_CONN)) { +#endif + } +#if (BFLB_BT_CO_THREAD) + else if (ev->tag == BT_EVENT_RX_QUEUE) { + handle_rx_queue(); + } else if (ev->tag == BT_EVENT_WORK_QUEUE) { + extern void handle_work_queue(void); + handle_work_queue(); + } +#endif + else if (IS_ENABLED(CONFIG_BT_CONN)) { struct bt_conn *conn; if (ev->tag == BT_EVENT_CONN_TX_QUEUE) { conn = CONTAINER_OF(ev->fifo, struct bt_conn, tx_queue); +#if (BFLB_BT_CO_THREAD) + bt_conn_process_tx(conn, NULL); +#else bt_conn_process_tx(conn); +#endif } } break; @@ -4006,36 +4204,46 @@ static void process_events(struct k_poll_event *ev, int count) { } } -#if defined(CONFIG_BT_CONN) -/* command FIFO + conn_change signal + MAX_CONN */ -#define EV_COUNT (2 + CONFIG_BT_MAX_CONN) -#else -/* command FIFO */ -#define EV_COUNT 1 -#endif - -#if defined(BFLB_BLE) -#if (BFLB_BLE_CO_THREAD) -void co_tx_thread() { +#if (BFLB_BT_CO_THREAD) +static void bt_co_thread(void *p1, void *p2, void *p3) { static struct k_poll_event events[EV_COUNT] = { - K_POLL_EVENT_STATIC_INITIALIZER(K_POLL_TYPE_FIFO_DATA_AVAILABLE, K_POLL_MODE_NOTIFY_ONLY, &bt_dev.cmd_tx_queue, BT_EVENT_CMD_TX), + + [0] = K_POLL_EVENT_STATIC_INITIALIZER(K_POLL_TYPE_FIFO_DATA_AVAILABLE, K_POLL_MODE_NOTIFY_ONLY, &g_work_queue_main.fifo, BT_EVENT_WORK_QUEUE), + [1] = K_POLL_EVENT_STATIC_INITIALIZER(K_POLL_TYPE_FIFO_DATA_AVAILABLE, K_POLL_MODE_NOTIFY_ONLY, &bt_dev.cmd_tx_queue, BT_EVENT_CMD_TX), + [EV_COUNT - 1] = K_POLL_EVENT_STATIC_INITIALIZER(K_POLL_TYPE_FIFO_DATA_AVAILABLE, K_POLL_MODE_NOTIFY_ONLY, &recv_fifo, BT_EVENT_RX_QUEUE), }; - if (k_sem_count_get(&g_poll_sem) > 0) { + BT_DBG("Started"); + + while (1) { int ev_count, err; - events[0].state = K_POLL_STATE_NOT_READY; - ev_count = 1; + + events[0].state = K_POLL_STATE_NOT_READY; + events[1].state = K_POLL_STATE_NOT_READY; + events[EV_COUNT - 1].state = K_POLL_STATE_NOT_READY; + ev_count = 2; if (IS_ENABLED(CONFIG_BT_CONN)) { - ev_count += bt_conn_prepare_events(&events[1]); + ev_count += bt_conn_prepare_events(&events[2]); } - err = k_poll(events, ev_count, K_NO_WAIT); - process_events(events, ev_count); + BT_DBG("Calling k_poll with %d events", ev_count); + + err = k_poll(events, ev_count, EV_COUNT, K_FOREVER, NULL); + + BT_ASSERT(err == 0); + + process_events(events, ev_count, EV_COUNT); + + /* Make sure we don't hog the CPU if there's all the time + * some ready events. + */ + k_yield(); } } -#endif +#else +#if defined(BFLB_BLE) static void hci_tx_thread(void *p1) #else static void hci_tx_thread(void *p1, void *p2, void *p3) @@ -4070,6 +4278,7 @@ static void hci_tx_thread(void *p1, void *p2, void *p3) k_yield(); } } +#endif // BFLB_BT_CO_THREAD static void read_local_ver_complete(struct net_buf *buf) { struct bt_hci_rp_read_local_version_info *rp = (void *)buf->data; @@ -4535,11 +4744,15 @@ void device_supported_pkt_type(void) { } static int br_init(void) { - struct net_buf *buf; - struct bt_hci_cp_write_ssp_mode *ssp_cp; - struct bt_hci_cp_write_inquiry_mode *inq_cp; - struct bt_hci_write_local_name *name_cp; - int err; + struct net_buf *buf; + struct bt_hci_cp_write_ssp_mode *ssp_cp; + struct bt_hci_cp_write_class_of_device *cod_cp; + struct bt_hci_cp_write_inquiry_scan_activity *inq_scan_act_cp; + struct bt_hci_cp_write_inquiry_scan_type *inq_scan_cp; + struct bt_hci_cp_write_page_scan_type *page_scan_cp; + struct bt_hci_cp_write_inquiry_mode *inq_cp; + struct bt_hci_write_local_name *name_cp; + int err; /* Read extended local features */ if (BT_FEAT_EXT_FEATURES(bt_dev.features)) { @@ -4574,6 +4787,60 @@ static int br_init(void) { return err; } + /* Write Class of Device */ + buf = bt_hci_cmd_create(BT_HCI_OP_WRITE_CLASS_OF_DEVICE, sizeof(*cod_cp)); + if (!buf) { + return -ENOBUFS; + } + + cod_cp = net_buf_add(buf, sizeof(*cod_cp)); + u8_t cd[3] = {0x14, 0x04, 0x24}; + memcpy(cod_cp->cod, cd, 3); + err = bt_hci_cmd_send_sync(BT_HCI_OP_WRITE_CLASS_OF_DEVICE, buf, NULL); + if (err) { + return err; + } + + /* Write Inquiry Scan Activity */ + buf = bt_hci_cmd_create(BT_HCI_OP_WRITE_INQUIRY_SCAN_ACTIVITY, sizeof(*inq_scan_act_cp)); + if (!buf) { + return -ENOBUFS; + } + + inq_scan_act_cp = net_buf_add(buf, sizeof(*inq_scan_act_cp)); + inq_scan_act_cp->interval = 0x0400; + inq_scan_act_cp->window = 0x0012; + err = bt_hci_cmd_send_sync(BT_HCI_OP_WRITE_INQUIRY_SCAN_ACTIVITY, buf, NULL); + if (err) { + return err; + } + + /* Write Inquiry Scan type with Interlaced */ + buf = bt_hci_cmd_create(BT_HCI_OP_WRITE_INQUIRY_SCAN_TYPE, sizeof(*inq_scan_cp)); + if (!buf) { + return -ENOBUFS; + } + + inq_scan_cp = net_buf_add(buf, sizeof(*inq_scan_cp)); + inq_scan_cp->type = 0x01; + err = bt_hci_cmd_send_sync(BT_HCI_OP_WRITE_INQUIRY_SCAN_TYPE, buf, NULL); + if (err) { + return err; + } + + /* Write Page Scan type with Interlaced */ + buf = bt_hci_cmd_create(BT_HCI_OP_WRITE_PAGE_SCAN_TYPE, sizeof(*page_scan_cp)); + if (!buf) { + return -ENOBUFS; + } + + page_scan_cp = net_buf_add(buf, sizeof(*page_scan_cp)); + page_scan_cp->type = 0x01; + err = bt_hci_cmd_send_sync(BT_HCI_OP_WRITE_PAGE_SCAN_TYPE, buf, NULL); + if (err) { + return err; + } + /* Enable Inquiry results with RSSI or extended Inquiry */ buf = bt_hci_cmd_create(BT_HCI_OP_WRITE_INQUIRY_MODE, sizeof(*inq_cp)); if (!buf) { @@ -4973,11 +5240,11 @@ int bt_recv(struct net_buf *buf) { } static const struct event_handler prio_events[] = { - EVENT_HANDLER(BT_HCI_EVT_CMD_COMPLETE, hci_cmd_complete, sizeof(struct bt_hci_evt_cmd_complete)), - EVENT_HANDLER(BT_HCI_EVT_CMD_STATUS, hci_cmd_status, sizeof(struct bt_hci_evt_cmd_status)), + EVENT_HANDLER(BT_HCI_EVT_CMD_COMPLETE, hci_cmd_complete, sizeof(struct bt_hci_evt_cmd_complete)), + EVENT_HANDLER(BT_HCI_EVT_CMD_STATUS, hci_cmd_status, sizeof(struct bt_hci_evt_cmd_status)), #if defined(CONFIG_BT_CONN) - EVENT_HANDLER(BT_HCI_EVT_DATA_BUF_OVERFLOW, hci_data_buf_overflow, sizeof(struct bt_hci_evt_data_buf_overflow)), - EVENT_HANDLER(BT_HCI_EVT_NUM_COMPLETED_PACKETS, hci_num_completed_packets, sizeof(struct bt_hci_evt_num_completed_packets)), + EVENT_HANDLER(BT_HCI_EVT_DATA_BUF_OVERFLOW, hci_data_buf_overflow, sizeof(struct bt_hci_evt_data_buf_overflow)), + EVENT_HANDLER(BT_HCI_EVT_NUM_COMPLETED_PACKETS, hci_num_completed_packets, sizeof(struct bt_hci_evt_num_completed_packets)), #endif /* CONFIG_BT_CONN */ }; @@ -5029,9 +5296,8 @@ static int irk_init(void) { int err; /*local irk has been loaded from flash in bt_enable, check if irk is null*/ memset(empty_irk, 0, 16); - if (memcmp(bt_dev.irk[0], empty_irk, 16) != 0) { + if (memcmp(bt_dev.irk[0], empty_irk, 16) != 0) return 0; - } err = bt_rand(&bt_dev.irk[0], 16); @@ -5077,9 +5343,8 @@ static int bt_init(void) { char empty_name[CONFIG_BT_DEVICE_NAME_MAX]; memset(empty_name, 0, CONFIG_BT_DEVICE_NAME_MAX); - if (!memcmp(bt_dev.name, empty_name, CONFIG_BT_DEVICE_NAME_MAX)) { + if (!memcmp(bt_dev.name, empty_name, CONFIG_BT_DEVICE_NAME_MAX)) bt_set_name(CONFIG_BT_DEVICE_NAME); - } #endif #if defined(BFLB_BLE) @@ -5122,9 +5387,8 @@ static int bt_init(void) { if (HBN_Get_Status_Flag() == 0) #endif { - if (!bt_keys_load()) { + if (!bt_keys_load()) keys_commit(); - } } #endif #endif // CONFIG_BT_SMP @@ -5199,21 +5463,42 @@ int bt_enable(bt_ready_cb_t cb) { #if defined(BFLB_BLE) #if defined(BFLB_DYNAMIC_ALLOC_MEM) +#if (BFLB_STATIC_ALLOC_MEM) + net_buf_init(HCI_CMD, &hci_cmd_pool, CONFIG_BT_HCI_CMD_COUNT, CMD_BUF_SIZE, NULL); + net_buf_init(HCI_RX, &hci_rx_pool, CONFIG_BT_RX_BUF_COUNT, BT_BUF_RX_SIZE, NULL); +#else net_buf_init(&hci_cmd_pool, CONFIG_BT_HCI_CMD_COUNT, CMD_BUF_SIZE, NULL); net_buf_init(&hci_rx_pool, CONFIG_BT_RX_BUF_COUNT, BT_BUF_RX_SIZE, NULL); +#endif #if defined(CONFIG_BT_CONN) +#if (BFLB_STATIC_ALLOC_MEM) + net_buf_init(NUM_COMPLETE, &num_complete_pool, 1, BT_BUF_RX_SIZE, NULL); +#else net_buf_init(&num_complete_pool, 1, BT_BUF_RX_SIZE, NULL); +#endif #if defined(CONFIG_BT_HCI_ACL_FLOW_CONTROL) +#if (BFLB_STATIC_ALLOC_MEM) + net_buf_init(ACL_IN, &acl_in_pool, CONFIG_BT_ACL_RX_COUNT, ACL_IN_SIZE, report_completed_packet); +#else net_buf_init(&acl_in_pool, CONFIG_BT_ACL_RX_COUNT, ACL_IN_SIZE, report_completed_packet); +#endif #endif // CONFIG_BT_HCI_ACL_FLOW_CONTROL #endif // CONFIG_BT_CONN #if defined(CONFIG_BT_DISCARDABLE_BUF_COUNT) +#if (BFLB_STATIC_ALLOC_MEM) + net_buf_init(DISCARDABLE, &discardable_pool, CONFIG_BT_DISCARDABLE_BUF_COUNT, BT_BUF_RX_SIZE, NULL); +#else net_buf_init(&discardable_pool, CONFIG_BT_DISCARDABLE_BUF_COUNT, BT_BUF_RX_SIZE, NULL); #endif +#endif #endif k_work_init(&bt_dev.init, init_work); +#if (BFLB_BT_CO_THREAD) + k_fifo_init(&g_work_queue_main.fifo, 20); +#else k_work_q_start(); +#endif #if !defined(CONFIG_BT_WAIT_NOP) k_sem_init(&bt_dev.ncmd_sem, 1, 1); #else @@ -5225,6 +5510,10 @@ int bt_enable(bt_ready_cb_t cb) { #endif k_sem_init(&g_poll_sem, 0, 1); +#if (BFLB_BT_CO_THREAD) + // need to initialize recv_fifo before create bt_co_thread + k_fifo_init(&recv_fifo, 20); +#endif #endif #if defined(BFLB_BLE_PATCH_SETTINGS_LOAD) @@ -5251,7 +5540,9 @@ int bt_enable(bt_ready_cb_t cb) { /* TX thread */ #if defined(BFLB_BLE) -#if (!BFLB_BLE_CO_THREAD) +#if (BFLB_BT_CO_THREAD) + k_thread_create(&co_thread_data, "bt_co_thread", CONFIG_BT_CO_STACK_SIZE, bt_co_thread, CONFIG_BT_CO_TASK_PRIO); +#else k_thread_create(&tx_thread_data, "hci_tx_thread", CONFIG_BT_HCI_TX_STACK_SIZE, hci_tx_thread, CONFIG_BT_HCI_TX_PRIO); #endif #else @@ -5305,9 +5596,7 @@ bool le_check_valid_scan(void) { return atomic_test_bit(bt_dev.flags, BT_DEV_EXP #if defined(BFLB_DISABLE_BT) extern struct k_thread recv_thread_data; extern struct k_thread work_q_thread; -extern struct k_fifo recv_fifo; extern struct k_fifo free_tx; -extern struct k_work_q g_work_queue_main; #if defined(CONFIG_BT_SMP) extern struct k_sem sc_local_pkey_ready; #endif @@ -5329,37 +5618,36 @@ extern struct net_buf_pool prep_pool; #if defined(CONFIG_BT_BREDR) extern struct net_buf_pool br_sig_pool; extern struct net_buf_pool sdp_pool; +#if defined CONFIG_BT_HFP extern struct net_buf_pool hf_pool; extern struct net_buf_pool dummy_pool; #endif #endif +#endif int bt_disable_action(void) { #if defined(CONFIG_BT_PRIVACY) k_delayed_work_del_timer(&bt_dev.rpa_update); #endif - +#if defined(CONFIG_BT_CONN) bt_gatt_deinit(); - - // delete task - k_thread_delete(&tx_thread_data); - k_thread_delete(&recv_thread_data); - k_thread_delete(&work_q_thread); - +#endif // delete queue, not delete hci_cmd_pool.free/hci_rx_pool.free/acl_tx_pool.free which store released buffers. bt_delete_queue(&recv_fifo); bt_delete_queue(&g_work_queue_main.fifo); bt_delete_queue(&bt_dev.cmd_tx_queue); - +#if defined(CONFIG_BT_CONN) k_queue_free((struct k_queue *)&free_tx); - +#endif // delete sem k_sem_delete(&bt_dev.ncmd_sem); k_sem_delete(&g_poll_sem); #if defined(CONFIG_BT_SMP) k_sem_delete(&sc_local_pkey_ready); #endif +#if defined(CONFIG_BT_CONN) k_sem_delete(&bt_dev.le.pkts); +#endif atomic_clear_bit(bt_dev.flags, BT_DEV_ENABLE); @@ -5381,9 +5669,11 @@ int bt_disable_action(void) { #if defined(CONFIG_BT_BREDR) net_buf_deinit(&br_sig_pool); net_buf_deinit(&sdp_pool); +#if defined CONFIG_BT_HFP net_buf_deinit(&hf_pool); net_buf_deinit(&dummy_pool); #endif +#endif #endif // defined(CONFIG_BT_CONN) #if defined(CONFIG_BT_DISCARDABLE_BUF_COUNT) net_buf_deinit(&discardable_pool); @@ -5392,25 +5682,35 @@ int bt_disable_action(void) { bl_onchiphci_interface_deinit(); - extern void ble_controller_deinit(void); + // delete task ble_controller_deinit(); +#if (BFLB_BT_CO_THREAD) + k_thread_delete(&co_thread_data); +#else + k_thread_delete(&tx_thread_data); + k_thread_delete(&work_q_thread); + k_thread_delete(&recv_thread_data); +#endif return 0; } int bt_disable(void) { - if (le_check_valid_conn() || atomic_test_bit(bt_dev.flags, BT_DEV_EXPLICIT_SCAN) || atomic_test_bit(bt_dev.flags, BT_DEV_ADVERTISING)) { + if ( +#if defined(CONFIG_BT_CONN) + le_check_valid_conn() || +#endif + atomic_test_bit(bt_dev.flags, BT_DEV_EXPLICIT_SCAN) || atomic_test_bit(bt_dev.flags, BT_DEV_ADVERTISING)) { return -1; - } else { + } else return bt_disable_action(); - } } #endif static int set_ad(u16_t hci_op, const struct bt_ad *ad, size_t ad_len) { struct bt_hci_cp_le_set_adv_data *set_data; struct net_buf *buf; - size_t c, i; + int c, i; buf = bt_hci_cmd_create(hci_op, sizeof(*set_data)); if (!buf) { @@ -5920,12 +6220,11 @@ int bt_le_adv_start_internal(const struct bt_le_adv_param *param, const struct b if (param->options & BT_LE_ADV_OPT_CONNECTABLE) { if (IS_ENABLED(CONFIG_BT_PRIVACY) && !(param->options & BT_LE_ADV_OPT_USE_IDENTITY)) { -#if defined(CONFIG_BT_STACK_PTS) - if (param->addr_type == BT_ADDR_TYPE_RPA) { +#if defined(CONFIG_BT_STACK_PTS) || defined(CONFIG_AUTO_PTS) + if (param->addr_type == BT_ADDR_LE_RANDOM_ID) err = le_set_private_addr(param->id); - } else if (param->addr_type == BT_ADDR_TYPE_NON_RPA) { + else if (param->addr_type == BT_ADDR_LE_RANDOM) err = le_set_non_resolv_private_addr(param->id); - } #else err = le_set_private_addr(param->id); #endif @@ -5934,15 +6233,8 @@ int bt_le_adv_start_internal(const struct bt_le_adv_param *param, const struct b } if (BT_FEAT_LE_PRIVACY(bt_dev.le.features)) { -#if defined(CONFIG_BT_STACK_PTS) - if (param->addr_type == BT_ADDR_LE_PUBLIC) { - set_param.own_addr_type = BT_ADDR_LE_PUBLIC; - } - if (param->addr_type == BT_ADDR_TYPE_RPA) { - set_param.own_addr_type = BT_HCI_OWN_ADDR_RPA_OR_RANDOM; - } else if (param->addr_type == BT_ADDR_TYPE_NON_RPA) { - set_param.own_addr_type = BT_ADDR_LE_RANDOM; - } +#if defined(CONFIG_BT_STACK_PTS) || defined(CONFIG_AUTO_PTS) + set_param.own_addr_type = param->addr_type; #else set_param.own_addr_type = BT_HCI_OWN_ADDR_RPA_OR_RANDOM; #endif @@ -5993,26 +6285,24 @@ int bt_le_adv_start_internal(const struct bt_le_adv_param *param, const struct b set_param.own_addr_type = id_addr->type; } else { #if defined(BFLB_BLE) && !defined(CONFIG_BT_MESH) -#if defined(CONFIG_BT_STACK_PTS) - if (param->addr_type == BT_ADDR_TYPE_RPA) { +#if defined(CONFIG_BT_STACK_PTS) || defined(CONFIG_AUTO_PTS) + if (param->addr_type == BT_ADDR_LE_RANDOM_ID) err = le_set_private_addr(param->id); - } else if (param->addr_type == BT_ADDR_TYPE_NON_RPA) { + else if (param->addr_type == BT_ADDR_LE_RANDOM) err = le_set_non_resolv_private_addr(param->id); - } #else // #if !defined(CONFIG_BT_ADV_WITH_PUBLIC_ADDR) // err = le_set_private_addr(param->id); // #endif #endif // CONFIG_BT_STACK_PTS -#if defined(CONFIG_BT_STACK_PTS) - if (param->addr_type == BT_ADDR_LE_PUBLIC) { - set_param.own_addr_type = BT_ADDR_LE_PUBLIC; - } else +#if defined(CONFIG_BT_STACK_PTS) || defined(CONFIG_AUTO_PTS) + set_param.own_addr_type = param->addr_type; +#else + // set_param.own_addr_type = BT_ADDR_LE_RANDOM; + // #if defined(CONFIG_BT_ADV_WITH_PUBLIC_ADDR) + set_param.own_addr_type = BT_ADDR_LE_PUBLIC; +// #endif #endif - // set_param.own_addr_type = BT_ADDR_LE_RANDOM; - // #if defined(CONFIG_BT_ADV_WITH_PUBLIC_ADDR) - set_param.own_addr_type = BT_ADDR_LE_PUBLIC; - // #endif #endif } @@ -6064,9 +6354,8 @@ int bt_le_adv_start_internal(const struct bt_le_adv_param *param, const struct b atomic_set_bit_to(bt_dev.flags, BT_DEV_ADVERTISING_CONNECTABLE, param->options & BT_LE_ADV_OPT_CONNECTABLE); #if defined(BFLB_HOST_ASSISTANT) - if (!atomic_test_bit(bt_dev.flags, BT_DEV_ASSIST_RUN) && host_assist_cb && host_assist_cb->le_adv_cb) { + if (!atomic_test_bit(bt_dev.flags, BT_DEV_ASSIST_RUN) && host_assist_cb && host_assist_cb->le_adv_cb) host_assist_cb->le_adv_cb(param, ad, ad_len, sd, sd_len); - } #endif return 0; @@ -6158,11 +6447,10 @@ int set_adv_param(const struct bt_le_adv_param *param) { if (param->options & BT_LE_ADV_OPT_CONNECTABLE) { if (IS_ENABLED(CONFIG_BT_PRIVACY) && !(param->options & BT_LE_ADV_OPT_USE_IDENTITY)) { #if defined(CONFIG_BT_STACK_PTS) - if (param->addr_type == BT_ADDR_TYPE_RPA) { + if (param->addr_type == BT_ADDR_TYPE_RPA) err = le_set_private_addr(param->id); - } else if (param->addr_type == BT_ADDR_TYPE_NON_RPA) { + else if (param->addr_type == BT_ADDR_TYPE_NON_RPA) err = le_set_non_resolv_private_addr(param->id); - } #else err = le_set_private_addr(param->id); #endif @@ -6172,14 +6460,12 @@ int set_adv_param(const struct bt_le_adv_param *param) { if (BT_FEAT_LE_PRIVACY(bt_dev.le.features)) { #if defined(CONFIG_BT_STACK_PTS) - if (param->addr_type == BT_ADDR_LE_PUBLIC) { + if (param->addr_type == BT_ADDR_LE_PUBLIC) set_param.own_addr_type = BT_ADDR_LE_PUBLIC; - } - if (param->addr_type == BT_ADDR_TYPE_RPA) { + if (param->addr_type == BT_ADDR_TYPE_RPA) set_param.own_addr_type = BT_HCI_OWN_ADDR_RPA_OR_RANDOM; - } else if (param->addr_type == BT_ADDR_TYPE_NON_RPA) { + else if (param->addr_type == BT_ADDR_TYPE_NON_RPA) set_param.own_addr_type = BT_ADDR_LE_RANDOM; - } #else set_param.own_addr_type = BT_HCI_OWN_ADDR_RPA_OR_RANDOM; #endif @@ -6215,18 +6501,17 @@ int set_adv_param(const struct bt_le_adv_param *param) { } else { #if defined(BFLB_BLE) && !defined(CONFIG_BT_MESH) #if defined(CONFIG_BT_STACK_PTS) - if (param->addr_type == BT_ADDR_TYPE_RPA) { + if (param->addr_type == BT_ADDR_TYPE_RPA) err = le_set_private_addr(param->id); - } else if (param->addr_type == BT_ADDR_TYPE_NON_RPA) { + else if (param->addr_type == BT_ADDR_TYPE_NON_RPA) err = le_set_non_resolv_private_addr(param->id); - } #else err = le_set_private_addr(param->id); #endif // CONFIG_BT_STACK_PTS #if defined(CONFIG_BT_STACK_PTS) - if (param->addr_type == BT_ADDR_LE_PUBLIC) { + if (param->addr_type == BT_ADDR_LE_PUBLIC) set_param.own_addr_type = BT_ADDR_LE_PUBLIC; - } else + else #endif set_param.own_addr_type = BT_ADDR_LE_RANDOM; #endif @@ -6271,9 +6556,8 @@ int set_ad_and_rsp_d(u16_t hci_op, u8_t *data, u32_t ad_len) { } else if (BT_HCI_OP_LE_SET_SCAN_RSP_DATA == hci_op) { size = sizeof(struct bt_hci_cp_le_set_scan_rsp_data); - } else { + } else return -ENOTSUP; - } buf = bt_hci_cmd_create(hci_op, size); if (!buf) { @@ -6311,9 +6595,8 @@ int set_ad_and_rsp_d(u16_t hci_op, u8_t *data, u32_t ad_len) { memcpy(set_data->data, data, set_data->len); - } else { + } else return -ENOBUFS; - } return bt_hci_cmd_send_sync(hci_op, buf, NULL); } @@ -6390,9 +6673,8 @@ static int set_ad_data(u16_t hci_op, const uint8_t *ad_data, int ad_len) { return -ENOBUFS; } - if (ad_len > 31) { + if (ad_len > 31) return -EINVAL; - } set_data = net_buf_add(buf, sizeof(*set_data)); @@ -6626,9 +6908,8 @@ int bt_le_scan_start(const struct bt_le_scan_param *param, bt_le_scan_cb_t cb) scan_dev_found_cb = cb; #if defined(BFLB_HOST_ASSISTANT) - if (!atomic_test_bit(bt_dev.flags, BT_DEV_ASSIST_RUN) && host_assist_cb && host_assist_cb->le_scan_cb) { + if (!atomic_test_bit(bt_dev.flags, BT_DEV_ASSIST_RUN) && host_assist_cb && host_assist_cb->le_scan_cb) host_assist_cb->le_scan_cb(param, cb); - } #endif return 0; @@ -6744,9 +7025,8 @@ int bt_set_tx_pwr(int8_t power) { struct net_buf *buf; int err; - if (power < 0 || power > 20) { + if (power < 0 || power > 20) return BT_HCI_ERR_INVALID_PARAM; - } memset(&set_param, 0, sizeof(set_param)); diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/hci_core.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/hci_core.h index 488e5311..2411fc60 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/hci_core.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/hci_core.h @@ -20,10 +20,22 @@ #define BT_VOICE_CVSD_16BIT 0x0060 #define BT_VOICE_MSBC_16BIT 0x0063 +#if (BFLB_BT_CO_THREAD) +enum { + BT_CMD_SYNC_NONE = 0, + BT_CMD_SYNC_TX = 1, + BT_CMD_SYNC_TX_DONE = 2 +}; +#endif + /* k_poll event tags */ enum { BT_EVENT_CMD_TX, BT_EVENT_CONN_TX_QUEUE, +#if (BFLB_BT_CO_THREAD) + BT_EVENT_RX_QUEUE, + BT_EVENT_WORK_QUEUE, +#endif }; /* bt_dev flags: the flags defined here represent BT controller state */ @@ -60,6 +72,10 @@ enum { BT_DEV_ADV_ADDRESS_IS_PUBLIC, #endif +#if defined(CONFIG_AUTO_PTS) + BT_DEV_SETTED_NON_RESOLV_ADDR, //The non-reslovable address have been set. +#endif + #if defined(BFLB_HOST_ASSISTANT) BT_DEV_ASSIST_RUN, #endif @@ -262,8 +278,9 @@ int set_adv_channel_map(u8_t channel); int bt_get_local_public_address(bt_addr_le_t *adv_addr); int bt_get_local_ramdon_address(bt_addr_le_t *adv_addr); int bt_le_set_data_len(struct bt_conn *conn, u16_t tx_octets, u16_t tx_time); -int hci_le_set_phy(struct bt_conn *conn); -int hci_le_set_default_phy(struct bt_conn *conn, u8_t default_phy); +int hci_le_set_phy(struct bt_conn *conn, uint8_t all_phys, + uint8_t pref_tx_phy, uint8_t pref_rx_phy, uint8_t phy_opts); +int hci_le_set_default_phy(u8_t default_phy); #if defined(CONFIG_SET_TX_PWR) int bt_set_tx_pwr(int8_t power); @@ -282,4 +299,7 @@ void bt_hci_reset_complete(struct net_buf *buf); void bt_register_host_assist_cb(struct blhast_cb *cb); #endif +typedef void (*bredr_name_callback)(const char *name); +int remote_name_req(const bt_addr_t *addr, bredr_name_callback cb); + #endif diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/l2cap.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/l2cap.c index 6d773ac6..9137ee43 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/l2cap.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/l2cap.c @@ -238,9 +238,8 @@ destroy: } #ifdef BFLB_BLE_PATCH_FREE_ALLOCATED_BUFFER_IN_OS - if (chan->rtx_work.timer.timer.hdl) { + if (chan->rtx_work.timer.timer.hdl) k_delayed_work_del_timer(&chan->rtx_work); - } #endif } diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/monitor.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/monitor.c index c6b27c37..e87f9a6b 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/monitor.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/monitor.c @@ -16,8 +16,9 @@ void bt_monitor_send(uint16_t opcode, const void *data, size_t len) { const uint8_t *buf = data; - + unsigned int key = irq_lock(); BT_WARN("[Hci]:pkt_type:[0x%x],pkt_data:[%s]\r\n", opcode, bt_hex(buf, len)); + irq_unlock(key); } void bt_monitor_new_index(uint8_t type, uint8_t bus, bt_addr_t *addr, const char *name) {} diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/multi_adv.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/multi_adv.c index da344c9a..ded6eeb0 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/multi_adv.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/multi_adv.c @@ -9,6 +9,7 @@ #include #include +#include "log.h" #include "multi_adv.h" #include "work_q.h" @@ -24,9 +25,8 @@ int multi_adv_get_instant_num(void) { struct multi_adv_instant *inst = &(g_multi_adv_list[0]); for (i = 0; i < MAX_MULTI_ADV_INSTANT; i++) { - if (inst[i].inuse_flag) { + if (inst[i].inuse_flag) num++; - } } return num; } @@ -105,15 +105,13 @@ int change_to_tick(int min_interval, int max_interval) { if (max_interval / SLOT_PER_PERIOD != min_interval / SLOT_PER_PERIOD) { tick = min_interval / SLOT_PER_PERIOD; - if (min_interval % SLOT_PER_PERIOD) { + if (min_interval % SLOT_PER_PERIOD) tick++; - } } else { tick = min_interval / SLOT_PER_PERIOD; } - if (tick <= 1) { + if (tick <= 1) tick = 1; - } return tick; } @@ -161,13 +159,11 @@ int calculate_offset(uint16_t interval[], uint16_t offset[], int num, int durati int offset_range; offset_range = interval[num]; - if (offset_range > duration) { + if (offset_range > duration) offset_range = duration; - } - if (num == 0) { + if (num == 0) return 0; - } min_max_instants = 0x7fffffff; /* using 0-interval-1 as offset */ @@ -182,9 +178,8 @@ int calculate_offset(uint16_t interval[], uint16_t offset[], int num, int durati instants++; } } - if (j % interval[num] == i) { + if (j % interval[num] == i) instants++; - } if (curr_max_instants < instants) { curr_max_instants = instants; } @@ -232,9 +227,8 @@ void multi_adv_schedule_timer_handle(void) { struct multi_adv_scheduler *adv_scheduler = &g_multi_adv_scheduler; multi_adv_schedule_timer_stop(); - if (adv_scheduler->schedule_state == SCHEDULE_STOP) { + if (adv_scheduler->schedule_state == SCHEDULE_STOP) return; - } adv_scheduler->slot_clock = adv_scheduler->next_slot_clock; adv_scheduler->slot_offset = adv_scheduler->next_slot_offset; @@ -298,7 +292,7 @@ void multi_adv_schedule_timeslot(struct multi_adv_scheduler *adv_scheduler) { } } - // BT_DBG("multi_adv_schedule_timeslot, num = %d, match = %d", inst_num, match); + BT_DBG("multi_adv_schedule_timeslot, num = %d, match = %d", inst_num, match); if (match) { int offset_per_instant, diff; offset_per_instant = TIME_PRIOD_MS / match; @@ -310,9 +304,8 @@ void multi_adv_schedule_timeslot(struct multi_adv_scheduler *adv_scheduler) { /* start instant */ adv_instant = multi_adv_find_instant_by_order(inst_order[match_order[insts]]); - if (adv_instant) { + if (adv_instant) multi_adv_start_adv_instant(adv_instant); - } } /* next instant in the same slot */ @@ -402,7 +395,7 @@ void multi_adv_new_schedule(void) { } if (high_duty_instant) { - // BT_WARN("High Duty Cycle Instants, id = %d, interval = %d\n", adv_instant->instant_id, adv_instant->param.interval_min); + BT_WARN("High Duty Cycle Instants, id = %d, interval = %d\n", adv_instant->instant_id, adv_instant->param.interval_min); multi_adv_start_adv_instant(adv_instant); return; } @@ -414,9 +407,8 @@ void multi_adv_new_schedule(void) { } if (inst_num == 1) { adv_instant = multi_adv_find_instant_by_order(inst_order[0]); - if (!adv_instant) { + if (!adv_instant) return; - } multi_adv_start_adv_instant(adv_instant); return; } @@ -436,7 +428,7 @@ void multi_adv_new_schedule(void) { adv_instant->instant_interval = inst_interval[i]; adv_instant->instant_offset = inst_offset[i]; - // BT_WARN("adv_instant id = %d, interval = %d, offset = %d\n", adv_instant->instant_id, adv_instant->instant_interval, adv_instant->instant_offset); + BT_WARN("adv_instant id = %d, interval = %d, offset = %d\n", adv_instant->instant_id, adv_instant->instant_interval, adv_instant->instant_offset); } multi_adv_schedule_start(); @@ -453,14 +445,12 @@ int bt_le_multi_adv_start(const struct bt_le_adv_param *param, const struct bt_d struct multi_adv_instant *adv_instant; instant_num = multi_adv_get_instant_num(); - if (instant_num >= MAX_MULTI_ADV_INSTANT) { + if (instant_num >= MAX_MULTI_ADV_INSTANT) return -1; - } adv_instant = multi_adv_alloc_unused_instant(); - if (adv_instant == 0) { + if (adv_instant == 0) return -1; - } memcpy(&(adv_instant->param), param, sizeof(struct bt_le_adv_param)); @@ -474,11 +464,10 @@ int bt_le_multi_adv_start(const struct bt_le_adv_param *param, const struct bt_d } int bt_le_multi_adv_stop(int instant_id) { - if (multi_adv_find_instant_by_id(instant_id) == 0) { + if (multi_adv_find_instant_by_id(instant_id) == 0) return -1; - } - // BT_WARN("%s id[%d]\n", __func__, instant_id); + BT_WARN("%s id[%d]\n", __func__, instant_id); multi_adv_delete_instant_by_id(instant_id); multi_adv_new_schedule(); diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/settings.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/settings.c index 3c7282ee..0f6725a6 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/settings.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/host/settings.c @@ -221,72 +221,37 @@ int bt_check_if_ef_ready() { if (!ef_ready_flag) { err = easyflash_init(); - if (!err) { + if (!err) ef_ready_flag = true; - } } return err; } int bt_settings_set_bin(const char *key, const uint8_t *value, size_t length) { - const char *lookup = "0123456789abcdef"; - char *str_value; - int err; + int err; err = bt_check_if_ef_ready(); - if (err) { + if (err) return err; - } - str_value = pvPortMalloc(length * 2 + 1); - - BT_ASSERT(str_value != NULL); - - for (size_t i = 0; i < length; i++) { - str_value[(i * 2) + 0] = lookup[(value[i] >> 4) & 0x0F]; - str_value[(i * 2) + 1] = lookup[value[i] & 0x0F]; - } - str_value[length * 2] = '\0'; - - err = ef_set_env(key, (const char *)str_value); - - vPortFree(str_value); + err = ef_set_env_blob(key, value, length); return err; } int bt_settings_get_bin(const char *key, u8_t *value, size_t exp_len, size_t *real_len) { - char *str_value; - size_t str_value_len; - char rand[3]; int err; + size_t rlen; err = bt_check_if_ef_ready(); - if (err) { + if (err) return err; - } - str_value = ef_get_env(key); - if (str_value == NULL) { - return -1; - } + rlen = ef_get_env_blob(key, value, exp_len, NULL); - str_value_len = strlen(str_value); - - if ((str_value_len % 2) != 0 || (exp_len > 0 && str_value_len > exp_len * 2)) { - return -1; - } - - if (real_len) { - *real_len = str_value_len / 2; - } - - for (size_t i = 0; i < str_value_len / 2; i++) { - strncpy(rand, str_value + 2 * i, 2); - rand[2] = '\0'; - value[i] = strtol(rand, NULL, 16); - } + if (real_len) + *real_len = rlen; return 0; } @@ -300,9 +265,8 @@ int settings_save_one(const char *key, const u8_t *value, size_t length) { retur void bt_settings_save_id(void) { #if defined(BFLB_BLE) #if defined(CONFIG_BT_SETTINGS) - if (bt_check_if_ef_ready()) { + if (bt_check_if_ef_ready()) return; - } bt_settings_set_bin(NV_LOCAL_ID_ADDR, (const u8_t *)&bt_dev.id_addr[0], sizeof(bt_addr_le_t) * CONFIG_BT_ID_MAX); #if defined(CONFIG_BT_PRIVACY) bt_settings_set_bin(NV_LOCAL_IRK, (const u8_t *)&bt_dev.irk[0], 16 * CONFIG_BT_ID_MAX); @@ -315,26 +279,13 @@ void bt_settings_save_id(void) { #if defined(BFLB_BLE) #if defined(CONFIG_BT_SETTINGS) -void bt_settings_save_name(void) { - if (bt_check_if_ef_ready()) { - return; - } - - ef_set_env(NV_LOCAL_NAME, bt_dev.name); -} +void bt_settings_save_name(void) { bt_settings_set_bin(NV_LOCAL_NAME, (u8_t *)bt_dev.name, strlen(bt_dev.name) + 1); } void bt_local_info_load(void) { - if (bt_check_if_ef_ready()) { + if (bt_check_if_ef_ready()) return; - } #if defined(CONFIG_BT_DEVICE_NAME_DYNAMIC) - char *dev_name; - uint8_t len; - dev_name = ef_get_env(NV_LOCAL_NAME); - if (dev_name != NULL) { - len = ((strlen(dev_name) + 1) < CONFIG_BT_DEVICE_NAME_MAX) ? (strlen(dev_name) + 1) : CONFIG_BT_DEVICE_NAME_MAX; - memcpy(bt_dev.name, dev_name, len); - } + bt_settings_get_bin(NV_LOCAL_NAME, (u8_t *)bt_dev.name, CONFIG_BT_DEVICE_NAME_MAX, NULL); #endif bt_settings_get_bin(NV_LOCAL_ID_ADDR, (u8_t *)&bt_dev.id_addr[0], sizeof(bt_addr_le_t) * CONFIG_BT_ID_MAX, NULL); #if defined(CONFIG_BT_PRIVACY) diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/addr.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/addr.h index 768f3189..016181f6 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/addr.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/addr.h @@ -21,12 +21,6 @@ extern "C" { #define BT_ADDR_LE_PUBLIC_ID 0x02 #define BT_ADDR_LE_RANDOM_ID 0x03 -#if defined(CONFIG_BT_STACK_PTS) -//for app layer to deliver the address type:non rpa ,rpa -#define BT_ADDR_TYPE_NON_RPA 0x01 -#define BT_ADDR_TYPE_RPA 0x02 -#endif - /** Bluetooth Device Address */ typedef struct { u8_t val[6]; diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/att.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/att.h index 515320ac..4e99cf2d 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/att.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/att.h @@ -13,10 +13,8 @@ #ifdef __cplusplus extern "C" { #endif -#include "buf.h" + #include -#include "conn_internal.h" -#include "conn.h" /* Error codes for Error response PDU */ #define BT_ATT_ERR_INVALID_HANDLE 0x01 @@ -45,18 +43,20 @@ extern "C" { #define BT_ATT_ERR_PROCEDURE_IN_PROGRESS 0xfe #define BT_ATT_ERR_OUT_OF_RANGE 0xff -typedef void (*bt_att_func_t)(struct bt_conn *conn, u8_t err, const void *pdu, u16_t length, void *user_data); +typedef void (*bt_att_func_t)(struct bt_conn *conn, u8_t err, + const void *pdu, u16_t length, + void *user_data); typedef void (*bt_att_destroy_t)(void *user_data); /* ATT request context */ struct bt_att_req { - sys_snode_t node; - bt_att_func_t func; - bt_att_destroy_t destroy; - struct net_buf_simple_state state; - struct net_buf *buf; + sys_snode_t node; + bt_att_func_t func; + bt_att_destroy_t destroy; + struct net_buf_simple_state state; + struct net_buf *buf; #if defined(CONFIG_BT_SMP) - bool retrying; + bool retrying; #endif /* CONFIG_BT_SMP */ }; diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/avdtp.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/avdtp.h index f9c09632..72cc2c53 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/avdtp.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/avdtp.h @@ -14,8 +14,6 @@ extern "C" { #endif -#include "avdtp_internal.h" - /** @brief AVDTP SEID Information */ struct bt_avdtp_seid_info { /** Stream End Point ID */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/bluetooth.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/bluetooth.h index ec0a5d52..826d4ec5 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/bluetooth.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/bluetooth.h @@ -315,7 +315,7 @@ struct bt_le_adv_param { /** Maximum Advertising Interval (N * 0.625) */ u16_t interval_max; -#if defined(CONFIG_BT_STACK_PTS) +#if defined(CONFIG_BT_STACK_PTS) || defined(CONFIG_AUTO_PTS) u8_t addr_type; #endif }; diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/conn.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/conn.h index 18b64971..66376abc 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/conn.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/conn.h @@ -21,7 +21,6 @@ #include #include #include -#include "conn_internal.h" #ifdef __cplusplus extern "C" { @@ -107,6 +106,7 @@ struct bt_conn *bt_conn_lookup_addr_le(u8_t id, const bt_addr_le_t *peer); #if defined(BFLB_BLE) bool le_check_valid_conn(void); +void notify_disconnected(struct bt_conn *conn); #if defined(BFLB_HOST_ASSISTANT) void bt_notify_disconnected(void); #endif @@ -491,6 +491,17 @@ struct bt_conn_cb { */ void (*le_param_updated)(struct bt_conn *conn, u16_t interval, u16_t latency, u16_t timeout); + + /** @brief The PHY of the connection has changed. + * + * This callback notifies the application that the PHY of the + * connection has changed. + * + * @param conn Connection object. + * @param tx_phy Transmit phy. + * @param rx_phy Receive phy. + */ + void (*le_phy_updated)(struct bt_conn *conn, u8_t tx_phy, u8_t rx_phy); #if defined(CONFIG_BT_SMP) /** @brief Remote Identity Address has been resolved. * diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/gatt.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/gatt.h index 26c43f17..20b9391c 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/gatt.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/gatt.h @@ -26,7 +26,6 @@ #ifdef __cplusplus extern "C" { #endif -#include "conn_internal.h" /* GATT attribute permission bit field values */ enum { @@ -530,6 +529,13 @@ ssize_t bt_gatt_attr_read_chrc(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, u16_t len, u16_t offset); +#define BT_GATT_CHRC_INIT(_uuid, _handle, _props) \ + { \ + .uuid = _uuid, \ + .value_handle = _handle, \ + .properties = _props, \ + } + /** @def BT_GATT_CHARACTERISTIC * @brief Characteristic and Value Declaration Macro. * @@ -546,10 +552,8 @@ ssize_t bt_gatt_attr_read_chrc(struct bt_conn *conn, #define BT_GATT_CHARACTERISTIC(_uuid, _props, _perm, _read, _write, _value) \ BT_GATT_ATTRIBUTE(BT_UUID_GATT_CHRC, BT_GATT_PERM_READ, \ bt_gatt_attr_read_chrc, NULL, \ - (&(struct bt_gatt_chrc){ \ - .uuid = _uuid, \ - .value_handle = 0U, \ - .properties = _props, \ + ((struct bt_gatt_chrc[]){ \ + BT_GATT_CHRC_INIT(_uuid, 0U, _props), \ })), \ BT_GATT_ATTRIBUTE(_uuid, _perm, _read, _write, _value) @@ -785,10 +789,11 @@ ssize_t bt_gatt_attr_read_cpf(struct bt_conn *conn, #define BT_GATT_ATTRIBUTE(_uuid, _perm, _read, _write, _value) \ { \ .uuid = _uuid, \ - .perm = _perm, \ .read = _read, \ .write = _write, \ .user_data = _value, \ + .handle = 0, \ + .perm = _perm, \ } /** @brief Notification complete result callback. @@ -1371,7 +1376,12 @@ void bt_gatt_cancel(struct bt_conn *conn, void *params); typedef void (*bt_gatt_mtu_changed_cb_t)(struct bt_conn *conn, int mtu); void bt_gatt_register_mtu_callback(bt_gatt_mtu_changed_cb_t cb); #endif - +#if defined(CONFIG_BT_GATT_CLIENT) +#if defined(BFLB_BLE_NOTIFY_ALL) +typedef void (*bt_notification_all_cb_t)(struct bt_conn *conn, u16_t handle, const void *data, u16_t length); +void bt_gatt_register_notification_callback(bt_notification_all_cb_t cb); +#endif +#endif #if defined(BFLB_BLE) /** @brief load gatt ccc from flash * diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/hci_host.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/hci_host.h index 5d79f000..b1c514b9 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/hci_host.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/hci_host.h @@ -476,6 +476,17 @@ struct bt_hci_write_local_name { #define BT_BREDR_SCAN_INQUIRY 0x01 #define BT_BREDR_SCAN_PAGE 0x02 +#define BT_HCI_OP_WRITE_INQUIRY_SCAN_ACTIVITY BT_OP(BT_OGF_BASEBAND, 0x001e) +struct bt_hci_cp_write_inquiry_scan_activity { + u16_t interval; + u16_t window; +} __packed; + +#define BT_HCI_OP_WRITE_CLASS_OF_DEVICE BT_OP(BT_OGF_BASEBAND, 0x0024) +struct bt_hci_cp_write_class_of_device { + u8_t cod[3]; +} __packed; + #define BT_TX_POWER_LEVEL_CURRENT 0x00 #define BT_TX_POWER_LEVEL_MAX 0x01 #define BT_HCI_OP_READ_TX_POWER_LEVEL BT_OP(BT_OGF_BASEBAND, 0x002d) @@ -516,11 +527,21 @@ struct bt_hci_cp_host_num_completed_packets { struct bt_hci_handle_count h[0]; } __packed; +#define BT_HCI_OP_WRITE_INQUIRY_SCAN_TYPE BT_OP(BT_OGF_BASEBAND, 0x0043) +struct bt_hci_cp_write_inquiry_scan_type { + u8_t type; +} __packed; + #define BT_HCI_OP_WRITE_INQUIRY_MODE BT_OP(BT_OGF_BASEBAND, 0x0045) struct bt_hci_cp_write_inquiry_mode { u8_t mode; } __packed; +#define BT_HCI_OP_WRITE_PAGE_SCAN_TYPE BT_OP(BT_OGF_BASEBAND, 0x0047) +struct bt_hci_cp_write_page_scan_type { + u8_t type; +} __packed; + #define BT_HCI_OP_WRITE_EXT_INQUIRY_RESP BT_OP(BT_OGF_BASEBAND, 0x0052) struct bt_hci_cp_write_ext_inquiry_resp { u8_t rec; @@ -2617,6 +2638,10 @@ typedef bool bt_hci_vnd_evt_cb_t(struct net_buf_simple *buf); */ int bt_hci_register_vnd_evt_cb(bt_hci_vnd_evt_cb_t cb); +#if (BFLB_BT_CO_THREAD) +struct k_thread *bt_get_co_thread(void); +#endif + #ifdef __cplusplus } #endif diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/iso.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/iso.h index b24988a8..c48295c9 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/iso.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/iso.h @@ -21,15 +21,17 @@ extern "C" { #endif +#include #include #include #include -#include /** @def BT_ISO_CHAN_SEND_RESERVE * @brief Headroom needed for outgoing buffers */ -#define BT_ISO_CHAN_SEND_RESERVE (CONFIG_BT_HCI_RESERVE + BT_HCI_ISO_HDR_SIZE + BT_HCI_ISO_DATA_HDR_SIZE) +#define BT_ISO_CHAN_SEND_RESERVE (CONFIG_BT_HCI_RESERVE + \ + BT_HCI_ISO_HDR_SIZE + \ + BT_HCI_ISO_DATA_HDR_SIZE) struct bt_iso_chan; @@ -38,136 +40,140 @@ struct bt_iso_chan; * context. */ enum { - /** Channel disconnected */ - BT_ISO_DISCONNECTED, - /** Channel bound to a connection */ - BT_ISO_BOUND, - /** Channel in connecting state */ - BT_ISO_CONNECT, - /** Channel ready for upper layer traffic on it */ - BT_ISO_CONNECTED, - /** Channel in disconnecting state */ - BT_ISO_DISCONNECT, + /** Channel disconnected */ + BT_ISO_DISCONNECTED, + /** Channel bound to a connection */ + BT_ISO_BOUND, + /** Channel in connecting state */ + BT_ISO_CONNECT, + /** Channel ready for upper layer traffic on it */ + BT_ISO_CONNECTED, + /** Channel in disconnecting state */ + BT_ISO_DISCONNECT, }; /** @brief ISO Channel structure. */ struct bt_iso_chan { - /** Channel connection reference */ - struct bt_conn *conn; - /** Channel operations reference */ - struct bt_iso_chan_ops *ops; - /** Channel QoS reference */ - struct bt_iso_chan_qos *qos; - /** Channel data path reference*/ - struct bt_iso_chan_path *path; - sys_snode_t node; - uint8_t state; - bt_security_t required_sec_level; + /** Channel connection reference */ + struct bt_conn *conn; + /** Channel operations reference */ + struct bt_iso_chan_ops *ops; + /** Channel QoS reference */ + struct bt_iso_chan_qos *qos; + /** Channel data path reference*/ + struct bt_iso_chan_path *path; + sys_snode_t node; + uint8_t state; + bt_security_t required_sec_level; }; /** @brief Audio QoS direction */ -enum { BT_ISO_CHAN_QOS_IN, BT_ISO_CHAN_QOS_OUT, BT_ISO_CHAN_QOS_INOUT }; +enum { + BT_ISO_CHAN_QOS_IN, + BT_ISO_CHAN_QOS_OUT, + BT_ISO_CHAN_QOS_INOUT +}; /** @brief ISO Channel QoS structure. */ struct bt_iso_chan_qos { - /** @brief Channel direction - * - * Possible values: BT_ISO_CHAN_QOS_IN, BT_ISO_CHAN_QOS_OUT or - * BT_ISO_CHAN_QOS_INOUT. - */ - uint8_t dir; - /** Channel interval */ - uint32_t interval; - /** Channel SCA */ - uint8_t sca; - /** Channel packing mode */ - uint8_t packing; - /** Channel framing mode */ - uint8_t framing; - /** Channel Latency */ - uint16_t latency; - /** Channel SDU */ - uint8_t sdu; - /** Channel PHY */ - uint8_t phy; - /** Channel Retransmission Number */ - uint8_t rtn; + /** @brief Channel direction + * + * Possible values: BT_ISO_CHAN_QOS_IN, BT_ISO_CHAN_QOS_OUT or + * BT_ISO_CHAN_QOS_INOUT. + */ + uint8_t dir; + /** Channel interval */ + uint32_t interval; + /** Channel SCA */ + uint8_t sca; + /** Channel packing mode */ + uint8_t packing; + /** Channel framing mode */ + uint8_t framing; + /** Channel Latency */ + uint16_t latency; + /** Channel SDU */ + uint8_t sdu; + /** Channel PHY */ + uint8_t phy; + /** Channel Retransmission Number */ + uint8_t rtn; }; /** @brief ISO Channel Data Path structure. */ struct bt_iso_chan_path { - /** Default path ID */ - uint8_t pid; - /** Coding Format */ - uint8_t format; - /** Company ID */ - uint16_t cid; - /** Vendor-defined Codec ID */ - uint16_t vid; - /** Controller Delay */ - uint32_t delay; - /** Codec Configuration length*/ - uint8_t cc_len; - /** Codec Configuration */ - uint8_t cc[0]; + /** Default path ID */ + uint8_t pid; + /** Coding Format */ + uint8_t format; + /** Company ID */ + uint16_t cid; + /** Vendor-defined Codec ID */ + uint16_t vid; + /** Controller Delay */ + uint32_t delay; + /** Codec Configuration length*/ + uint8_t cc_len; + /** Codec Configuration */ + uint8_t cc[0]; }; /** @brief ISO Channel operations structure. */ struct bt_iso_chan_ops { - /** @brief Channel connected callback - * - * If this callback is provided it will be called whenever the - * connection completes. - * - * @param chan The channel that has been connected - */ - void (*connected)(struct bt_iso_chan *chan); + /** @brief Channel connected callback + * + * If this callback is provided it will be called whenever the + * connection completes. + * + * @param chan The channel that has been connected + */ + void (*connected)(struct bt_iso_chan *chan); - /** @brief Channel disconnected callback - * - * If this callback is provided it will be called whenever the - * channel is disconnected, including when a connection gets - * rejected. - * - * @param chan The channel that has been Disconnected - */ - void (*disconnected)(struct bt_iso_chan *chan); + /** @brief Channel disconnected callback + * + * If this callback is provided it will be called whenever the + * channel is disconnected, including when a connection gets + * rejected. + * + * @param chan The channel that has been Disconnected + */ + void (*disconnected)(struct bt_iso_chan *chan); - /** @brief Channel alloc_buf callback - * - * If this callback is provided the channel will use it to allocate - * buffers to store incoming data. - * - * @param chan The channel requesting a buffer. - * - * @return Allocated buffer. - */ - struct net_buf *(*alloc_buf)(struct bt_iso_chan *chan); + /** @brief Channel alloc_buf callback + * + * If this callback is provided the channel will use it to allocate + * buffers to store incoming data. + * + * @param chan The channel requesting a buffer. + * + * @return Allocated buffer. + */ + struct net_buf *(*alloc_buf)(struct bt_iso_chan *chan); - /** @brief Channel recv callback - * - * @param chan The channel receiving data. - * @param buf Buffer containing incoming data. - */ - void (*recv)(struct bt_iso_chan *chan, struct net_buf *buf); + /** @brief Channel recv callback + * + * @param chan The channel receiving data. + * @param buf Buffer containing incoming data. + */ + void (*recv)(struct bt_iso_chan *chan, struct net_buf *buf); }; /** @brief ISO Server structure. */ struct bt_iso_server { - /** Required minimim security level */ - bt_security_t sec_level; + /** Required minimim security level */ + bt_security_t sec_level; - /** @brief Server accept callback - * - * This callback is called whenever a new incoming connection requires - * authorization. - * - * @param conn The connection that is requesting authorization - * @param chan Pointer to receive the allocated channel - * - * @return 0 in case of success or negative value in case of error. - */ - int (*accept)(struct bt_conn *conn, struct bt_iso_chan **chan); + /** @brief Server accept callback + * + * This callback is called whenever a new incoming connection requires + * authorization. + * + * @param conn The connection that is requesting authorization + * @param chan Pointer to receive the allocated channel + * + * @return 0 in case of success or negative value in case of error. + */ + int (*accept)(struct bt_conn *conn, struct bt_iso_chan **chan); }; /** @brief Register ISO server. @@ -194,7 +200,8 @@ int bt_iso_server_register(struct bt_iso_server *server); * * @return 0 in case of success or negative value in case of error. */ -int bt_iso_chan_bind(struct bt_conn **conns, uint8_t num_conns, struct bt_iso_chan **chans); +int bt_iso_chan_bind(struct bt_conn **conns, uint8_t num_conns, + struct bt_iso_chan **chans); /** @brief Connect ISO channels * diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/l2cap.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/l2cap.h index 75934439..12db69e7 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/l2cap.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/l2cap.h @@ -18,7 +18,6 @@ */ #include <../bluetooth/buf.h> -#include #include #include #ifdef __cplusplus @@ -37,7 +36,9 @@ extern "C" { * * @return Needed buffer size to match the requested L2CAP MTU. */ -#define BT_L2CAP_BUF_SIZE(mtu) (BT_BUF_RESERVE + BT_HCI_ACL_HDR_SIZE + BT_L2CAP_HDR_SIZE + (mtu)) +#define BT_L2CAP_BUF_SIZE(mtu) (BT_BUF_RESERVE + \ + BT_HCI_ACL_HDR_SIZE + BT_L2CAP_HDR_SIZE + \ + (mtu)) struct bt_l2cap_chan; @@ -53,82 +54,82 @@ typedef void (*bt_l2cap_chan_destroy_t)(struct bt_l2cap_chan *chan); * context. */ typedef enum bt_l2cap_chan_state { - /** Channel disconnected */ - BT_L2CAP_DISCONNECTED, - /** Channel in connecting state */ - BT_L2CAP_CONNECT, - /** Channel in config state, BR/EDR specific */ - BT_L2CAP_CONFIG, - /** Channel ready for upper layer traffic on it */ - BT_L2CAP_CONNECTED, - /** Channel in disconnecting state */ - BT_L2CAP_DISCONNECT, + /** Channel disconnected */ + BT_L2CAP_DISCONNECTED, + /** Channel in connecting state */ + BT_L2CAP_CONNECT, + /** Channel in config state, BR/EDR specific */ + BT_L2CAP_CONFIG, + /** Channel ready for upper layer traffic on it */ + BT_L2CAP_CONNECTED, + /** Channel in disconnecting state */ + BT_L2CAP_DISCONNECT, } __packed bt_l2cap_chan_state_t; /** @brief Status of L2CAP channel. */ typedef enum bt_l2cap_chan_status { - /** Channel output status */ - BT_L2CAP_STATUS_OUT, + /** Channel output status */ + BT_L2CAP_STATUS_OUT, - /* Total number of status - must be at the end of the enum */ - BT_L2CAP_NUM_STATUS, + /* Total number of status - must be at the end of the enum */ + BT_L2CAP_NUM_STATUS, } __packed bt_l2cap_chan_status_t; /** @brief L2CAP Channel structure. */ struct bt_l2cap_chan { - /** Channel connection reference */ - struct bt_conn *conn; - /** Channel operations reference */ - struct bt_l2cap_chan_ops *ops; - sys_snode_t node; - bt_l2cap_chan_destroy_t destroy; - /* Response Timeout eXpired (RTX) timer */ - struct k_delayed_work rtx_work; - ATOMIC_DEFINE(status, BT_L2CAP_NUM_STATUS); + /** Channel connection reference */ + struct bt_conn *conn; + /** Channel operations reference */ + struct bt_l2cap_chan_ops *ops; + sys_snode_t node; + bt_l2cap_chan_destroy_t destroy; + /* Response Timeout eXpired (RTX) timer */ + struct k_delayed_work rtx_work; + ATOMIC_DEFINE(status, BT_L2CAP_NUM_STATUS); #if defined(CONFIG_BT_L2CAP_DYNAMIC_CHANNEL) - bt_l2cap_chan_state_t state; - /** Remote PSM to be connected */ - u16_t psm; - /** Helps match request context during CoC */ - u8_t ident; - bt_security_t required_sec_level; + bt_l2cap_chan_state_t state; + /** Remote PSM to be connected */ + u16_t psm; + /** Helps match request context during CoC */ + u8_t ident; + bt_security_t required_sec_level; #endif /* CONFIG_BT_L2CAP_DYNAMIC_CHANNEL */ }; /** @brief LE L2CAP Endpoint structure. */ struct bt_l2cap_le_endpoint { - /** Endpoint CID */ - u16_t cid; - /** Endpoint Maximum Transmission Unit */ - u16_t mtu; - /** Endpoint Maximum PDU payload Size */ - u16_t mps; - /** Endpoint initial credits */ - u16_t init_credits; - /** Endpoint credits */ - struct k_sem credits; + /** Endpoint CID */ + u16_t cid; + /** Endpoint Maximum Transmission Unit */ + u16_t mtu; + /** Endpoint Maximum PDU payload Size */ + u16_t mps; + /** Endpoint initial credits */ + u16_t init_credits; + /** Endpoint credits */ + struct k_sem credits; }; /** @brief LE L2CAP Channel structure. */ struct bt_l2cap_le_chan { - /** Common L2CAP channel reference object */ - struct bt_l2cap_chan chan; - /** Channel Receiving Endpoint */ - struct bt_l2cap_le_endpoint rx; - /** Channel Transmission Endpoint */ - struct bt_l2cap_le_endpoint tx; - /** Channel Transmission queue */ - struct k_fifo tx_queue; - /** Channel Pending Transmission buffer */ - struct net_buf *tx_buf; - /** Segment SDU packet from upper layer */ - struct net_buf *_sdu; - u16_t _sdu_len; + /** Common L2CAP channel reference object */ + struct bt_l2cap_chan chan; + /** Channel Receiving Endpoint */ + struct bt_l2cap_le_endpoint rx; + /** Channel Transmission Endpoint */ + struct bt_l2cap_le_endpoint tx; + /** Channel Transmission queue */ + struct k_fifo tx_queue; + /** Channel Pending Transmission buffer */ + struct net_buf *tx_buf; + /** Segment SDU packet from upper layer */ + struct net_buf *_sdu; + u16_t _sdu_len; - struct k_work rx_work; - struct k_fifo rx_queue; + struct k_work rx_work; + struct k_fifo rx_queue; }; /** @def BT_L2CAP_LE_CHAN(_ch) @@ -144,107 +145,107 @@ struct bt_l2cap_le_chan { /** @brief BREDR L2CAP Endpoint structure. */ struct bt_l2cap_br_endpoint { - /** Endpoint CID */ - u16_t cid; - /** Endpoint Maximum Transmission Unit */ - u16_t mtu; + /** Endpoint CID */ + u16_t cid; + /** Endpoint Maximum Transmission Unit */ + u16_t mtu; }; /** @brief BREDR L2CAP Channel structure. */ struct bt_l2cap_br_chan { - /** Common L2CAP channel reference object */ - struct bt_l2cap_chan chan; - /** Channel Receiving Endpoint */ - struct bt_l2cap_br_endpoint rx; - /** Channel Transmission Endpoint */ - struct bt_l2cap_br_endpoint tx; - /* For internal use only */ - atomic_t flags[1]; + /** Common L2CAP channel reference object */ + struct bt_l2cap_chan chan; + /** Channel Receiving Endpoint */ + struct bt_l2cap_br_endpoint rx; + /** Channel Transmission Endpoint */ + struct bt_l2cap_br_endpoint tx; + /* For internal use only */ + atomic_t flags[1]; }; /** @brief L2CAP Channel operations structure. */ struct bt_l2cap_chan_ops { - /** Channel connected callback - * - * If this callback is provided it will be called whenever the - * connection completes. - * - * @param chan The channel that has been connected - */ - void (*connected)(struct bt_l2cap_chan *chan); + /** Channel connected callback + * + * If this callback is provided it will be called whenever the + * connection completes. + * + * @param chan The channel that has been connected + */ + void (*connected)(struct bt_l2cap_chan *chan); - /** Channel disconnected callback - * - * If this callback is provided it will be called whenever the - * channel is disconnected, including when a connection gets - * rejected. - * - * @param chan The channel that has been Disconnected - */ - void (*disconnected)(struct bt_l2cap_chan *chan); + /** Channel disconnected callback + * + * If this callback is provided it will be called whenever the + * channel is disconnected, including when a connection gets + * rejected. + * + * @param chan The channel that has been Disconnected + */ + void (*disconnected)(struct bt_l2cap_chan *chan); - /** Channel encrypt_change callback - * - * If this callback is provided it will be called whenever the - * security level changed (indirectly link encryption done) or - * authentication procedure fails. In both cases security initiator - * and responder got the final status (HCI status) passed by - * related to encryption and authentication events from local host's - * controller. - * - * @param chan The channel which has made encryption status changed. - * @param status HCI status of performed security procedure caused - * by channel security requirements. The value is populated - * by HCI layer and set to 0 when success and to non-zero (reference to - * HCI Error Codes) when security/authentication failed. - */ - void (*encrypt_change)(struct bt_l2cap_chan *chan, u8_t hci_status); + /** Channel encrypt_change callback + * + * If this callback is provided it will be called whenever the + * security level changed (indirectly link encryption done) or + * authentication procedure fails. In both cases security initiator + * and responder got the final status (HCI status) passed by + * related to encryption and authentication events from local host's + * controller. + * + * @param chan The channel which has made encryption status changed. + * @param status HCI status of performed security procedure caused + * by channel security requirements. The value is populated + * by HCI layer and set to 0 when success and to non-zero (reference to + * HCI Error Codes) when security/authentication failed. + */ + void (*encrypt_change)(struct bt_l2cap_chan *chan, u8_t hci_status); - /** Channel alloc_buf callback - * - * If this callback is provided the channel will use it to allocate - * buffers to store incoming data. - * - * @param chan The channel requesting a buffer. - * - * @return Allocated buffer. - */ - struct net_buf *(*alloc_buf)(struct bt_l2cap_chan *chan); + /** Channel alloc_buf callback + * + * If this callback is provided the channel will use it to allocate + * buffers to store incoming data. + * + * @param chan The channel requesting a buffer. + * + * @return Allocated buffer. + */ + struct net_buf *(*alloc_buf)(struct bt_l2cap_chan *chan); - /** Channel recv callback - * - * @param chan The channel receiving data. - * @param buf Buffer containing incoming data. - * - * @return 0 in case of success or negative value in case of error. - * If -EINPROGRESS is returned user has to confirm once the data has - * been processed by calling bt_l2cap_chan_recv_complete passing back - * the buffer received with its original user_data which contains the - * number of segments/credits used by the packet. - */ - int (*recv)(struct bt_l2cap_chan *chan, struct net_buf *buf); + /** Channel recv callback + * + * @param chan The channel receiving data. + * @param buf Buffer containing incoming data. + * + * @return 0 in case of success or negative value in case of error. + * If -EINPROGRESS is returned user has to confirm once the data has + * been processed by calling bt_l2cap_chan_recv_complete passing back + * the buffer received with its original user_data which contains the + * number of segments/credits used by the packet. + */ + int (*recv)(struct bt_l2cap_chan *chan, struct net_buf *buf); - /* Channel sent callback - * - * If this callback is provided it will be called whenever a SDU has - * been completely sent. - * - * @param chan The channel which has sent data. - */ - void (*sent)(struct bt_l2cap_chan *chan); + /* Channel sent callback + * + * If this callback is provided it will be called whenever a SDU has + * been completely sent. + * + * @param chan The channel which has sent data. + */ + void (*sent)(struct bt_l2cap_chan *chan); - /* Channel status callback - * - * If this callback is provided it will be called whenever the - * channel status changes. - * - * @param chan The channel which status changed - * @param status The channel status - */ - void (*status)(struct bt_l2cap_chan *chan, atomic_t *status); + /* Channel status callback + * + * If this callback is provided it will be called whenever the + * channel status changes. + * + * @param chan The channel which status changed + * @param status The channel status + */ + void (*status)(struct bt_l2cap_chan *chan, atomic_t *status); #if defined(BFLB_BLE_MTU_CHANGE_CB) - void (*mtu_changed)(struct bt_l2cap_chan *chan, u16_t mtu); + void (*mtu_changed)(struct bt_l2cap_chan *chan, u16_t mtu); #endif }; @@ -255,40 +256,40 @@ struct bt_l2cap_chan_ops { /** @brief L2CAP Server structure. */ struct bt_l2cap_server { - /** Server PSM. Possible values: - * - * 0 A dynamic value will be auto-allocated when - * bt_l2cap_server_register() is called. - * - * 0x0001-0x007f Standard, Bluetooth SIG-assigned fixed values. - * - * 0x0080-0x00ff Dynamically allocated. May be pre-set by the - * application before server registration (not - * recommended however), or auto-allocated by the - * stack if the app gave 0 as the value. - */ - u16_t psm; + /** Server PSM. Possible values: + * + * 0 A dynamic value will be auto-allocated when + * bt_l2cap_server_register() is called. + * + * 0x0001-0x007f Standard, Bluetooth SIG-assigned fixed values. + * + * 0x0080-0x00ff Dynamically allocated. May be pre-set by the + * application before server registration (not + * recommended however), or auto-allocated by the + * stack if the app gave 0 as the value. + */ + u16_t psm; - /** Required minimim security level */ - bt_security_t sec_level; + /** Required minimim security level */ + bt_security_t sec_level; - /** Server accept callback - * - * This callback is called whenever a new incoming connection requires - * authorization. - * - * @param conn The connection that is requesting authorization - * @param chan Pointer to received the allocated channel - * - * @return 0 in case of success or negative value in case of error. - * Possible return values: - * -ENOMEM if no available space for new channel. - * -EACCES if application did not authorize the connection. - * -EPERM if encryption key size is too short. - */ - int (*accept)(struct bt_conn *conn, struct bt_l2cap_chan **chan); + /** Server accept callback + * + * This callback is called whenever a new incoming connection requires + * authorization. + * + * @param conn The connection that is requesting authorization + * @param chan Pointer to received the allocated channel + * + * @return 0 in case of success or negative value in case of error. + * Possible return values: + * -ENOMEM if no available space for new channel. + * -EACCES if application did not authorize the connection. + * -EPERM if encryption key size is too short. + */ + int (*accept)(struct bt_conn *conn, struct bt_l2cap_chan **chan); - sys_snode_t node; + sys_snode_t node; }; /** @brief Register L2CAP server. @@ -342,7 +343,8 @@ int bt_l2cap_br_server_register(struct bt_l2cap_server *server); * * @return 0 in case of success or negative value in case of error. */ -int bt_l2cap_chan_connect(struct bt_conn *conn, struct bt_l2cap_chan *chan, u16_t psm); +int bt_l2cap_chan_connect(struct bt_conn *conn, struct bt_l2cap_chan *chan, + u16_t psm); /** @brief Disconnect L2CAP channel * @@ -380,7 +382,8 @@ int bt_l2cap_chan_send(struct bt_l2cap_chan *chan, struct net_buf *buf); * * @return 0 in case of success or negative value in case of error. */ -int bt_l2cap_chan_recv_complete(struct bt_l2cap_chan *chan, struct net_buf *buf); +int bt_l2cap_chan_recv_complete(struct bt_l2cap_chan *chan, + struct net_buf *buf); #ifdef __cplusplus } diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/uuid.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/uuid.h index dcfbc92e..8483b16e 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/uuid.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/bluetooth/uuid.h @@ -69,11 +69,11 @@ struct bt_uuid_128 { } #define BT_UUID_DECLARE_16(value) \ - ((struct bt_uuid *)(&(struct bt_uuid_16)BT_UUID_INIT_16(value))) + ((struct bt_uuid *)((struct bt_uuid_16[]){ BT_UUID_INIT_16(value) })) #define BT_UUID_DECLARE_32(value) \ - ((struct bt_uuid *)(&(struct bt_uuid_32)BT_UUID_INIT_32(value))) + ((struct bt_uuid *)((struct bt_uuid_32[]){ BT_UUID_INIT_32(value) })) #define BT_UUID_DECLARE_128(value...) \ - ((struct bt_uuid *)(&(struct bt_uuid_128)BT_UUID_INIT_128(value))) + ((struct bt_uuid *)((struct bt_uuid_128[]){ BT_UUID_INIT_128(value) })) #define BT_UUID_16(__u) CONTAINER_OF(__u, struct bt_uuid_16, uuid) #define BT_UUID_32(__u) CONTAINER_OF(__u, struct bt_uuid_32, uuid) diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/drivers/bluetooth/hci_driver.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/drivers/bluetooth/hci_driver.h index 2cb23d06..3bc5d40b 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/drivers/bluetooth/hci_driver.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/include/drivers/bluetooth/hci_driver.h @@ -194,10 +194,6 @@ void hci_driver_enque_recvq(struct net_buf *buf); int hci_driver_init(void); -#if (BFLB_BLE_CO_THREAD) -void co_tx_thread(); -#endif - #endif //#if (BFLB_BLE) #ifdef __cplusplus diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/bl_port.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/bl_port.c index 05687274..a4b407b8 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/bl_port.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/bl_port.c @@ -28,7 +28,6 @@ extern int bl_rand(); int ble_rand() { #if defined(CONFIG_HW_SEC_ENG_DISABLE) - extern long random(void); return random(); #else return bl_rand(); @@ -56,7 +55,7 @@ int bl_rand() { void k_queue_init(struct k_queue *queue, int size) { // int size = 20; - uint8_t blk_size = sizeof(void *) + 1; + uint8_t blk_size = sizeof(void *); queue->hdl = xQueueCreate(size, blk_size); BT_ASSERT(queue->hdl != NULL); @@ -209,17 +208,25 @@ int k_thread_create(struct k_thread *new_thread, const char *name, size_t stack_ return new_thread->task ? 0 : -1; } -void k_thread_delete(struct k_thread *new_thread) { - if (NULL == new_thread || 0 == new_thread->task) { +void k_thread_delete(struct k_thread *thread) { + if (NULL == thread || 0 == thread->task) { BT_ERR("task is NULL\n"); return; } - vTaskDelete((void *)(new_thread->task)); - new_thread->task = 0; + vTaskDelete((void *)(thread->task)); + thread->task = 0; return; } +bool k_is_current_thread(struct k_thread *thread) { + eTaskState thread_state = eTaskGetState((void *)(thread->task)); + if (thread_state == eRunning) + return true; + else + return false; +} + int k_yield(void) { taskYIELD(); return 0; @@ -307,12 +314,24 @@ void k_timer_delete(k_timer_t *timer) { long long k_now_ms(void) { return (long long)(xTaskGetTickCount() * 1000) / configTICK_RATE_HZ; } void k_get_random_byte_array(uint8_t *buf, size_t len) { - // bl_rand() return a word, but *buf may not be word-aligned + // ble_rand() return a word, but *buf may not be word-aligned for (int i = 0; i < len; i++) { *(buf + i) = (uint8_t)(ble_rand() & 0xFF); } } -void *k_malloc(size_t size) { return pvPortMalloc(size); } +void *k_malloc(size_t size) { +#if defined(CFG_USE_PSRAM) + return pvPortMallocPsram(size); +#else + return pvPortMalloc(size); +#endif /* CFG_USE_PSRAM */ +} -void k_free(void *buf) { return vPortFree(buf); } +void k_free(void *buf) { +#if defined(CFG_USE_PSRAM) + return vPortFreePsram(buf); +#else + return vPortFree(buf); +#endif +} diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/include/bl_port.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/include/bl_port.h index 266aa530..6fea9235 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/include/bl_port.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/include/bl_port.h @@ -3,11 +3,12 @@ #if defined(BL_MCU_SDK) #include "misc.h" #endif -#include +#include "ble_config.h" #include #include #include #include +#include #include #include "types.h" #include "bl_port.h" @@ -242,6 +243,8 @@ int k_thread_create(struct k_thread *new_thread, const char *name, void k_thread_delete(struct k_thread *new_thread); +bool k_is_current_thread(struct k_thread *thread); + /** * @brief Yield the current thread. */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/include/ble_config.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/include/ble_config.h index 9c4d83d6..6bb803e3 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/include/ble_config.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/include/ble_config.h @@ -2,16 +2,13 @@ #define BLE_CONFIG_H #include "FreeRTOSConfig.h" -#ifdef __cplusplus -extern "C" { -#endif /** * CONFIG_BLUETOOTH: Enable the bluetooh stack */ -//#ifndef CONFIG_BLUETOOTH -//#error "CONFIG_BLUETOOTH not defined,this header shoudn't include" -//#endif +// #ifndef CONFIG_BLUETOOTH +// #error "CONFIG_BLUETOOTH not defined,this header shoudn't include" +// #endif #ifdef CONFIG_BT_BONDABLE #undef CONFIG_BT_BONDABLE @@ -26,25 +23,25 @@ extern "C" { #define PTS_CHARC_LEN_EQUAL_MTU_SIZE #endif -//#ifndef CONFIG_BT_STACK_PTS_SM_SLA_KDU_BI_01 -//#define CONFIG_BT_STACK_PTS_SM_SLA_KDU_BI_01 -//#endif +// #ifndef CONFIG_BT_STACK_PTS_SM_SLA_KDU_BI_01 +// #define CONFIG_BT_STACK_PTS_SM_SLA_KDU_BI_01 +// #endif -//#ifndef PTS_GAP_SLAVER_CONFIG_READ_CHARC -//#define PTS_GAP_SLAVER_CONFIG_READ_CHARC -//#endif +// #ifndef PTS_GAP_SLAVER_CONFIG_READ_CHARC +// #define PTS_GAP_SLAVER_CONFIG_READ_CHARC +// #endif -//#ifndef PTS_GAP_SLAVER_CONFIG_WRITE_CHARC -//#define PTS_GAP_SLAVER_CONFIG_WRITE_CHARC -//#endif +// #ifndef PTS_GAP_SLAVER_CONFIG_WRITE_CHARC +// #define PTS_GAP_SLAVER_CONFIG_WRITE_CHARC +// #endif -//#ifndef PTS_GAP_SLAVER_CONFIG_NOTIFY_CHARC -//#define PTS_GAP_SLAVER_CONFIG_NOTIFY_CHARC -//#endif +// #ifndef PTS_GAP_SLAVER_CONFIG_NOTIFY_CHARC +// #define PTS_GAP_SLAVER_CONFIG_NOTIFY_CHARC +// #endif -//#ifndef PTS_GAP_SLAVER_CONFIG_INDICATE_CHARC -//#define PTS_GAP_SLAVER_CONFIG_INDICATE_CHARC -//#endif +// #ifndef PTS_GAP_SLAVER_CONFIG_INDICATE_CHARC +// #define PTS_GAP_SLAVER_CONFIG_INDICATE_CHARC +// #endif #define CONFIG_BT_GATT_READ_MULTIPLE 1 #endif @@ -55,13 +52,31 @@ extern "C" { #define CONFIG_BT_HCI_RX_STACK_SIZE 512 #endif +/** + * BL_BLE_CO_THREAD: combine tx rx thread + */ +#define BFLB_BT_CO_THREAD 1 + +#if (BFLB_BT_CO_THREAD) +#define CONFIG_BT_CO_TASK_PRIO (configMAX_PRIORITIES - 3) +#if defined(CONFIG_BT_MESH) +#define CONFIG_BT_CO_STACK_SIZE 3072 // 2048//1536//1024 +#else +#define CONFIG_BT_CO_STACK_SIZE 2048 // 2048//1536//1024 +#endif +#endif + #ifndef CONFIG_BT_RX_STACK_SIZE #if defined(CONFIG_BT_MESH) #define CONFIG_BT_RX_STACK_SIZE 3072 // 2048//1536//1024 #else +#if !defined(CONFIG_BT_CONN) +#define CONFIG_BT_RX_STACK_SIZE 1024 +#else #define CONFIG_BT_RX_STACK_SIZE 2048 // 1536//1024 #endif #endif +#endif #ifndef CONFIG_BT_CTLR_RX_PRIO_STACK_SIZE #define CONFIG_BT_CTLR_RX_PRIO_STACK_SIZE 156 @@ -77,8 +92,12 @@ extern "C" { */ #ifndef CONFIG_BT_HCI_TX_STACK_SIZE +#if !defined(CONFIG_BT_CONN) +#define CONFIG_BT_HCI_TX_STACK_SIZE 1024 +#else #define CONFIG_BT_HCI_TX_STACK_SIZE 1536 // 1024//200 #endif +#endif /** * CONFIG_BT_HCI_TX_PRIO: tx thread priority @@ -91,13 +110,6 @@ extern "C" { #define CONFIG_BT_CTLR_RX_PRIO (configMAX_PRIORITIES - 4) #endif -/** - * BL_BLE_CO_THREAD: combine tx rx thread - */ -#ifndef BFLB_BLE_CO_THREAD -#define BFLB_BLE_CO_THREAD 0 -#endif - /** * CONFIG_BT_HCI_CMD_COUNT: hci cmd buffer count,range 2 to 64 */ @@ -291,9 +303,13 @@ extern "C" { * range 1 to 65535,seconds */ #ifndef CONFIG_BT_RPA_TIMEOUT +#if defined(CONFIG_AUTO_PTS) +#define CONFIG_BT_RPA_TIMEOUT 60 +#else #define CONFIG_BT_RPA_TIMEOUT 900 #endif #endif +#endif /** * CONFIG_BT_GATT_DYNAMIC_DB:enables GATT services to be added dynamically to database @@ -355,7 +371,7 @@ extern "C" { #elif defined(BL702) #define CONFIG_BT_DEVICE_NAME "BL702-BLE-DEV" #else -#define CONFIG_BT_DEVICE_NAME "BL606P-BTBLE" +#define CONFIG_BT_DEVICE_NAME "BTBLE-DEV" #endif #endif #endif @@ -384,9 +400,13 @@ extern "C" { #ifndef CONFIG_BT_MESH #define CONFIG_BT_WORK_QUEUE_STACK_SIZE 1536 // 1280//512 #else +#if !defined(CONFIG_BT_CONN) +#define CONFIG_BT_WORK_QUEUE_STACK_SIZE 1024 +#else #define CONFIG_BT_WORK_QUEUE_STACK_SIZE 2048 #endif /* CONFIG_BT_MESH */ #endif +#endif /** * CONFIG_BT_WORK_QUEUE_PRIO:Work queue priority. @@ -520,7 +540,7 @@ extern "C" { #define CONFIG_BT_ID_MAX 1 #endif -//#define PTS_GAP_SLAVER_CONFIG_NOTIFY_CHARC 1 +// #define PTS_GAP_SLAVER_CONFIG_NOTIFY_CHARC 1 #ifndef CONFIG_BT_L2CAP_TX_FRAG_COUNT #define CONFIG_BT_L2CAP_TX_FRAG_COUNT 0 @@ -543,6 +563,10 @@ extern "C" { #define CONFIG_BT_PERIPHERAL_PREF_TIMEOUT 400 #endif +#ifndef CONFIG_BT_PHY_UPDATE +#define CONFIG_BT_PHY_UPDATE 1 +#endif + #if defined(CONFIG_BT_BREDR) #define CONFIG_BT_PAGE_TIMEOUT 0x2000 // 5.12s #define CONFIG_BT_L2CAP_RX_MTU 672 @@ -564,17 +588,25 @@ extern "C" { /*******************************Bouffalo Lab Modification******************************/ -//#define BFLB_BLE_DISABLE_STATIC_ATTR -//#define BFLB_BLE_DISABLE_STATIC_CHANNEL +// #define BFLB_BLE_DISABLE_STATIC_ATTR +// #define BFLB_BLE_DISABLE_STATIC_CHANNEL #define BFLB_DISABLE_BT #define BFLB_FIXED_IRK 0 #define BFLB_DYNAMIC_ALLOC_MEM +#if defined(CFG_BLE_PDS) && defined(BL702) && defined(BFLB_BLE) && defined(BFLB_DYNAMIC_ALLOC_MEM) +#define BFLB_STATIC_ALLOC_MEM 1 +#else +#define BFLB_STATIC_ALLOC_MEM 0 +#endif +#define CONFIG_BT_SCAN_WITH_IDENTITY 1 + #if defined(CONFIG_AUTO_PTS) +#define CONFIG_BT_L2CAP_DYNAMIC_CHANNEL #define CONFIG_BT_DEVICE_NAME_GATT_WRITABLE 1 #define CONFIG_BT_GATT_SERVICE_CHANGED 1 #define CONFIG_BT_GATT_CACHING 1 #define CONFIG_BT_SCAN_WITH_IDENTITY 1 -//#define CONFIG_BT_ADV_WITH_PUBLIC_ADDR 1 +// #define CONFIG_BT_ADV_WITH_PUBLIC_ADDR 1 #define CONFIG_BT_ATT_PREPARE_COUNT 64 #endif #endif // BFLB_BLE @@ -590,9 +622,11 @@ happens, which cause memory leak issue.*/ /*To avoid duplicated pubkey callback.*/ #define BFLB_BLE_PATCH_AVOID_DUPLI_PUBKEY_CB /*The flag @conn_ref is not clean up after disconnect*/ -#define BFLB_BLE_PATCH_CLEAN_UP_CONNECT_REF +// #define BFLB_BLE_PATCH_CLEAN_UP_CONNECT_REF +#if !defined(CONFIG_AUTO_PTS) /*To avoid sevice changed indication sent at the very beginning, without any new service added.*/ #define BFLB_BLE_PATCH_SET_SCRANGE_CHAGD_ONLY_IN_CONNECTED_STATE +#endif #ifdef CONFIG_BT_SETTINGS /*Semaphore is used during flash operation. Make sure that freertos has already run up when it intends to write information to flash.*/ @@ -610,10 +644,14 @@ BT_SMP_DIST_ENC_KEY bit is not cleared while remote ENC_KEY is received.*/ #define BFLB_BLE_PATCH_CLEAR_REMOTE_KEY_BIT #if defined(CONFIG_BT_CENTRAL) || defined(CONFIG_BT_OBSERVER) -// #define BFLB_BLE_NOTIFY_ADV_DISCARDED +#if defined(BL602) || defined(BL702) +#define BFLB_BLE_NOTIFY_ADV_DISCARDED #endif -#ifdef __cplusplus -}; +#endif + +#if defined(CONFIG_BT_CENTRAL) +#define BFLB_BLE_NOTIFY_ALL +#define BFLB_BLE_DISCOVER_ONGOING #endif #endif /* BLE_CONFIG_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/include/zephyr.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/include/zephyr.h index 8282ed76..2b064112 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/include/zephyr.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/port/include/zephyr.h @@ -2,7 +2,6 @@ #define ZEPHYR_H #include #include -#include #include #include @@ -129,7 +128,11 @@ struct k_poll_signal { } extern int k_poll_signal_raise(struct k_poll_signal *signal, int result); +#if (BFLB_BT_CO_THREAD) +extern int k_poll(struct k_poll_event *events, int num_events, int total_evt_array_cnt, s32_t timeout, u8_t *to_process); +#else extern int k_poll(struct k_poll_event *events, int num_events, s32_t timeout); +#endif extern void k_poll_event_init(struct k_poll_event *event, u32_t type, int mode, void *obj); /* public - polling modes */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/alloc.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/alloc.c deleted file mode 100644 index b9c54507..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/alloc.c +++ /dev/null @@ -1,77 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -#include -#include - -#if defined(SBC_DEC_INCLUDED) - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -PRIVATE OI_STATUS OI_CODEC_SBC_Alloc(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_UINT32 *codecDataAligned, OI_UINT32 codecDataBytes, OI_UINT8 maxChannels, OI_UINT8 pcmStride) { - int i; - size_t filterBufferCount; - size_t subdataSize; - OI_BYTE *codecData = (OI_BYTE *)codecDataAligned; - - if (maxChannels < 1 || maxChannels > 2) { - return OI_STATUS_INVALID_PARAMETERS; - } - - if (pcmStride < 1 || pcmStride > maxChannels) { - return OI_STATUS_INVALID_PARAMETERS; - } - - common->maxChannels = maxChannels; - common->pcmStride = pcmStride; - - /* Compute sizes needed for the memory regions, and bail if we don't have - * enough memory for them. */ - subdataSize = maxChannels * sizeof(common->subdata[0]) * SBC_MAX_BANDS * SBC_MAX_BLOCKS; - if (subdataSize > codecDataBytes) { - return OI_STATUS_OUT_OF_MEMORY; - } - - filterBufferCount = (codecDataBytes - subdataSize) / (sizeof(common->filterBuffer[0][0]) * SBC_MAX_BANDS * maxChannels); - if (filterBufferCount < SBC_CODEC_MIN_FILTER_BUFFERS) { - return OI_STATUS_OUT_OF_MEMORY; - } - common->filterBufferLen = filterBufferCount * SBC_MAX_BANDS; - - /* Allocate memory for the subband data */ - common->subdata = (OI_INT32 *)codecData; - codecData += subdataSize; - OI_ASSERT(codecDataBytes >= subdataSize); - codecDataBytes -= subdataSize; - - /* Allocate memory for the synthesis buffers */ - for (i = 0; i < maxChannels; ++i) { - size_t allocSize = common->filterBufferLen * sizeof(common->filterBuffer[0][0]); - common->filterBuffer[i] = (SBC_BUFFER_T *)codecData; - OI_ASSERT(codecDataBytes >= allocSize); - codecData += allocSize; - codecDataBytes -= allocSize; - } - - return OI_OK; -} - -#endif /* #if defined(SBC_DEC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/bitalloc-sbc.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/bitalloc-sbc.c deleted file mode 100644 index f903dc8a..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/bitalloc-sbc.c +++ /dev/null @@ -1,149 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -/** @file -@ingroup codec_internal -*/ - -/**@addgroup codec_internal*/ -/**@{*/ -#include - -#if defined(SBC_DEC_INCLUDED) - -static void dualBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common) { - OI_UINT bitcountL; - OI_UINT bitcountR; - OI_UINT bitpoolPreferenceL = 0; - OI_UINT bitpoolPreferenceR = 0; - BITNEED_UNION1 bitneedsL; - BITNEED_UNION1 bitneedsR; - - bitcountL = computeBitneed(common, bitneedsL.uint8, 0, &bitpoolPreferenceL); - bitcountR = computeBitneed(common, bitneedsR.uint8, 1, &bitpoolPreferenceR); - - oneChannelBitAllocation(common, &bitneedsL, 0, bitcountL); - oneChannelBitAllocation(common, &bitneedsR, 1, bitcountR); -} - -static void stereoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common) { - const OI_UINT nrof_subbands = common->frameInfo.nrof_subbands; - BITNEED_UNION2 bitneeds; - OI_UINT excess; - OI_INT bitadjust; - OI_UINT bitcount; - OI_UINT sbL; - OI_UINT sbR; - OI_UINT bitpoolPreference = 0; - - bitcount = computeBitneed(common, &bitneeds.uint8[0], 0, &bitpoolPreference); - bitcount += computeBitneed(common, &bitneeds.uint8[nrof_subbands], 1, &bitpoolPreference); - - { - OI_UINT ex; - bitadjust = adjustToFitBitpool(common->frameInfo.bitpool, bitneeds.uint32, 2 * nrof_subbands, bitcount, &ex); - /* We want the compiler to put excess into a register */ - excess = ex; - } - sbL = 0; - sbR = nrof_subbands; - while (sbL < nrof_subbands) { - excess = allocAdjustedBits(&common->bits.uint8[sbL], bitneeds.uint8[sbL] + bitadjust, excess); - ++sbL; - excess = allocAdjustedBits(&common->bits.uint8[sbR], bitneeds.uint8[sbR] + bitadjust, excess); - ++sbR; - } - sbL = 0; - sbR = nrof_subbands; - while (excess) { - excess = allocExcessBits(&common->bits.uint8[sbL], excess); - ++sbL; - if (!excess) { - break; - } - excess = allocExcessBits(&common->bits.uint8[sbR], excess); - ++sbR; - } -} - -static const BIT_ALLOC balloc[] = { - monoBitAllocation, /* SBC_MONO */ - dualBitAllocation, /* SBC_DUAL_CHANNEL */ - stereoBitAllocation, /* SBC_STEREO */ - stereoBitAllocation /* SBC_JOINT_STEREO */ -}; - -PRIVATE void OI_SBC_ComputeBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common) { - OI_ASSERT(common->frameInfo.bitpool <= OI_SBC_MaxBitpool(&common->frameInfo)); - OI_ASSERT(common->frameInfo.mode < OI_ARRAYSIZE(balloc)); - - /* - * Using an array of function pointers prevents the compiler from creating a suboptimal - * monolithic inlined bit allocation function. - */ - balloc[common->frameInfo.mode](common); -} - -OI_UINT32 OI_CODEC_SBC_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame) { return internal_CalculateBitrate(frame); } - -/* - * Return the current maximum bitneed and clear it. - */ -OI_UINT8 OI_CODEC_SBC_GetMaxBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common) { - OI_UINT8 max = common->maxBitneed; - - common->maxBitneed = 0; - return max; -} - -/* - * Calculates the bitpool size for a given frame length - */ -OI_UINT16 OI_CODEC_SBC_CalculateBitpool(OI_CODEC_SBC_FRAME_INFO *frame, OI_UINT16 frameLen) { - OI_UINT16 nrof_subbands = frame->nrof_subbands; - OI_UINT16 nrof_blocks = frame->nrof_blocks; - OI_UINT16 hdr; - OI_UINT16 bits; - - if (frame->mode == SBC_JOINT_STEREO) { - hdr = 9 * nrof_subbands; - } else { - if (frame->mode == SBC_MONO) { - hdr = 4 * nrof_subbands; - } else { - hdr = 8 * nrof_subbands; - } - if (frame->mode == SBC_DUAL_CHANNEL) { - nrof_blocks *= 2; - } - } - bits = 8 * (frameLen - SBC_HEADER_LEN) - hdr; - return DIVIDE(bits, nrof_blocks); -} - -OI_UINT16 OI_CODEC_SBC_CalculatePcmBytes(OI_CODEC_SBC_COMMON_CONTEXT *common) { return sizeof(OI_INT16) * common->pcmStride * common->frameInfo.nrof_subbands * common->frameInfo.nrof_blocks; } - -OI_UINT16 OI_CODEC_SBC_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame) { return internal_CalculateFramelen(frame); } - -/**@}*/ -#endif /* #if defined(SBC_DEC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/bitalloc.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/bitalloc.c deleted file mode 100644 index 8954dfb3..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/bitalloc.c +++ /dev/null @@ -1,370 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/********************************************************************************** - $Revision: #1 $ - ***********************************************************************************/ - -/** -@file - -The functions in this file relate to the allocation of available bits to -subbands within the SBC/eSBC frame, along with support functions for computing -frame length and bitrate. - -@ingroup codec_internal -*/ - -/** -@addtogroup codec_internal -@{ -*/ - -#include "oi_utils.h" -#include - -#if defined(SBC_DEC_INCLUDED) - -OI_UINT32 OI_SBC_MaxBitpool(OI_CODEC_SBC_FRAME_INFO *frame) { - switch (frame->mode) { - case SBC_MONO: - case SBC_DUAL_CHANNEL: - return 16 * frame->nrof_subbands; - case SBC_STEREO: - case SBC_JOINT_STEREO: - return 32 * frame->nrof_subbands; - } - - ERROR(("Invalid frame mode %d", frame->mode)); - OI_ASSERT(FALSE); - return 0; /* Should never be reached */ -} - -PRIVATE OI_UINT16 internal_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame) { - OI_UINT16 nbits = frame->nrof_blocks * frame->bitpool; - OI_UINT16 nrof_subbands = frame->nrof_subbands; - OI_UINT16 result = nbits; - - if (frame->mode == SBC_JOINT_STEREO) { - result += nrof_subbands + (8 * nrof_subbands); - } else { - if (frame->mode == SBC_DUAL_CHANNEL) { - result += nbits; - } - if (frame->mode == SBC_MONO) { - result += 4 * nrof_subbands; - } else { - result += 8 * nrof_subbands; - } - } - return SBC_HEADER_LEN + (result + 7) / 8; -} - -PRIVATE OI_UINT32 internal_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame) { - OI_UINT blocksbands; - blocksbands = frame->nrof_subbands * frame->nrof_blocks; - - return DIVIDE(8 * internal_CalculateFramelen(frame) * frame->frequency, blocksbands); -} - -INLINE OI_UINT16 OI_SBC_CalculateFrameAndHeaderlen(OI_CODEC_SBC_FRAME_INFO *frame, OI_UINT *headerLen_) { - OI_UINT headerLen = SBC_HEADER_LEN + frame->nrof_subbands * frame->nrof_channels / 2; - - if (frame->mode == SBC_JOINT_STEREO) { - headerLen++; - } - - *headerLen_ = headerLen; - return internal_CalculateFramelen(frame); -} - -#define MIN(x, y) ((x) < (y) ? (x) : (y)) - -/* - * Computes the bit need for each sample and as also returns a counts of bit needs that are greater - * than one. This count is used in the first phase of bit allocation. - * - * We also compute a preferred bitpool value that this is the minimum bitpool needed to guarantee - * lossless representation of the audio data. The preferred bitpool may be larger than the bits - * actually required but the only input we have are the scale factors. For example, it takes 2 bits - * to represent values in the range -1 .. +1 but the scale factor is 0. To guarantee lossless - * representation we add 2 to each scale factor and sum them to come up with the preferred bitpool. - * This is not ideal because 0 requires 0 bits but we currently have no way of knowing this. - * - * @param bitneed Array to return bitneeds for each subband - * - * @param ch Channel 0 or 1 - * - * @param preferredBitpool Returns the number of reserved bits - * - * @return The SBC bit need - * - */ -OI_UINT computeBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_UINT8 *bitneeds, OI_UINT ch, OI_UINT *preferredBitpool) { - static const OI_INT8 offset4[4][4] = { - {-1, 0, 0, 0}, - {-2, 0, 0, 1}, - {-2, 0, 0, 1}, - {-2, 0, 0, 1} - }; - - static const OI_INT8 offset8[4][8] = { - {-2, 0, 0, 0, 0, 0, 0, 1}, - {-3, 0, 0, 0, 0, 0, 1, 2}, - {-4, 0, 0, 0, 0, 0, 1, 2}, - {-4, 0, 0, 0, 0, 0, 1, 2} - }; - - const OI_UINT nrof_subbands = common->frameInfo.nrof_subbands; - OI_UINT sb; - OI_INT8 *scale_factor = &common->scale_factor[ch ? nrof_subbands : 0]; - OI_UINT bitcount = 0; - OI_UINT8 maxBits = 0; - OI_UINT8 prefBits = 0; - - if (common->frameInfo.alloc == SBC_SNR) { - for (sb = 0; sb < nrof_subbands; sb++) { - OI_INT bits = scale_factor[sb]; - if (bits > maxBits) { - maxBits = bits; - } - if ((bitneeds[sb] = bits) > 1) { - bitcount += bits; - } - prefBits += 2 + bits; - } - } else { - const OI_INT8 *offset; - if (nrof_subbands == 4) { - offset = offset4[common->frameInfo.freqIndex]; - } else { - offset = offset8[common->frameInfo.freqIndex]; - } - for (sb = 0; sb < nrof_subbands; sb++) { - OI_INT bits = scale_factor[sb]; - if (bits > maxBits) { - maxBits = bits; - } - prefBits += 2 + bits; - if (bits) { - bits -= offset[sb]; - if (bits > 0) { - bits /= 2; - } - bits += 5; - } - if ((bitneeds[sb] = bits) > 1) { - bitcount += bits; - } - } - } - common->maxBitneed = OI_MAX(maxBits, common->maxBitneed); - *preferredBitpool += prefBits; - return bitcount; -} - -/* - * Explanation of the adjustToFitBitpool inner loop. - * - * The inner loop computes the effect of adjusting the bit allocation up or - * down. Allocations must be 0 or in the range 2..16. This is accomplished by - * the following code: - * - * for (s = bands - 1; s >= 0; --s) { - * OI_INT bits = bitadjust + bitneeds[s]; - * bits = bits < 2 ? 0 : bits; - * bits = bits > 16 ? 16 : bits; - * count += bits; - * } - * - * This loop can be optimized to perform 4 operations at a time as follows: - * - * Adjustment is computed as a 7 bit signed value and added to the bitneed. - * - * Negative allocations are zeroed by masking. (n & 0x40) >> 6 puts the - * sign bit into bit 0, adding this to 0x7F give us a mask of 0x80 - * for -ve values and 0x7F for +ve values. - * - * n &= 0x7F + (n & 0x40) >> 6) - * - * Allocations greater than 16 are truncated to 16. Adjusted allocations are in - * the range 0..31 so we know that bit 4 indicates values >= 16. We use this bit - * to create a mask that zeroes bits 0 .. 3 if bit 4 is set. - * - * n &= (15 + (n >> 4)) - * - * Allocations of 1 are disallowed. Add and shift creates a mask that - * eliminates the illegal value - * - * n &= ((n + 14) >> 4) | 0x1E - * - * These operations can be performed in 8 bits without overflowing so we can - * operate on 4 values at once. - */ - -/* - * Encoder/Decoder - * - * Computes adjustment +/- of bitneeds to fill bitpool and returns overall - * adjustment and excess bits. - * - * @param bitpool The bitpool we have to work within - * - * @param bitneeds An array of bit needs (more acturately allocation prioritities) for each - * subband across all blocks in the SBC frame - * - * @param subbands The number of subbands over which the adkustment is calculated. For mono and - * dual mode this is 4 or 8, for stereo or joint stereo this is 8 or 16. - * - * @param bitcount A starting point for the adjustment - * - * @param excess Returns the excess bits after the adjustment - * - * @return The adjustment. - */ -OI_INT adjustToFitBitpool(const OI_UINT bitpool, OI_UINT32 *bitneeds, const OI_UINT subbands, OI_UINT bitcount, OI_UINT *excess) { - OI_INT maxBitadjust = 0; - OI_INT bitadjust = (bitcount > bitpool) ? -8 : 8; - OI_INT chop = 8; - - /* - * This is essentially a binary search for the optimal adjustment value. - */ - while ((bitcount != bitpool) && chop) { - OI_UINT32 total = 0; - OI_UINT count; - OI_UINT32 adjust4; - OI_INT i; - - adjust4 = bitadjust & 0x7F; - adjust4 |= (adjust4 << 8); - adjust4 |= (adjust4 << 16); - - for (i = (subbands / 4 - 1); i >= 0; --i) { - OI_UINT32 mask; - OI_UINT32 n = bitneeds[i] + adjust4; - mask = 0x7F7F7F7F + ((n & 0x40404040) >> 6); - n &= mask; - mask = 0x0F0F0F0F + ((n & 0x10101010) >> 4); - n &= mask; - mask = (((n + 0x0E0E0E0E) >> 4) | 0x1E1E1E1E); - n &= mask; - total += n; - } - - count = (total & 0xFFFF) + (total >> 16); - count = (count & 0xFF) + (count >> 8); - - chop >>= 1; - if (count > bitpool) { - bitadjust -= chop; - } else { - maxBitadjust = bitadjust; - bitcount = count; - bitadjust += chop; - } - } - - *excess = bitpool - bitcount; - - return maxBitadjust; -} - -/* - * The bit allocator trys to avoid single bit allocations except as a last resort. So in the case - * where a bitneed of 1 was passed over during the adsjustment phase 2 bits are now allocated. - */ -INLINE OI_INT allocAdjustedBits(OI_UINT8 *dest, OI_INT bits, OI_INT excess) { - if (bits < 16) { - if (bits > 1) { - if (excess) { - ++bits; - --excess; - } - } else if ((bits == 1) && (excess > 1)) { - bits = 2; - excess -= 2; - } else { - bits = 0; - } - } else { - bits = 16; - } - *dest = (OI_UINT8)bits; - return excess; -} - -/* - * Excess bits not allocated by allocaAdjustedBits are allocated round-robin. - */ -INLINE OI_INT allocExcessBits(OI_UINT8 *dest, OI_INT excess) { - if (*dest < 16) { - *dest += 1; - return excess - 1; - } else { - return excess; - } -} - -void oneChannelBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common, BITNEED_UNION1 *bitneeds, OI_UINT ch, OI_UINT bitcount) { - const OI_UINT8 nrof_subbands = common->frameInfo.nrof_subbands; - OI_UINT excess; - OI_UINT sb; - OI_INT bitadjust; - OI_UINT8 RESTRICT *allocBits; - - { - OI_UINT ex; - bitadjust = adjustToFitBitpool(common->frameInfo.bitpool, bitneeds->uint32, nrof_subbands, bitcount, &ex); - /* We want the compiler to put excess into a register */ - excess = ex; - } - - /* - * Allocate adjusted bits - */ - allocBits = &common->bits.uint8[ch ? nrof_subbands : 0]; - - sb = 0; - while (sb < nrof_subbands) { - excess = allocAdjustedBits(&allocBits[sb], bitneeds->uint8[sb] + bitadjust, excess); - ++sb; - } - sb = 0; - while (excess) { - excess = allocExcessBits(&allocBits[sb], excess); - ++sb; - } -} - -void monoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common) { - BITNEED_UNION1 bitneeds; - OI_UINT bitcount; - OI_UINT bitpoolPreference = 0; - - bitcount = computeBitneed(common, bitneeds.uint8, 0, &bitpoolPreference); - - oneChannelBitAllocation(common, &bitneeds, 0, bitcount); -} - -/** -@} -*/ - -#endif /* #if defined(SBC_DEC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/bitstream-decode.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/bitstream-decode.c deleted file mode 100644 index 43d2e61e..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/bitstream-decode.c +++ /dev/null @@ -1,89 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -/** -@file -Functions for manipulating input bitstreams. - -@ingroup codec_internal -*/ - -/** -@addtogroup codec_internal -@{ -*/ - -#include "oi_assert.h" -#include "oi_bitstream.h" -#include "oi_stddefs.h" - -#if defined(SBC_DEC_INCLUDED) - -PRIVATE void OI_BITSTREAM_ReadInit(OI_BITSTREAM *bs, const OI_BYTE *buffer) { - bs->value = ((OI_INT32)buffer[0] << 16) | ((OI_INT32)buffer[1] << 8) | (buffer[2]); - bs->ptr.r = buffer + 3; - bs->bitPtr = 8; -} - -PRIVATE OI_UINT32 OI_BITSTREAM_ReadUINT(OI_BITSTREAM *bs, OI_UINT bits) { - OI_UINT32 result; - - OI_BITSTREAM_READUINT(result, bits, bs->ptr.r, bs->value, bs->bitPtr); - - return result; -} - -PRIVATE OI_UINT8 OI_BITSTREAM_ReadUINT4Aligned(OI_BITSTREAM *bs) { - OI_UINT32 result; - - OI_ASSERT(bs->bitPtr < 16); - OI_ASSERT(bs->bitPtr % 4 == 0); - - if (bs->bitPtr == 8) { - result = bs->value << 8; - bs->bitPtr = 12; - } else { - result = bs->value << 12; - bs->value = (bs->value << 8) | *bs->ptr.r++; - bs->bitPtr = 8; - } - result >>= 28; - OI_ASSERT(result < (1u << 4)); - return (OI_UINT8)result; -} - -PRIVATE OI_UINT8 OI_BITSTREAM_ReadUINT8Aligned(OI_BITSTREAM *bs) { - OI_UINT32 result; - OI_ASSERT(bs->bitPtr == 8); - - result = bs->value >> 16; - bs->value = (bs->value << 8) | *bs->ptr.r++; - - return (OI_UINT8)result; -} - -/** -@} -*/ - -#endif /* #if defined(SBC_DEC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/decoder-oina.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/decoder-oina.c deleted file mode 100644 index 78d6ab90..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/decoder-oina.c +++ /dev/null @@ -1,116 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2006 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/********************************************************************************** - $Revision: #1 $ - ***********************************************************************************/ - -/** -@file -This file exposes OINA-specific interfaces to decoder functions. - -@ingroup codec_internal -*/ - -/** -@addtogroup codec_internal -@{ -*/ - -#include - -#if defined(SBC_DEC_INCLUDED) - -OI_STATUS OI_CODEC_SBC_DecoderConfigureRaw(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BOOL enhanced, OI_UINT8 frequency, OI_UINT8 mode, OI_UINT8 subbands, OI_UINT8 blocks, OI_UINT8 alloc, - OI_UINT8 maxBitpool) { - if (frequency > SBC_FREQ_48000) { - return OI_STATUS_INVALID_PARAMETERS; - } - - if (enhanced) { -#ifdef SBC_ENHANCED - if (subbands != SBC_SUBBANDS_8) { - return OI_STATUS_INVALID_PARAMETERS; - } -#else - return OI_STATUS_INVALID_PARAMETERS; -#endif - } - - if (mode > SBC_JOINT_STEREO) { - return OI_STATUS_INVALID_PARAMETERS; - } - - if (subbands > SBC_SUBBANDS_8) { - return OI_STATUS_INVALID_PARAMETERS; - } - - if (blocks > SBC_BLOCKS_16) { - return OI_STATUS_INVALID_PARAMETERS; - } - - if (alloc > SBC_SNR) { - return OI_STATUS_INVALID_PARAMETERS; - } - -#ifdef SBC_ENHANCED - context->common.frameInfo.enhanced = enhanced; -#else - context->common.frameInfo.enhanced = FALSE; -#endif - context->common.frameInfo.freqIndex = frequency; - context->common.frameInfo.mode = mode; - context->common.frameInfo.subbands = subbands; - context->common.frameInfo.blocks = blocks; - context->common.frameInfo.alloc = alloc; - context->common.frameInfo.bitpool = maxBitpool; - - OI_SBC_ExpandFrameFields(&context->common.frameInfo); - - if (context->common.frameInfo.nrof_channels >= context->common.pcmStride) { - return OI_STATUS_INVALID_PARAMETERS; - } - - return OI_OK; -} - -OI_STATUS OI_CODEC_SBC_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_UINT8 bitpool, const OI_BYTE **frameData, OI_UINT32 *frameBytes, OI_INT16 *pcmData, OI_UINT32 *pcmBytes) { - return internal_DecodeRaw(context, bitpool, frameData, frameBytes, pcmData, pcmBytes); -} - -OI_STATUS OI_CODEC_SBC_DecoderLimit(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BOOL enhanced, OI_UINT8 subbands) { - if (enhanced) { -#ifdef SBC_ENHANCED - context->enhancedEnabled = TRUE; -#else - context->enhancedEnabled = FALSE; -#endif - } else { - context->enhancedEnabled = FALSE; - } - context->restrictSubbands = subbands; - context->limitFrameFormat = TRUE; - return OI_OK; -} - -/** -@} -*/ - -#endif /* #if defined(SBC_DEC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/decoder-private.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/decoder-private.c deleted file mode 100644 index 41feeb3a..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/decoder-private.c +++ /dev/null @@ -1,243 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/********************************************************************************** - $Revision: #1 $ - ***********************************************************************************/ - -/** -@file -This file drives SBC decoding. - -@ingroup codec_internal -*/ - -/** -@addtogroup codec_internal -@{ -*/ - -#include "oi_bitstream.h" -#include "oi_codec_sbc_private.h" -#include - -#if defined(SBC_DEC_INCLUDED) - -OI_CHAR *const OI_Codec_Copyright = "Copyright 2002-2007 Open Interface North America, Inc. All rights reserved"; - -INLINE OI_STATUS internal_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_UINT32 *decoderData, OI_UINT32 decoderDataBytes, OI_BYTE maxChannels, OI_BYTE pcmStride, OI_BOOL enhanced, - OI_BOOL msbc_enable) { - OI_UINT i; - OI_STATUS status; - - for (i = 0; i < sizeof(*context); i++) { - ((char *)context)[i] = 0; - } - -#ifdef SBC_ENHANCED - context->enhancedEnabled = enhanced ? TRUE : FALSE; -#else - context->enhancedEnabled = FALSE; - if (enhanced) { - return OI_STATUS_INVALID_PARAMETERS; - } -#endif - - if (msbc_enable) { - context->sbc_mode = OI_SBC_MODE_MSBC; - } else { - context->sbc_mode = OI_SBC_MODE_STD; - } - - status = OI_CODEC_SBC_Alloc(&context->common, decoderData, decoderDataBytes, maxChannels, pcmStride); - - if (!OI_SUCCESS(status)) { - return status; - } - - context->common.codecInfo = OI_Codec_Copyright; - context->common.maxBitneed = 0; - context->limitFrameFormat = FALSE; - OI_SBC_ExpandFrameFields(&context->common.frameInfo); - - /*PLATFORM_DECODER_RESET(context);*/ - - return OI_OK; -} - -/** - * Read the SBC header up to but not including the joint stereo mask. The syncword has already been - * examined, and the enhanced mode flag set, by FindSyncword. - */ -INLINE void OI_SBC_ReadHeader(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *data) { - OI_CODEC_SBC_FRAME_INFO *frame = &common->frameInfo; - OI_UINT8 d1; - - OI_ASSERT(data[0] == OI_SBC_SYNCWORD || data[0] == OI_SBC_ENHANCED_SYNCWORD || data[0] == OI_mSBC_SYNCWORD); - - /** - * For mSBC, just set those parameters - */ - if (data[0] == OI_mSBC_SYNCWORD) { - frame->freqIndex = 0; - frame->frequency = 16000; - - frame->blocks = 4; - frame->nrof_blocks = 15; - - frame->mode = 0; - frame->nrof_channels = 1; - - frame->alloc = SBC_LOUDNESS; - - frame->subbands = 1; - frame->nrof_subbands = 8; - - frame->cachedInfo = 0; - - frame->bitpool = 26; - frame->crc = data[3]; - return; - } - - /* Avoid filling out all these strucutures if we already remember the values - * from last time. Just in case we get a stream corresponding to data[1] == - * 0, DecoderReset is responsible for ensuring the lookup table entries have - * already been populated - */ - d1 = data[1]; - if (d1 != frame->cachedInfo) { - frame->freqIndex = (d1 & (BIT7 | BIT6)) >> 6; - frame->frequency = freq_values[frame->freqIndex]; - - frame->blocks = (d1 & (BIT5 | BIT4)) >> 4; - frame->nrof_blocks = block_values[frame->blocks]; - - frame->mode = (d1 & (BIT3 | BIT2)) >> 2; - frame->nrof_channels = channel_values[frame->mode]; - - frame->alloc = (d1 & BIT1) >> 1; - - frame->subbands = (d1 & BIT0); - frame->nrof_subbands = band_values[frame->subbands]; - - frame->cachedInfo = d1; - } - /* - * For decode, the bit allocator needs to know the bitpool value - */ - frame->bitpool = data[2]; - frame->crc = data[3]; -} - -#define LOW(x) ((x) & 0xf) -#define HIGH(x) ((x) >> 4) - -/* - * Read scalefactor values and prepare the bitstream for OI_SBC_ReadSamples - */ -PRIVATE void OI_SBC_ReadScalefactors(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *b, OI_BITSTREAM *bs) { - OI_UINT i = common->frameInfo.nrof_subbands * common->frameInfo.nrof_channels; - OI_INT8 *scale_factor = common->scale_factor; - OI_UINT f; - - if (common->frameInfo.nrof_subbands == 8 || common->frameInfo.mode != SBC_JOINT_STEREO) { - if (common->frameInfo.mode == SBC_JOINT_STEREO) { - common->frameInfo.join = *b++; - } else { - common->frameInfo.join = 0; - } - i /= 2; - do { - *scale_factor++ = HIGH(f = *b++); - *scale_factor++ = LOW(f); - } while (--i); - /* - * In this case we know that the scale factors end on a byte boundary so all we need to do - * is initialize the bitstream. - */ - OI_BITSTREAM_ReadInit(bs, b); - } else { - OI_ASSERT(common->frameInfo.nrof_subbands == 4 && common->frameInfo.mode == SBC_JOINT_STEREO); - common->frameInfo.join = HIGH(f = *b++); - i = (i - 1) / 2; - do { - *scale_factor++ = LOW(f); - *scale_factor++ = HIGH(f = *b++); - } while (--i); - *scale_factor++ = LOW(f); - /* - * In 4-subband joint stereo mode, the joint stereo information ends on a half-byte - * boundary, so it's necessary to use the bitstream abstraction to read it, since - * OI_SBC_ReadSamples will need to pick up in mid-byte. - */ - OI_BITSTREAM_ReadInit(bs, b); - *scale_factor++ = OI_BITSTREAM_ReadUINT4Aligned(bs); - } -} - -/** Read quantized subband samples from the input bitstream and expand them. */ -PRIVATE void OI_SBC_ReadSamples(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs) { - OI_CODEC_SBC_COMMON_CONTEXT *common = &context->common; - OI_UINT nrof_blocks = common->frameInfo.nrof_blocks; - OI_INT32 *RESTRICT s = common->subdata; - OI_UINT8 *ptr = global_bs->ptr.w; - OI_UINT32 value = global_bs->value; - OI_UINT bitPtr = global_bs->bitPtr; - - const OI_UINT iter_count = common->frameInfo.nrof_channels * common->frameInfo.nrof_subbands / 4; - do { - OI_UINT i; - for (i = 0; i < iter_count; ++i) { - OI_UINT32 sf_by4 = ((OI_UINT32 *)common->scale_factor)[i]; - OI_UINT32 bits_by4 = common->bits.uint32[i]; - OI_UINT n; - for (n = 0; n < 4; ++n) { - OI_INT32 dequant; - OI_UINT bits; - OI_INT sf; - - if (OI_CPU_BYTE_ORDER == OI_LITTLE_ENDIAN_BYTE_ORDER) { - bits = bits_by4 & 0xFF; - bits_by4 >>= 8; - sf = sf_by4 & 0xFF; - sf_by4 >>= 8; - } else { - bits = (bits_by4 >> 24) & 0xFF; - bits_by4 <<= 8; - sf = (sf_by4 >> 24) & 0xFF; - sf_by4 <<= 8; - } - if (bits) { - OI_UINT32 raw; - OI_BITSTREAM_READUINT(raw, bits, ptr, value, bitPtr); - dequant = OI_SBC_Dequant(raw, sf, bits); - } else { - dequant = 0; - } - *s++ = dequant; - } - } - } while (--nrof_blocks); -} - -/** -@} -*/ -#endif /* #if defined(SBC_DEC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/decoder-sbc.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/decoder-sbc.c deleted file mode 100644 index 01f79559..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/decoder-sbc.c +++ /dev/null @@ -1,433 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2006 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/********************************************************************************** - $Revision: #1 $ - ***********************************************************************************/ - -/** @file -@ingroup codec_internal -*/ - -/**@addtogroup codec_internal */ -/**@{*/ - -#include "oi_bitstream.h" -#include "oi_codec_sbc_private.h" - -#if defined(SBC_DEC_INCLUDED) - -#define SPECIALIZE_READ_SAMPLES_JOINT - -/** - * Scans through a buffer looking for a codec syncword. If the decoder has been - * set for enhanced operation using OI_CODEC_SBC_DecoderReset(), it will search - * for both a standard and an enhanced syncword. - */ -PRIVATE OI_STATUS FindSyncword(OI_CODEC_SBC_DECODER_CONTEXT *context, const OI_BYTE **frameData, OI_UINT32 *frameBytes) { -#ifdef SBC_ENHANCED - OI_BYTE search1 = OI_SBC_SYNCWORD; - OI_BYTE search2 = OI_SBC_ENHANCED_SYNCWORD; -#endif // SBC_ENHANCED - - if (*frameBytes == 0) { - return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA; - } - -#ifdef SBC_ENHANCED - if (context->limitFrameFormat && context->enhancedEnabled) { - /* If the context is restricted, only search for specified SYNCWORD */ - search1 = search2; - } else if (context->enhancedEnabled == FALSE) { - /* If enhanced is not enabled, only search for classic SBC SYNCWORD*/ - search2 = search1; - } - while (*frameBytes && (**frameData != search1) && (**frameData != search2)) { - (*frameBytes)--; - (*frameData)++; - } - if (*frameBytes) { - /* Syncword found, *frameData points to it, and *frameBytes correctly - * reflects the number of bytes available to read, including the - * syncword. */ - context->common.frameInfo.enhanced = (**frameData == OI_SBC_ENHANCED_SYNCWORD); - return OI_OK; - } else { - /* No syncword was found anywhere in the provided input data. - * *frameData points past the end of the original input, and - * *frameBytes is 0. */ - return OI_CODEC_SBC_NO_SYNCWORD; - } -#else // SBC_ENHANCED - while (*frameBytes && (!(context->sbc_mode == OI_SBC_MODE_STD && **frameData == OI_SBC_SYNCWORD)) && (!(context->sbc_mode == OI_SBC_MODE_MSBC && **frameData == OI_mSBC_SYNCWORD))) { - (*frameBytes)--; - (*frameData)++; - } - if (*frameBytes) { - /* Syncword found, *frameData points to it, and *frameBytes correctly - * reflects the number of bytes available to read, including the - * syncword. */ - context->common.frameInfo.enhanced = FALSE; - return OI_OK; - } else { - /* No syncword was found anywhere in the provided input data. - * *frameData points past the end of the original input, and - * *frameBytes is 0. */ - return OI_CODEC_SBC_NO_SYNCWORD; - } -#endif // SBC_ENHANCED -} - -static OI_STATUS DecodeBody(OI_CODEC_SBC_DECODER_CONTEXT *context, const OI_BYTE *bodyData, OI_INT16 *pcmData, OI_UINT32 *pcmBytes, OI_BOOL allowPartial) { - OI_BITSTREAM bs; - OI_UINT frameSamples = context->common.frameInfo.nrof_blocks * context->common.frameInfo.nrof_subbands; - OI_UINT decode_block_count; - - /* - * Based on the header data, make sure that there is enough room to write the output samples. - */ - if (*pcmBytes < (sizeof(OI_INT16) * frameSamples * context->common.pcmStride) && !allowPartial) { - /* If we're not allowing partial decodes, we need room for the entire - * codec frame */ - TRACE(("-OI_CODEC_SBC_Decode: OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA")); - return OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA; - } else if (*pcmBytes < sizeof(OI_INT16) * context->common.frameInfo.nrof_subbands * context->common.pcmStride) { - /* Even if we're allowing partials, we can still only decode on a frame - * boundary */ - return OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA; - } - - if (context->bufferedBlocks == 0) { - TRACE(("Reading scalefactors")); - OI_SBC_ReadScalefactors(&context->common, bodyData, &bs); - - TRACE(("Computing bit allocation")); - OI_SBC_ComputeBitAllocation(&context->common); - - TRACE(("Reading samples")); - if (context->common.frameInfo.mode == SBC_JOINT_STEREO) { - OI_SBC_ReadSamplesJoint(context, &bs); - } else { - OI_SBC_ReadSamples(context, &bs); - } - - context->bufferedBlocks = context->common.frameInfo.nrof_blocks; - } - - if (allowPartial) { - decode_block_count = *pcmBytes / sizeof(OI_INT16) / context->common.pcmStride / context->common.frameInfo.nrof_subbands; - - if (decode_block_count > context->bufferedBlocks) { - decode_block_count = context->bufferedBlocks; - } - - } else { - decode_block_count = context->common.frameInfo.nrof_blocks; - } - - TRACE(("Synthesizing frame")); - { - OI_UINT start_block = context->common.frameInfo.nrof_blocks - context->bufferedBlocks; - OI_SBC_SynthFrame(context, pcmData, start_block, decode_block_count); - } - - OI_ASSERT(context->bufferedBlocks >= decode_block_count); - context->bufferedBlocks -= decode_block_count; - - frameSamples = decode_block_count * context->common.frameInfo.nrof_subbands; - - /* - * When decoding mono into a stride-2 array, copy pcm data to second channel - */ - if (context->common.frameInfo.nrof_channels == 1 && context->common.pcmStride == 2) { - OI_UINT i; - for (i = 0; i < frameSamples; ++i) { - pcmData[2 * i + 1] = pcmData[2 * i]; - } - } - - /* - * Return number of pcm bytes generated by the decode operation. - */ - *pcmBytes = frameSamples * sizeof(OI_INT16) * context->common.pcmStride; - if (context->bufferedBlocks > 0) { - return OI_CODEC_SBC_PARTIAL_DECODE; - } else { - return OI_OK; - } -} - -PRIVATE OI_STATUS internal_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_UINT8 bitpool, const OI_BYTE **frameData, OI_UINT32 *frameBytes, OI_INT16 *pcmData, OI_UINT32 *pcmBytes) { - OI_STATUS status; - OI_UINT bodyLen; - - TRACE(("+OI_CODEC_SBC_DecodeRaw")); - - if (context->bufferedBlocks == 0) { - /* - * The bitallocator needs to know the bitpool value. - */ - context->common.frameInfo.bitpool = bitpool; - /* - * Compute the frame length and check we have enough frame data to proceed - */ - bodyLen = OI_CODEC_SBC_CalculateFramelen(&context->common.frameInfo) - SBC_HEADER_LEN; - if (*frameBytes < bodyLen) { - TRACE(("-OI_CODEC_SBC_Decode: OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA")); - return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA; - } - } else { - bodyLen = 0; - } - /* - * Decode the SBC data. Pass TRUE to DecodeBody to allow partial decoding of - * tones. - */ - status = DecodeBody(context, *frameData, pcmData, pcmBytes, TRUE); - if (OI_SUCCESS(status) || status == OI_CODEC_SBC_PARTIAL_DECODE) { - *frameData += bodyLen; - *frameBytes -= bodyLen; - } - TRACE(("-OI_CODEC_SBC_DecodeRaw: %d", status)); - return status; -} - -OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_UINT32 *decoderData, OI_UINT32 decoderDataBytes, OI_UINT8 maxChannels, OI_UINT8 pcmStride, OI_BOOL enhanced, - OI_BOOL msbc_enable) { - return internal_DecoderReset(context, decoderData, decoderDataBytes, maxChannels, pcmStride, enhanced, msbc_enable); -} - -OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, const OI_BYTE **frameData, OI_UINT32 *frameBytes, OI_INT16 *pcmData, OI_UINT32 *pcmBytes) { - OI_STATUS status; - OI_UINT framelen; - OI_UINT8 crc; - - TRACE(("+OI_CODEC_SBC_DecodeFrame")); - - TRACE(("Finding syncword")); - status = FindSyncword(context, frameData, frameBytes); - if (!OI_SUCCESS(status)) { - return status; - } - - /* Make sure enough data remains to read the header. */ - if (*frameBytes < SBC_HEADER_LEN) { - TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA")); - return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA; - } - - TRACE(("Reading Header")); - OI_SBC_ReadHeader(&context->common, *frameData); - - /* - * Some implementations load the decoder into RAM and use overlays for 4 vs 8 subbands. We need - * to ensure that the SBC parameters for this frame are compatible with the restrictions imposed - * by the loaded overlays. - */ - if (context->limitFrameFormat && (context->common.frameInfo.subbands != context->restrictSubbands)) { - ERROR(("SBC parameters incompatible with loaded overlay")); - return OI_STATUS_INVALID_PARAMETERS; - } - - if (context->common.frameInfo.nrof_channels > context->common.maxChannels) { - ERROR(("SBC parameters incompatible with number of channels specified during reset")); - return OI_STATUS_INVALID_PARAMETERS; - } - - if (context->common.pcmStride < 1 || context->common.pcmStride > 2) { - ERROR(("PCM stride not set correctly during reset")); - return OI_STATUS_INVALID_PARAMETERS; - } - - /* - * At this point a header has been read. However, it's possible that we found a false syncword, - * so the header data might be invalid. Make sure we have enough bytes to read in the - * CRC-protected header, but don't require we have the whole frame. That way, if it turns out - * that we're acting on bogus header data, we don't stall the decoding process by waiting for - * data that we don't actually need. - */ - framelen = OI_CODEC_SBC_CalculateFramelen(&context->common.frameInfo); - if (*frameBytes < framelen) { - TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA")); - return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA; - } - - TRACE(("Calculating checksum")); - - crc = OI_SBC_CalculateChecksum(&context->common.frameInfo, *frameData); - if (crc != context->common.frameInfo.crc) { - TRACE(("CRC Mismatch: calc=%02x read=%02x\n", crc, context->common.frameInfo.crc)); - TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_CHECKSUM_MISMATCH")); - return OI_CODEC_SBC_CHECKSUM_MISMATCH; - } - -#ifdef OI_DEBUG - /* - * Make sure the bitpool values are sane. - */ - if ((context->common.frameInfo.bitpool < SBC_MIN_BITPOOL) && !context->common.frameInfo.enhanced) { - ERROR(("Bitpool too small: %d (must be >= 2)", context->common.frameInfo.bitpool)); - return OI_STATUS_INVALID_PARAMETERS; - } - if (context->common.frameInfo.bitpool > OI_SBC_MaxBitpool(&context->common.frameInfo)) { - ERROR(("Bitpool too large: %d (must be <= %ld)", context->common.frameInfo.bitpool, OI_SBC_MaxBitpool(&context->common.frameInfo))); - return OI_STATUS_INVALID_PARAMETERS; - } -#endif - - /* - * Now decode the SBC data. Partial decode is not yet implemented for an SBC - * stream, so pass FALSE to decode body to have it enforce the old rule that - * you have to decode a whole packet at a time. - */ - status = DecodeBody(context, *frameData + SBC_HEADER_LEN, pcmData, pcmBytes, FALSE); - if (OI_SUCCESS(status)) { - *frameData += framelen; - *frameBytes -= framelen; - } - TRACE(("-OI_CODEC_SBC_DecodeFrame: %d", status)); - - return status; -} - -OI_STATUS OI_CODEC_SBC_SkipFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, const OI_BYTE **frameData, OI_UINT32 *frameBytes) { - OI_STATUS status; - OI_UINT framelen; - OI_UINT headerlen; - OI_UINT8 crc; - - status = FindSyncword(context, frameData, frameBytes); - if (!OI_SUCCESS(status)) { - return status; - } - if (*frameBytes < SBC_HEADER_LEN) { - return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA; - } - OI_SBC_ReadHeader(&context->common, *frameData); - framelen = OI_SBC_CalculateFrameAndHeaderlen(&context->common.frameInfo, &headerlen); - if (*frameBytes < headerlen) { - return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA; - } - crc = OI_SBC_CalculateChecksum(&context->common.frameInfo, *frameData); - if (crc != context->common.frameInfo.crc) { - return OI_CODEC_SBC_CHECKSUM_MISMATCH; - } - if (*frameBytes < framelen) { - return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA; - } - context->bufferedBlocks = 0; - *frameData += framelen; - *frameBytes -= framelen; - return OI_OK; -} - -OI_UINT8 OI_CODEC_SBC_FrameCount(OI_BYTE *frameData, OI_UINT32 frameBytes) { - OI_UINT8 mode; - OI_UINT8 blocks; - OI_UINT8 subbands; - OI_UINT8 frameCount = 0; - OI_UINT frameLen; - - while (frameBytes) { - while (frameBytes && ((frameData[0] & 0xFE) != 0x9C)) { - frameData++; - frameBytes--; - } - - if (frameBytes < SBC_HEADER_LEN) { - return frameCount; - } - - /* Extract and translate required fields from Header */ - subbands = mode = blocks = frameData[1]; - ; - mode = (mode & (BIT3 | BIT2)) >> 2; - blocks = block_values[(blocks & (BIT5 | BIT4)) >> 4]; - subbands = band_values[(subbands & BIT0)]; - - /* Inline logic to avoid corrupting context */ - frameLen = blocks * frameData[2]; - switch (mode) { - case SBC_JOINT_STEREO: - frameLen += subbands + (8 * subbands); - break; - - case SBC_DUAL_CHANNEL: - frameLen *= 2; - /* fall through */ - - default: - if (mode == SBC_MONO) { - frameLen += 4 * subbands; - } else { - frameLen += 8 * subbands; - } - } - - frameCount++; - frameLen = SBC_HEADER_LEN + (frameLen + 7) / 8; - if (frameBytes > frameLen) { - frameBytes -= frameLen; - frameData += frameLen; - } else { - frameBytes = 0; - } - } - return frameCount; -} - -/** Read quantized subband samples from the input bitstream and expand them. */ - -#ifdef SPECIALIZE_READ_SAMPLES_JOINT - -PRIVATE void OI_SBC_ReadSamplesJoint4(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs){ -#define NROF_SUBBANDS 4 -#include "readsamplesjoint.inc" -#undef NROF_SUBBANDS -} - -PRIVATE void OI_SBC_ReadSamplesJoint8(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs) { -#define NROF_SUBBANDS 8 -#include "readsamplesjoint.inc" -#undef NROF_SUBBANDS -} - -typedef void (*READ_SAMPLES)(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs); - -static const READ_SAMPLES SpecializedReadSamples[] = {OI_SBC_ReadSamplesJoint4, OI_SBC_ReadSamplesJoint8}; - -#endif /* SPECIALIZE_READ_SAMPLES_JOINT */ - -PRIVATE void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs) { - OI_CODEC_SBC_COMMON_CONTEXT *common = &context->common; - OI_UINT nrof_subbands = common->frameInfo.nrof_subbands; -#ifdef SPECIALIZE_READ_SAMPLES_JOINT - OI_ASSERT((nrof_subbands >> 3u) <= 1u); - SpecializedReadSamples[nrof_subbands >> 3](context, global_bs); -#else - -#define NROF_SUBBANDS nrof_subbands -#include "readsamplesjoint.inc" -#undef NROF_SUBBANDS -#endif /* SPECIALIZE_READ_SAMPLES_JOINT */ -} - -/**@}*/ - -#endif /* #if defined(SBC_DEC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/dequant.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/dequant.c deleted file mode 100644 index 8b4973ec..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/dequant.c +++ /dev/null @@ -1,207 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -/** - @file - - Dequantizer for SBC decoder; reconstructs quantized representation of subband samples. - - @ingroup codec_internal - */ - -/** -@addtogroup codec_internal -@{ -*/ - -/** - This function is a fixed-point approximation of a modification of the following - dequantization operation defined in the spec, as inferred from section 12.6.4: - - @code - dequant = 2^(scale_factor+1) * ((raw * 2.0 + 1.0) / ((2^bits) - 1) - 1) - - 2 <= bits <= 16 - 0 <= raw < (2^bits)-1 (the -1 is because quantized values with all 1's are forbidden) - - -65535 < dequant < 65535 - @endcode - - The code below computes the dequantized value divided by a scaling constant - equal to about 1.38. This constant is chosen to ensure that the entry in the - dequant_long_scaled table for 16 bits is as accurate as possible, since it has - the least relative precision available to it due to its small magnitude. - - This routine outputs in Q16.15 format. - - The helper array dequant_long is defined as follows: - - @code - dequant_long_long[bits] = round(2^31 * 1/((2^bits - 1) / 1.38...) for 2 <= bits <= 16 - @endcode - - - Additionally, the table entries have the following property: - - @code - dequant_long_scaled[bits] <= 2^31 / ((2^bits - 1)) for 2 <= bits <= 16 - @endcode - - Therefore - - @code - d = 2 * raw + 1 1 <= d <= 2^bits - 2 - - d' = d * dequant_long[bits] - - d * dequant_long_scaled[bits] <= (2^bits - 2) * (2^31 / (2^bits - 1)) - d * dequant_long_scaled[bits] <= 2^31 * (2^bits - 2)/(2^bits - 1) < 2^31 - @endcode - - Therefore, d' doesn't overflow a signed 32-bit value. - - @code - - d' =~ 2^31 * (raw * 2.0 + 1.0) / (2^bits - 1) / 1.38... - - result = d' - 2^31/1.38... =~ 2^31 * ((raw * 2.0 + 1.0) / (2^bits - 1) - 1) / 1.38... - - result is therefore a scaled approximation to dequant. It remains only to - turn 2^31 into 2^(scale_factor+1). Since we're aiming for Q16.15 format, - this is achieved by shifting right by (15-scale_factor): - - (2^31 * x) >> (15-scale_factor) =~ 2^(31-15+scale_factor) * x = 2^15 * 2^(1+scale_factor) * x - @endcode - - */ - -#include - -#if defined(SBC_DEC_INCLUDED) - -#ifndef SBC_DEQUANT_LONG_SCALED_OFFSET -#define SBC_DEQUANT_LONG_SCALED_OFFSET 1555931970 -#endif - -#ifndef SBC_DEQUANT_LONG_UNSCALED_OFFSET -#define SBC_DEQUANT_LONG_UNSCALED_OFFSET 2147483648 -#endif - -#ifndef SBC_DEQUANT_SCALING_FACTOR -#define SBC_DEQUANT_SCALING_FACTOR 1.38019122262781f -#endif - -const OI_UINT32 dequant_long_scaled[17]; -const OI_UINT32 dequant_long_unscaled[17]; - -/** Scales x by y bits to the right, adding a rounding factor. - */ -#ifndef SCALE -#define SCALE(x, y) (((x) + (1 << ((y)-1))) >> (y)) -#endif - -#ifdef DEBUG_DEQUANTIZATION - -#include - -static INLINE float dequant_float(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits) { - float result = (1 << (scale_factor + 1)) * ((raw * 2.0f + 1.0f) / ((1 << bits) - 1.0f) - 1.0f); - - result /= SBC_DEQUANT_SCALING_FACTOR; - - /* Unless the encoder screwed up, all correct dequantized values should - * satisfy this inequality. Non-compliant encoders which generate quantized - * values with all 1-bits set can, theoretically, trigger this assert. This - * is unlikely, however, and only an issue in debug mode. - */ - OI_ASSERT(fabs(result) < 32768 * 1.6); - - return result; -} - -#endif - -INLINE OI_INT32 OI_SBC_Dequant(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits) { - OI_UINT32 d; - OI_INT32 result; - - OI_ASSERT(scale_factor <= 15); - OI_ASSERT(bits <= 16); - - if (bits <= 1) { - return 0; - } - - d = (raw * 2) + 1; - d *= dequant_long_scaled[bits]; - result = d - SBC_DEQUANT_LONG_SCALED_OFFSET; - -#ifdef DEBUG_DEQUANTIZATION - { - OI_INT32 integerized_float_result; - float float_result; - - float_result = dequant_float(raw, scale_factor, bits); - integerized_float_result = (OI_INT32)floor(0.5f + float_result * (1 << 15)); - - /* This detects overflow */ - OI_ASSERT(((result >= 0) && (integerized_float_result >= 0)) || ((result <= 0) && (integerized_float_result <= 0))); - } -#endif - return result >> (15 - scale_factor); -} - -/* This version of Dequant does not incorporate the scaling factor of 1.38. It - * is intended for use with implementations of the filterbank which are - * hard-coded into a DSP. Output is Q16.4 format, so that after joint stereo - * processing (which leaves the most significant bit equal to the sign bit if - * the encoder is conformant) the result will fit a 24 bit fixed point signed - * value.*/ - -INLINE OI_INT32 OI_SBC_Dequant_Unscaled(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits) { - OI_UINT32 d; - OI_INT32 result; - - OI_ASSERT(scale_factor <= 15); - OI_ASSERT(bits <= 16); - - if (bits <= 1) { - return 0; - } - if (bits == 16) { - result = (raw << 16) + raw - 0x7fff7fff; - return SCALE(result, 24 - scale_factor); - } - - d = (raw * 2) + 1; - d *= dequant_long_unscaled[bits]; - result = d - 0x80000000; - - return SCALE(result, 24 - scale_factor); -} - -/** -@} -*/ - -#endif /* #if defined(SBC_DEC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/framing-sbc.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/framing-sbc.c deleted file mode 100644 index cb4545d8..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/framing-sbc.c +++ /dev/null @@ -1,57 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -/** @file -@ingroup codec_internal -*/ - -/**@addgroup codec_internal*/ -/**@{*/ - -#include "oi_codec_sbc_private.h" - -#if defined(SBC_DEC_INCLUDED) - -const OI_CHAR *const OI_CODEC_SBC_FreqText[] = {"SBC_FREQ_16000", "SBC_FREQ_32000", "SBC_FREQ_44100", "SBC_FREQ_48000"}; -const OI_CHAR *const OI_CODEC_SBC_ModeText[] = {"SBC_MONO", "SBC_DUAL_CHANNEL", "SBC_STEREO", "SBC_JOINT_STEREO"}; -const OI_CHAR *const OI_CODEC_SBC_SubbandsText[] = {"SBC_SUBBANDS_4", "SBC_SUBBANDS_8"}; -const OI_CHAR *const OI_CODEC_SBC_BlocksText[] = {"SBC_BLOCKS_4", "SBC_BLOCKS_8", "SBC_BLOCKS_12", "SBC_BLOCKS_16"}; -const OI_CHAR *const OI_CODEC_SBC_AllocText[] = {"SBC_LOUDNESS", "SBC_SNR"}; - -#ifdef OI_DEBUG -void OI_CODEC_SBC_DumpConfig(OI_CODEC_SBC_FRAME_INFO *frameInfo) { - BT_WARN("SBC configuration\n"); - BT_WARN(" enhanced: %s\n", frameInfo->enhanced ? "TRUE" : "FALSE"); - BT_WARN(" frequency: %d\n", frameInfo->frequency); - BT_WARN(" subbands: %d\n", frameInfo->nrof_subbands); - BT_WARN(" blocks: %d\n", frameInfo->nrof_blocks); - BT_WARN(" channels: %d\n", frameInfo->nrof_channels); - BT_WARN(" mode: %s\n", OI_CODEC_SBC_ModeText[frameInfo->mode]); - BT_WARN(" alloc: %s\n", OI_CODEC_SBC_AllocText[frameInfo->alloc]); - BT_WARN(" bitpool: %d\n", frameInfo->bitpool); -} -#endif /* OI_DEBUG */ - -/**@}*/ - -#endif /* #if defined(SBC_DEC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/framing.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/framing.c deleted file mode 100644 index a809b1f8..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/framing.c +++ /dev/null @@ -1,242 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -/** -@file -Checksum and header-related functions. - -@ingroup codec_internal -*/ - -/** -@addtogroup codec_internal -@{ -*/ - -#include "oi_assert.h" -#include "oi_codec_sbc_private.h" - -#if defined(SBC_DEC_INCLUDED) - -/* asdasd */ - -#define USE_NIBBLEWISE_CRC - -/* #define PRINT_SAMPLES */ -/* #define PRINT_SCALEFACTORS */ -/* #define DEBUG_CRC */ - -/* - * CRC-8 table for X^8 + X^4 + X^3 + X^2 + 1; byte-wise lookup - */ -#ifdef USE_WIDE_CRC -/* Save space if a char is 16 bits, such as on the C54x */ -const OI_BYTE crc8_wide[128] = { - 0x001d, 0x3a27, 0x7469, 0x4e53, 0xe8f5, 0xd2cf, 0x9c81, 0xa6bb, 0xcdd0, 0xf7ea, 0xb9a4, 0x839e, 0x2538, 0x1f02, 0x514c, 0x6b76, 0x879a, 0xbda0, 0xf3ee, 0xc9d4, 0x6f72, 0x5548, - 0x1b06, 0x213c, 0x4a57, 0x706d, 0x3e23, 0x0419, 0xa2bf, 0x9885, 0xd6cb, 0xecf1, 0x130e, 0x2934, 0x677a, 0x5d40, 0xfbe6, 0xc1dc, 0x8f92, 0xb5a8, 0xdec3, 0xe4f9, 0xaab7, 0x908d, - 0x362b, 0x0c11, 0x425f, 0x7865, 0x9489, 0xaeb3, 0xe0fd, 0xdac7, 0x7c61, 0x465b, 0x0815, 0x322f, 0x5944, 0x637e, 0x2d30, 0x170a, 0xb1ac, 0x8b96, 0xc5d8, 0xffe2, 0x263b, 0x1c01, - 0x524f, 0x6875, 0xced3, 0xf4e9, 0xbaa7, 0x809d, 0xebf6, 0xd1cc, 0x9f82, 0xa5b8, 0x031e, 0x3924, 0x776a, 0x4d50, 0xa1bc, 0x9b86, 0xd5c8, 0xeff2, 0x4954, 0x736e, 0x3d20, 0x071a, - 0x6c71, 0x564b, 0x1805, 0x223f, 0x8499, 0xbea3, 0xf0ed, 0xcad7, 0x3528, 0x0f12, 0x415c, 0x7b66, 0xddc0, 0xe7fa, 0xa9b4, 0x938e, 0xf8e5, 0xc2df, 0x8c91, 0xb6ab, 0x100d, 0x2a37, - 0x6479, 0x5e43, 0xb2af, 0x8895, 0xc6db, 0xfce1, 0x5a47, 0x607d, 0x2e33, 0x1409, 0x7f62, 0x4558, 0x0b16, 0x312c, 0x978a, 0xadb0, 0xe3fe, 0xd9c4, -}; -#elif defined(USE_NIBBLEWISE_CRC) -const OI_BYTE crc8_narrow[16] = {0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb}; -#else -const OI_BYTE crc8_narrow[256] = { - 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, 0xcd, 0xd0, 0xf7, 0xea, 0xb9, 0xa4, 0x83, 0x9e, 0x25, 0x38, 0x1f, 0x02, 0x51, 0x4c, 0x6b, 0x76, - 0x87, 0x9a, 0xbd, 0xa0, 0xf3, 0xee, 0xc9, 0xd4, 0x6f, 0x72, 0x55, 0x48, 0x1b, 0x06, 0x21, 0x3c, 0x4a, 0x57, 0x70, 0x6d, 0x3e, 0x23, 0x04, 0x19, 0xa2, 0xbf, 0x98, 0x85, 0xd6, 0xcb, 0xec, 0xf1, - 0x13, 0x0e, 0x29, 0x34, 0x67, 0x7a, 0x5d, 0x40, 0xfb, 0xe6, 0xc1, 0xdc, 0x8f, 0x92, 0xb5, 0xa8, 0xde, 0xc3, 0xe4, 0xf9, 0xaa, 0xb7, 0x90, 0x8d, 0x36, 0x2b, 0x0c, 0x11, 0x42, 0x5f, 0x78, 0x65, - 0x94, 0x89, 0xae, 0xb3, 0xe0, 0xfd, 0xda, 0xc7, 0x7c, 0x61, 0x46, 0x5b, 0x08, 0x15, 0x32, 0x2f, 0x59, 0x44, 0x63, 0x7e, 0x2d, 0x30, 0x17, 0x0a, 0xb1, 0xac, 0x8b, 0x96, 0xc5, 0xd8, 0xff, 0xe2, - 0x26, 0x3b, 0x1c, 0x01, 0x52, 0x4f, 0x68, 0x75, 0xce, 0xd3, 0xf4, 0xe9, 0xba, 0xa7, 0x80, 0x9d, 0xeb, 0xf6, 0xd1, 0xcc, 0x9f, 0x82, 0xa5, 0xb8, 0x03, 0x1e, 0x39, 0x24, 0x77, 0x6a, 0x4d, 0x50, - 0xa1, 0xbc, 0x9b, 0x86, 0xd5, 0xc8, 0xef, 0xf2, 0x49, 0x54, 0x73, 0x6e, 0x3d, 0x20, 0x07, 0x1a, 0x6c, 0x71, 0x56, 0x4b, 0x18, 0x05, 0x22, 0x3f, 0x84, 0x99, 0xbe, 0xa3, 0xf0, 0xed, 0xca, 0xd7, - 0x35, 0x28, 0x0f, 0x12, 0x41, 0x5c, 0x7b, 0x66, 0xdd, 0xc0, 0xe7, 0xfa, 0xa9, 0xb4, 0x93, 0x8e, 0xf8, 0xe5, 0xc2, 0xdf, 0x8c, 0x91, 0xb6, 0xab, 0x10, 0x0d, 0x2a, 0x37, 0x64, 0x79, 0x5e, 0x43, - 0xb2, 0xaf, 0x88, 0x95, 0xc6, 0xdb, 0xfc, 0xe1, 0x5a, 0x47, 0x60, 0x7d, 0x2e, 0x33, 0x14, 0x09, 0x7f, 0x62, 0x45, 0x58, 0x0b, 0x16, 0x31, 0x2c, 0x97, 0x8a, 0xad, 0xb0, 0xe3, 0xfe, 0xd9, 0xc4}; -#endif -const OI_UINT32 dequant_long_scaled[17] = { - 0, 0, 0x1ee9e116, /* bits=2 0.24151243 1/3 * (1/1.38019122262781) (0x00000008)*/ - 0x0d3fa99c, /* bits=3 0.10350533 1/7 * (1/1.38019122262781) (0x00000013)*/ - 0x062ec69e, /* bits=4 0.04830249 1/15 * (1/1.38019122262781) (0x00000029)*/ - 0x02fddbfa, /* bits=5 0.02337217 1/31 * (1/1.38019122262781) (0x00000055)*/ - 0x0178d9f5, /* bits=6 0.01150059 1/63 * (1/1.38019122262781) (0x000000ad)*/ - 0x00baf129, /* bits=7 0.00570502 1/127 * (1/1.38019122262781) (0x0000015e)*/ - 0x005d1abe, /* bits=8 0.00284132 1/255 * (1/1.38019122262781) (0x000002bf)*/ - 0x002e760d, /* bits=9 0.00141788 1/511 * (1/1.38019122262781) (0x00000582)*/ - 0x00173536, /* bits=10 0.00070825 1/1023 * (1/1.38019122262781) (0x00000b07)*/ - 0x000b9928, /* bits=11 0.00035395 1/2047 * (1/1.38019122262781) (0x00001612)*/ - 0x0005cc37, /* bits=12 0.00017693 1/4095 * (1/1.38019122262781) (0x00002c27)*/ - 0x0002e604, /* bits=13 0.00008846 1/8191 * (1/1.38019122262781) (0x00005852)*/ - 0x000172fc, /* bits=14 0.00004422 1/16383 * (1/1.38019122262781) (0x0000b0a7)*/ - 0x0000b97d, /* bits=15 0.00002211 1/32767 * (1/1.38019122262781) (0x00016150)*/ - 0x00005cbe, /* bits=16 0.00001106 1/65535 * (1/1.38019122262781) (0x0002c2a5)*/ -}; - -const OI_UINT32 dequant_long_unscaled[17] = { - 0, 0, 0x2aaaaaab, /* bits=2 0.33333333 1/3 (0x00000005)*/ - 0x12492492, /* bits=3 0.14285714 1/7 (0x0000000e)*/ - 0x08888889, /* bits=4 0.06666667 1/15 (0x0000001d)*/ - 0x04210842, /* bits=5 0.03225806 1/31 (0x0000003e)*/ - 0x02082082, /* bits=6 0.01587302 1/63 (0x0000007e)*/ - 0x01020408, /* bits=7 0.00787402 1/127 (0x000000fe)*/ - 0x00808081, /* bits=8 0.00392157 1/255 (0x000001fd)*/ - 0x00402010, /* bits=9 0.00195695 1/511 (0x000003fe)*/ - 0x00200802, /* bits=10 0.00097752 1/1023 (0x000007fe)*/ - 0x00100200, /* bits=11 0.00048852 1/2047 (0x00000ffe)*/ - 0x00080080, /* bits=12 0.00024420 1/4095 (0x00001ffe)*/ - 0x00040020, /* bits=13 0.00012209 1/8191 (0x00003ffe)*/ - 0x00020008, /* bits=14 0.00006104 1/16383 (0x00007ffe)*/ - 0x00010002, /* bits=15 0.00003052 1/32767 (0x0000fffe)*/ - 0x00008001, /* bits=16 0.00001526 1/65535 (0x0001fffc)*/ -}; - -#if defined(OI_DEBUG) || defined(PRINT_SAMPLES) || defined(PRINT_SCALEFACTORS) -#include -#endif - -#ifdef USE_WIDE_CRC -static INLINE OI_CHAR crc_iterate(OI_UINT8 oldcrc, OI_UINT8 next) { - OI_UINT crc; - OI_UINT idx; - idx = oldcrc ^ next; - crc = crc8_wide[idx >> 1]; - if (idx % 2) { - crc &= 0xff; - } else { - crc >>= 8; - } - - return crc; -} - -static INLINE OI_CHAR crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next) { - OI_UINT crc; - OI_UINT idx; - idx = (oldcrc ^ next) >> 4; - crc = crc8_wide[idx >> 1]; - if (idx % 2) { - crc &= 0xff; - } else { - crc >>= 8; - } - - return (oldcrc << 4) ^ crc; -} - -#else // USE_WIDE_CRC - -static INLINE OI_UINT8 crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next) { return (oldcrc << 4) ^ crc8_narrow[(oldcrc ^ next) >> 4]; } - -#ifdef USE_NIBBLEWISE_CRC -static INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next) { - crc = (crc << 4) ^ crc8_narrow[(crc ^ next) >> 4]; - crc = (crc << 4) ^ crc8_narrow[((crc >> 4) ^ next) & 0xf]; - - return crc; -} - -#else // USE_NIBBLEWISE_CRC -static INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next) { return crc8_narrow[crc ^ next]; } - -#endif // USE_NIBBLEWISE_CRC - -#endif // USE_WIDE_CRC - -PRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data) { - OI_UINT i; - OI_UINT8 crc = 0x0f; - /* Count is the number of whole bytes subject to CRC. Actually, it's one - * more than this number, because data[3] is the CRC field itself, which is - * explicitly skipped. Since crc_iterate (should be) inlined, it's cheaper - * spacewise to include the check in the loop. This shouldn't be much of a - * bottleneck routine in the first place. */ - OI_UINT count = (frame->nrof_subbands * frame->nrof_channels / 2u) + 4; - - if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 8) { - count++; - } - - for (i = 1; i < count; i++) { - if (i != 3) { - crc = crc_iterate(crc, data[i]); - } - } - - if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 4) { - crc = crc_iterate_top4(crc, data[i]); - } - - return crc; -} - -void OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame) { - frame->nrof_blocks = block_values[frame->blocks]; - frame->nrof_subbands = band_values[frame->subbands]; - - frame->frequency = freq_values[frame->freqIndex]; - frame->nrof_channels = channel_values[frame->mode]; -} - -/** - * Unrolled macro to copy 4 32-bit aligned 32-bit values backward in memory - */ -#define COPY4WORDS_BACK(_dest, _src) \ - do { \ - OI_INT32 _a, _b, _c, _d; \ - _a = *--_src; \ - _b = *--_src; \ - _c = *--_src; \ - _d = *--_src; \ - *--_dest = _a; \ - *--_dest = _b; \ - *--_dest = _c; \ - *--_dest = _d; \ - } while (0) - -#if defined(USE_PLATFORM_MEMMOVE) || defined(USE_PLATFORM_MEMCPY) -#include -#endif -PRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount) { -#ifdef USE_PLATFORM_MEMMOVE - memmove(dest, src, wordCount * sizeof(SBC_BUFFER_T)); -#elif defined(USE_PLATFORM_MEMCPY) - OI_ASSERT(((OI_CHAR *)(dest) - (OI_CHAR *)(src)) >= wordCount * sizeof(*dest)); - memcpy(dest, src, wordCount * sizeof(SBC_BUFFER_T)); -#else - OI_UINT n; - OI_INT32 *d; - OI_INT32 *s; - n = wordCount / 4 / (sizeof(OI_INT32) / sizeof(*dest)); - OI_ASSERT((n * 4 * (sizeof(OI_INT32) / sizeof(*dest))) == wordCount); - - d = (void *)(dest + wordCount); - s = (void *)(src + wordCount); - - do { - COPY4WORDS_BACK(d, s); - } while (--n); -#endif -} -/** -@} -*/ - -#endif /* #if defined(SBC_DEC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_assert.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_assert.h deleted file mode 100644 index 54939c75..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_assert.h +++ /dev/null @@ -1,84 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#ifndef _OI_ASSERT_H -#define _OI_ASSERT_H -/** @file - This file provides macros and functions for compile-time and run-time assertions. - - When the OI_DEBUG preprocessor value is defined, the macro OI_ASSERT is compiled into - the program, providing for a runtime assertion failure check. - C_ASSERT is a macro that can be used to perform compile time checks. -*/ -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -/** \addtogroup Debugging Debugging APIs */ -/**@{*/ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef OI_DEBUG - -/** The macro OI_ASSERT takes a condition argument. If the asserted condition - does not evaluate to true, the OI_ASSERT macro calls the host-dependent function, - OI_AssertFail(), which reports the failure and generates a runtime error. -*/ -void OI_AssertFail(char *file, int line, char *reason); - -#define OI_ASSERT(condition) \ - { \ - if (!(condition)) \ - OI_AssertFail(__FILE__, __LINE__, #condition); \ - } - -#define OI_ASSERT_FAIL(msg) \ - { \ - OI_AssertFail(__FILE__, __LINE__, msg); \ - } - -#else - -#define OI_ASSERT(condition) -#define OI_ASSERT_FAIL(msg) - -#endif - -/** - C_ASSERT() can be used to perform many compile-time assertions: type sizes, field offsets, etc. - An assertion failure results in compile time error C2118: negative subscript. - Unfortunately, this elegant macro doesn't work with GCC, so it's all commented out - for now. Perhaps later..... -*/ - -#ifndef C_ASSERT -// #define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1] -// #define C_ASSERT(e) -#endif - -/*****************************************************************************/ -#ifdef __cplusplus -} -#endif - -/**@}*/ - -#endif /* _OI_ASSERT_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_bitstream.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_bitstream.h deleted file mode 100644 index 886eb6e9..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_bitstream.h +++ /dev/null @@ -1,121 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#ifndef _OI_BITSTREAM_H -#define _OI_BITSTREAM_H - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -/** -@file -Function prototypes and macro definitions for manipulating input and output -bitstreams. - -@ingroup codec_internal -*/ - -/** -@addtogroup codec_internal -@{ -*/ - -#include "oi_codec_sbc_private.h" -#include "oi_stddefs.h" - -INLINE void OI_BITSTREAM_ReadInit(OI_BITSTREAM *bs, const OI_BYTE *buffer); - -INLINE void OI_BITSTREAM_WriteInit(OI_BITSTREAM *bs, OI_BYTE *buffer); - -INLINE OI_UINT32 OI_BITSTREAM_ReadUINT(OI_BITSTREAM *bs, OI_UINT bits); - -INLINE OI_UINT8 OI_BITSTREAM_ReadUINT4Aligned(OI_BITSTREAM *bs); - -INLINE OI_UINT8 OI_BITSTREAM_ReadUINT8Aligned(OI_BITSTREAM *bs); - -INLINE void OI_BITSTREAM_WriteUINT(OI_BITSTREAM *bs, - OI_UINT16 value, - OI_UINT bits); - -/* - * Use knowledge that the bitstream is aligned to optimize the write of a byte - */ -PRIVATE void OI_BITSTREAM_WriteUINT8Aligned(OI_BITSTREAM *bs, - OI_UINT8 datum); - -/* - * Use knowledge that the bitstream is aligned to optimize the write pair of nibbles - */ -PRIVATE void OI_BITSTREAM_Write2xUINT4Aligned(OI_BITSTREAM *bs, - OI_UINT8 datum1, - OI_UINT8 datum2); - -/** Internally the bitstream looks ahead in the stream. When - * OI_SBC_ReadScalefactors() goes to temporarily break the abstraction, it will - * need to know where the "logical" pointer is in the stream. - */ -#define OI_BITSTREAM_GetWritePtr(bs) ((bs)->ptr.w - 3) -#define OI_BITSTREAM_GetReadPtr(bs) ((bs)->ptr.r - 3) - -/** This is declared here as a macro because decoder.c breaks the bitsream - * encapsulation for efficiency reasons. - */ -#define OI_BITSTREAM_READUINT(result, bits, ptr, value, bitPtr) \ - do { \ - OI_ASSERT((bits) <= 16); \ - OI_ASSERT((bitPtr) < 16); \ - OI_ASSERT((bitPtr) >= 8); \ - \ - result = (value) << (bitPtr); \ - result >>= 32 - (bits); \ - \ - bitPtr += (bits); \ - while (bitPtr >= 16) { \ - value = ((value) << 8) | *ptr++; \ - bitPtr -= 8; \ - } \ - OI_ASSERT((bits == 0) || (result < (1u << (bits)))); \ - } while (0) - -#define OI_BITSTREAM_WRITEUINT(ptr, value, bitPtr, datum, bits) \ - do { \ - bitPtr -= bits; \ - value |= datum << bitPtr; \ - \ - while (bitPtr <= 16) { \ - bitPtr += 8; \ - *ptr++ = (OI_UINT8)(value >> 24); \ - value <<= 8; \ - } \ - } while (0) - -#define OI_BITSTREAM_WRITEFLUSH(ptr, value, bitPtr) \ - do { \ - while (bitPtr < 32) { \ - bitPtr += 8; \ - *ptr++ = (OI_UINT8)(value >> 24); \ - value <<= 8; \ - } \ - } while (0) - -/** -@} -*/ - -#endif /* _OI_BITSTREAM_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_bt_spec.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_bt_spec.h deleted file mode 100644 index 75776399..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_bt_spec.h +++ /dev/null @@ -1,225 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#ifndef _OI_BT_SPEC_H -#define _OI_BT_SPEC_H -/** - * @file - * - * This file contains common definitions from the Bluetooth specification. - * - */ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -#include "oi_stddefs.h" - -/** \addtogroup Misc Miscellaneous APIs */ -/**@{*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/** The maximum number of active slaves in a piconet. */ -#define OI_BT_MAX_ACTIVE_SLAVES 7 - -/** the number of bytes in a Bluetooth device address (BD_ADDR) */ -#define OI_BD_ADDR_BYTE_SIZE 6 - -/** - * 48-bit Bluetooth device address - * - * Because 48-bit integers may not be supported on all platforms, the - * address is defined as an array of bytes. This array is big-endian, - * meaning that - * - array[0] contains bits 47-40, - * - array[1] contains bits 39-32, - * - array[2] contains bits 31-24, - * - array[3] contains bits 23-16, - * - array[4] contains bits 15-8, and - * - array[5] contains bits 7-0. - */ -typedef struct { - OI_UINT8 addr[OI_BD_ADDR_BYTE_SIZE]; /**< Bluetooth device address represented as an array of 8-bit values */ -} OI_BD_ADDR; - -/** - * @name Data types for working with UUIDs - * UUIDs are 16 bytes (128 bits). - * - * To avoid having to pass around 128-bit values all the time, 32-bit and 16-bit - * UUIDs are defined, along with a mapping from the shorter versions to the full - * version. - * - * @{ - */ - -/** - * 16-bit representation of a 128-bit UUID - */ -typedef OI_UINT16 OI_UUID16; - -/** - * 32-bit representation of a 128-bit UUID - */ -typedef OI_UINT32 OI_UUID32; - -/** - * number of bytes in a 128 bit UUID - */ -#define OI_BT_UUID128_SIZE 16 - -/** - * number of bytes in IPv6 style addresses - */ -#define OI_BT_IPV6ADDR_SIZE 16 - -/** - * type definition for a 128-bit UUID - * - * To simplify conversion between 128-bit UUIDs and 16-bit and 32-bit UUIDs, - * the most significant 32 bits are stored with the same endian-ness as is - * native on the target (local) device. The remainder of the 128-bit UUID is - * stored as bytes in big-endian order. - */ -typedef struct { - OI_UINT32 ms32bits; /**< most significant 32 bits of 128-bit UUID */ - OI_UINT8 base[OI_BT_UUID128_SIZE - sizeof(OI_UINT32)]; /**< remainder of 128-bit UUID, array of 8-bit values */ -} OI_UUID128; - -/** @} */ - -/** number of bytes in a link key */ -#define OI_BT_LINK_KEY_SIZE 16 - -/** - * type definition for a baseband link key - * - * Because 128-bit integers may not be supported on all platforms, we define - * link keys as an array of bytes. Unlike the Bluetooth device address, - * the link key is stored in little-endian order, meaning that - * - array[0] contains bits 0 - 7, - * - array[1] contains bits 8 - 15, - * - array[2] contains bits 16 - 23, - * - array[3] contains bits 24 - 31, - * - array[4] contains bits 32 - 39, - * - array[5] contains bits 40 - 47, - * - array[6] contains bits 48 - 55, - * - array[7] contains bits 56 - 63, - * - array[8] contains bits 64 - 71, - * - array[9] contains bits 72 - 79, - * - array[10] contains bits 80 - 87, - * - array[11] contains bits 88 - 95, - * - array[12] contains bits 96 - 103, - * - array[13] contains bits 104- 111, - * - array[14] contains bits 112- 119, and - * - array[15] contains bits 120- 127. - */ -typedef struct { - OI_UINT8 key[OI_BT_LINK_KEY_SIZE]; /**< link key represented as an array of 8-bit values */ -} OI_LINK_KEY; - -/** Out-of-band data size - C and R values are 16-bytes each */ -#define OI_BT_OOB_NUM_BYTES 16 - -typedef struct { - OI_UINT8 value[OI_BT_OOB_NUM_BYTES]; /**< same struct used for C and R values */ -} OI_OOB_DATA; - -/** - * link key types - */ -typedef enum { - OI_LINK_KEY_TYPE_COMBO = 0, /**< combination key */ - OI_LINK_KEY_TYPE_LOCAL_UNIT = 1, /**< local unit key */ - OI_LINK_KEY_TYPE_REMOTE_UNIT = 2, /**< remote unit key */ - OI_LINK_KEY_TYPE_DEBUG_COMBO = 3, /**< debug combination key */ - OI_LINK_KEY_TYPE_UNAUTHENTICATED = 4, /**< Unauthenticated */ - OI_LINK_KEY_TYPE_AUTHENTICATED = 5, /**< Authenticated */ - OI_LINK_KEY_TYPE_CHANGED_COMBO = 6 /**< Changed */ - -} OI_BT_LINK_KEY_TYPE; - -/** amount of space allocated for a PIN (personal indentification number) in bytes */ -#define OI_BT_PIN_CODE_SIZE 16 - -/** data type for a PIN (PINs are treated as strings, so endianness does not apply.) */ -typedef struct { - OI_UINT8 pin[OI_BT_PIN_CODE_SIZE]; /**< PIN represented as an array of 8-bit values */ -} OI_PIN_CODE; - -/** maximum number of SCO connections per device, which is 3 as of version 2.0+EDR - of the Bluetooth specification (see sec 4.3 of vol 2 part B) */ -#define OI_BT_MAX_SCO_CONNECTIONS 3 - -/** data type for clock offset */ -typedef OI_UINT16 OI_BT_CLOCK_OFFSET; - -/** data type for a LM handle */ -typedef OI_UINT16 OI_HCI_LM_HANDLE; - -/** opaque data type for a SCO or ACL connection handle */ -typedef struct _OI_HCI_CONNECTION *OI_HCI_CONNECTION_HANDLE; - -/** data type for HCI Error Code, as defined in oi_hcispec.h */ -typedef OI_UINT8 OI_HCI_ERROR_CODE; - -/** - * The Bluetooth device type is indicated by a 24-bit bitfield, represented as a - * 32-bit number in the stack. The bit layout and values for device class are specified - * in the file oi_bt_assigned_nos.h and in the Bluetooth "Assigned Numbers" specification - * at http://www.bluetooth.org/assigned-numbers/. - */ -typedef OI_UINT32 OI_BT_DEVICE_CLASS; - -#define OI_BT_DEV_CLASS_FORMAT_MASK 0x000003 /**< Bits 0-1 contain format type. */ -#define OI_BT_DEV_CLASS_MINOR_DEVICE_MASK 0x0000FC /**< Bits 2-7 contain minor device class value. */ -#define OI_BT_DEV_CLASS_MAJOR_DEVICE_MASK 0x001F00 /**< Bits 8-12 contain major device class value. */ -#define OI_BT_DEV_CLASS_MAJOR_SERVICE_MASK 0xFFE000 /**< Bits 13-23 contain major service class value. */ - -/** There is currently only one device class format defined, type 00. */ -#define OI_BT_DEV_CLASS_FORMAT_TYPE 00 - -/** Bit 13 in device class indicates limited discoverability mode (GAP v2.0+EDR, section 4.1.2.2) */ -#define OI_BT_DEV_CLASS_LIMITED_DISCO_BIT BIT13 - -/** macro to test validity of the Device Class Format */ -#define OI_BT_VALID_DEVICE_CLASS_FORMAT(class) (OI_BT_DEV_CLASS_FORMAT_TYPE == ((class) & OI_BT_DEV_CLASS_FORMAT_MASK)) - -/** the time between baseband clock ticks, currently 625 microseconds (one slot) */ -#define OI_BT_TICK 625 -/** some macros to convert to/from baseband clock ticks - use no floating point! */ -#define OI_SECONDS_TO_BT_TICKS(secs) ((secs)*1600) -#define OI_BT_TICKS_TO_SECONDS(ticks) ((ticks) / 1600) -#define OI_MSECS_TO_BT_TICKS(msecs) (((msecs)*8) / 5) -#define OI_BT_TICKS_TO_MSECS(ticks) (((ticks)*5) / 8) - -/** EIR byte order */ -#define OI_EIR_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER - -#ifdef __cplusplus -} -#endif - -/**@}*/ - -/*****************************************************************************/ -#endif /* _OI_BT_SPEC_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_codec_sbc.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_codec_sbc.h deleted file mode 100644 index d8b7206b..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_codec_sbc.h +++ /dev/null @@ -1,478 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -#ifndef _OI_CODEC_SBC_CORE_H -#define _OI_CODEC_SBC_CORE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** -@file -Declarations of codec functions, data types, and macros. - -@ingroup codec_lib -*/ - -/** -@addtogroup codec_lib -@{ -*/ - -/* Non-BM3 users of of the codec must include oi_codec_sbc_bm3defs.h prior to - * including this file, or else these includes will fail because the BM3 SDK is - * not in the include path */ -#ifndef _OI_CODEC_SBC_BM3DEFS_H -#include "oi_stddefs.h" -#include "oi_status.h" -#endif - -#include - -#define SBC_MAX_CHANNELS 2 -#define SBC_MAX_BANDS 8 -#define SBC_MAX_BLOCKS 16 -#define SBC_MIN_BITPOOL 2 /**< Minimum size of the bit allocation pool used to encode the stream */ -#define SBC_MAX_BITPOOL 250 /**< Maximum size of the bit allocation pool used to encode the stream */ -#define SBC_MAX_ONE_CHANNEL_BPS 320000 -#define SBC_MAX_TWO_CHANNEL_BPS 512000 - -#define SBC_WBS_BITRATE 62000 -#define SBC_WBS_BITPOOL 27 -#define SBC_WBS_NROF_BLOCKS 16 -#define SBC_WBS_FRAME_LEN 62 -#define SBC_WBS_SAMPLES_PER_FRAME 128 - -#define SBC_HEADER_LEN 4 -#define SBC_MAX_FRAME_LEN (SBC_HEADER_LEN + \ - ((SBC_MAX_BANDS * SBC_MAX_CHANNELS / 2) + \ - (SBC_MAX_BANDS + SBC_MAX_BLOCKS * SBC_MAX_BITPOOL + 7) / 8)) -#define SBC_MAX_SAMPLES_PER_FRAME (SBC_MAX_BANDS * SBC_MAX_BLOCKS) - -#define SBC_MAX_SCALEFACTOR_BYTES ((4 * (SBC_MAX_CHANNELS * SBC_MAX_BANDS) + 7) / 8) - -#define OI_SBC_SYNCWORD 0x9c -#define OI_SBC_ENHANCED_SYNCWORD 0x9d -#define OI_mSBC_SYNCWORD 0xad - -#define OI_SBC_MODE_STD 0 -#define OI_SBC_MODE_MSBC 1 - -/**@name Sampling frequencies */ -/**@{*/ -#define SBC_FREQ_16000 0 /**< The sampling frequency is 16 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */ -#define SBC_FREQ_32000 1 /**< The sampling frequency is 32 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */ -#define SBC_FREQ_44100 2 /**< The sampling frequency is 44.1 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */ -#define SBC_FREQ_48000 3 /**< The sampling frequency is 48 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */ -/**@}*/ - -/**@name Channel modes */ -/**@{*/ -#define SBC_MONO 0 /**< The mode of the encoded channel is mono. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */ -#define SBC_DUAL_CHANNEL 1 /**< The mode of the encoded channel is dual-channel. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */ -#define SBC_STEREO 2 /**< The mode of the encoded channel is stereo. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */ -#define SBC_JOINT_STEREO 3 /**< The mode of the encoded channel is joint stereo. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */ -/**@}*/ - -/**@name Subbands */ -/**@{*/ -#define SBC_SUBBANDS_4 0 /**< The encoded stream has 4 subbands. One possible value for the @a subbands parameter of OI_CODEC_SBC_EncoderConfigure()*/ -#define SBC_SUBBANDS_8 1 /**< The encoded stream has 8 subbands. One possible value for the @a subbands parameter of OI_CODEC_SBC_EncoderConfigure() */ -/**@}*/ - -/**@name Block lengths */ -/**@{*/ -#define SBC_BLOCKS_4 0 /**< A block size of 4 blocks was used to encode the stream. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */ -#define SBC_BLOCKS_8 1 /**< A block size of 8 blocks was used to encode the stream is. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */ -#define SBC_BLOCKS_12 2 /**< A block size of 12 blocks was used to encode the stream. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */ -#define SBC_BLOCKS_16 3 /**< A block size of 16 blocks was used to encode the stream. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */ -/**@}*/ - -/**@name Bit allocation methods */ -/**@{*/ -#define SBC_LOUDNESS 0 /**< The bit allocation method. One possible value for the @a loudness parameter of OI_CODEC_SBC_EncoderConfigure() */ -#define SBC_SNR 1 /**< The bit allocation method. One possible value for the @a loudness parameter of OI_CODEC_SBC_EncoderConfigure() */ -/**@}*/ - -/** -@} - -@addtogroup codec_internal -@{ -*/ - -typedef OI_INT16 SBC_BUFFER_T; - -/** Used internally. */ -typedef struct { - OI_UINT16 frequency; /**< The sampling frequency. Input parameter. */ - OI_UINT8 freqIndex; - - OI_UINT8 nrof_blocks; /**< The block size used to encode the stream. Input parameter. */ - OI_UINT8 blocks; - - OI_UINT8 nrof_subbands; /**< The number of subbands of the encoded stream. Input parameter. */ - OI_UINT8 subbands; - - OI_UINT8 mode; /**< The mode of the encoded channel. Input parameter. */ - OI_UINT8 nrof_channels; /**< The number of channels of the encoded stream. */ - - OI_UINT8 alloc; /**< The bit allocation method. Input parameter. */ - OI_UINT8 bitpool; /**< Size of the bit allocation pool used to encode the stream. Input parameter. */ - OI_UINT8 crc; /**< Parity check byte used for error detection. */ - OI_UINT8 join; /**< Whether joint stereo has been used. */ - OI_UINT8 enhanced; - OI_UINT8 min_bitpool; /**< This value is only used when encoding. SBC_MAX_BITPOOL if variable - bitpools are disallowed, otherwise the minimum bitpool size that will - be used by the bit allocator. */ - - OI_UINT8 cachedInfo; /**< Information about the previous frame */ -} OI_CODEC_SBC_FRAME_INFO; - -/** Used internally. */ -typedef struct { - const OI_CHAR *codecInfo; - OI_CODEC_SBC_FRAME_INFO frameInfo; - OI_INT8 scale_factor[SBC_MAX_CHANNELS * SBC_MAX_BANDS]; - OI_UINT32 frameCount; - OI_INT32 *subdata; - - SBC_BUFFER_T *filterBuffer[SBC_MAX_CHANNELS]; - OI_INT32 filterBufferLen; - OI_UINT filterBufferOffset; - - union { - OI_UINT8 uint8[SBC_MAX_CHANNELS * SBC_MAX_BANDS]; - OI_UINT32 uint32[SBC_MAX_CHANNELS * SBC_MAX_BANDS / 4]; - } bits; - OI_UINT8 maxBitneed; /**< Running maximum bitneed */ - OI_BYTE formatByte; - OI_UINT8 pcmStride; - OI_UINT8 maxChannels; -} OI_CODEC_SBC_COMMON_CONTEXT; - -/* - * A smaller value reduces RAM usage at the expense of increased CPU usage. Values in the range - * 27..50 are recommended, beyond 50 there is a diminishing return on reduced CPU usage. - */ -#define SBC_CODEC_MIN_FILTER_BUFFERS 16 -#define SBC_CODEC_FAST_FILTER_BUFFERS 27 - -/* Expands to the number of OI_UINT32s needed to ensure enough memory to encode - * or decode streams of numChannels channels, using numBuffers buffers. - * Example: - * OI_UINT32 decoderData[CODEC_DATA_WORDS(SBC_MAX_CHANNELS, SBC_DECODER_FAST_SYNTHESIS_BUFFERS)]; - * */ -#define CODEC_DATA_WORDS(numChannels, numBuffers) \ - (( \ - (sizeof(OI_INT32) * SBC_MAX_BLOCKS * numChannels * SBC_MAX_BANDS) + (sizeof(SBC_BUFFER_T) * SBC_MAX_CHANNELS * SBC_MAX_BANDS * numBuffers) + (sizeof(OI_UINT32) - 1)) / \ - sizeof(OI_UINT32)) - -/** Opaque parameter to decoding functions; maintains decoder context. */ -typedef struct { - OI_CODEC_SBC_COMMON_CONTEXT common; - OI_UINT8 limitFrameFormat; /* Boolean, set by OI_CODEC_SBC_DecoderLimit() */ - OI_UINT8 restrictSubbands; - OI_UINT8 enhancedEnabled; - OI_UINT8 bufferedBlocks; - OI_UINT8 sbc_mode; /* OI_SBC_MODE_STD or OI_SBC_MODE_MSBC */ -} OI_CODEC_SBC_DECODER_CONTEXT; - -typedef struct { - OI_UINT32 data[CODEC_DATA_WORDS(1, SBC_CODEC_FAST_FILTER_BUFFERS)]; -} OI_CODEC_SBC_CODEC_DATA_MONO; - -typedef struct { - OI_UINT32 data[CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)]; -} OI_CODEC_SBC_CODEC_DATA_STEREO; - -/** -@} - -@addtogroup codec_lib -@{ -*/ - -/** - * This function resets the decoder. The context must be reset when - * changing streams, or if the following stream parameters change: - * number of subbands, stereo mode, or frequency. - * - * @param context Pointer to the decoder context structure to be reset. - * - * @param enhanced If true, enhanced SBC operation is enabled. If enabled, - * the codec will recognize the alternative syncword for - * decoding an enhanced SBC stream. Enhancements should not - * be enabled unless the stream is known to be generated - * by an enhanced encoder, or there is a small possibility - * for decoding glitches if synchronization were to be lost. - */ -OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context, - OI_UINT32 *decoderData, - OI_UINT32 decoderDataBytes, - OI_UINT8 maxChannels, - OI_UINT8 pcmStride, - OI_BOOL enhanced, - OI_BOOL msbc_enable); - -/** - * This function restricts the kind of SBC frames that the Decoder will - * process. Its use is optional. If used, it must be called after - * calling OI_CODEC_SBC_DecoderReset(). After it is called, any calls - * to OI_CODEC_SBC_DecodeFrame() with SBC frames that do not conform - * to the Subband and Enhanced SBC setting will be rejected with an - * OI_STATUS_INVALID_PARAMETERS return. - * - * @param context Pointer to the decoder context structure to be limited. - * - * @param enhanced If true, all frames passed to the decoder must be - * Enhanced SBC frames. If false, all frames must be - * standard SBC frames. - * - * @param subbands May be set to SBC_SUBBANDS_4 or SBC_SUBBANDS_8. All - * frames passed to the decoder must be encoded with - * the requested number of subbands. - * - */ -OI_STATUS OI_CODEC_SBC_DecoderLimit(OI_CODEC_SBC_DECODER_CONTEXT *context, - OI_BOOL enhanced, - OI_UINT8 subbands); - -/** - * This function sets the decoder parameters for a raw decode where the decoder parameters are not - * available in the sbc data stream. OI_CODEC_SBC_DecoderReset must be called - * prior to calling this function. - * - * @param context Decoder context structure. This must be the context must be - * used each time a frame is decoded. - * - * @param enhanced Set to TRUE to enable Qualcomm proprietary - * quality enhancements. - * - * @param frequency One of SBC_FREQ_16000, SBC_FREQ_32000, SBC_FREQ_44100, - * SBC_FREQ_48000 - * - * @param mode One of SBC_MONO, SBC_DUAL_CHANNEL, SBC_STEREO, - * SBC_JOINT_STEREO - * - * @param subbands One of SBC_SUBBANDS_4, SBC_SUBBANDS_8 - * - * @param blocks One of SBC_BLOCKS_4, SBC_BLOCKS_8, SBC_BLOCKS_12, - * SBC_BLOCKS_16 - * - * @param alloc One of SBC_LOUDNESS, SBC_SNR - * - * @param maxBitpool The maximum bitpool size for this context - */ -OI_STATUS OI_CODEC_SBC_DecoderConfigureRaw(OI_CODEC_SBC_DECODER_CONTEXT *context, - OI_BOOL enhanced, - OI_UINT8 frequency, - OI_UINT8 mode, - OI_UINT8 subbands, - OI_UINT8 blocks, - OI_UINT8 alloc, - OI_UINT8 maxBitpool); - -/** - * Decode one SBC frame. The frame has no header bytes. The context must have been previously - * initialized by calling OI_CODEC_SBC_DecoderConfigureRaw(). - * - * @param context Pointer to a decoder context structure. The same context - * must be used each time when decoding from the same stream. - * - * @param bitpool The actual bitpool size for this frame. Must be <= the maxbitpool specified - * in the call to OI_CODEC_SBC_DecoderConfigureRaw(), - * - * @param frameData Address of a pointer to the SBC data to decode. This - * value will be updated to point to the next frame after - * successful decoding. - * - * @param frameBytes Pointer to a UINT32 containing the number of available - * bytes of frame data. This value will be updated to reflect - * the number of bytes remaining after a decoding operation. - * - * @param pcmData Address of an array of OI_INT16 pairs, which will be - * populated with the decoded audio data. This address - * is not updated. - * - * @param pcmBytes Pointer to a UINT32 in/out parameter. On input, it - * should contain the number of bytes available for pcm - * data. On output, it will contain the number of bytes - * written. Note that this differs from the semantics of - * frameBytes. - */ -OI_STATUS OI_CODEC_SBC_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context, - OI_UINT8 bitpool, - const OI_BYTE **frameData, - OI_UINT32 *frameBytes, - OI_INT16 *pcmData, - OI_UINT32 *pcmBytes); - -/** - * Decode one SBC frame. - * - * @param context Pointer to a decoder context structure. The same context - * must be used each time when decoding from the same stream. - * - * @param frameData Address of a pointer to the SBC data to decode. This - * value will be updated to point to the next frame after - * successful decoding. - * - * @param frameBytes Pointer to a UINT32 containing the number of available - * bytes of frame data. This value will be updated to reflect - * the number of bytes remaining after a decoding operation. - * - * @param pcmData Address of an array of OI_INT16 pairs, which will be - * populated with the decoded audio data. This address - * is not updated. - * - * @param pcmBytes Pointer to a UINT32 in/out parameter. On input, it - * should contain the number of bytes available for pcm - * data. On output, it will contain the number of bytes - * written. Note that this differs from the semantics of - * frameBytes. - */ -OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, - const OI_BYTE **frameData, - OI_UINT32 *frameBytes, - OI_INT16 *pcmData, - OI_UINT32 *pcmBytes); - -/** - * Calculate the number of SBC frames but don't decode. CRC's are not checked, - * but the Sync word is found prior to count calculation. - * - * @param frameData Pointer to the SBC data. - * - * @param frameBytes Number of bytes avaiable in the frameData buffer - * - */ -OI_UINT8 OI_CODEC_SBC_FrameCount(OI_BYTE *frameData, - OI_UINT32 frameBytes); - -/** - * Analyze an SBC frame but don't do the decode. - * - * @param context Pointer to a decoder context structure. The same context - * must be used each time when decoding from the same stream. - * - * @param frameData Address of a pointer to the SBC data to decode. This - * value will be updated to point to the next frame after - * successful decoding. - * - * @param frameBytes Pointer to a UINT32 containing the number of available - * bytes of frame data. This value will be updated to reflect - * the number of bytes remaining after a decoding operation. - * - */ -OI_STATUS OI_CODEC_SBC_SkipFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, - const OI_BYTE **frameData, - OI_UINT32 *frameBytes); - -/* Common functions */ - -/** - Calculate the frame length. - - @param frame The frame whose length to calculate - - @return the length of an individual encoded frame in - bytes - */ -OI_UINT16 OI_CODEC_SBC_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame); - -/** - * Calculate the maximum bitpool size that fits within a given frame length. - * - * @param frame The frame to calculate the bitpool size for - * @param frameLen The frame length to fit the bitpool to - * - * @return the maximum bitpool that will fit in the specified frame length - */ -OI_UINT16 OI_CODEC_SBC_CalculateBitpool(OI_CODEC_SBC_FRAME_INFO *frame, - OI_UINT16 frameLen); - -/** - Calculate the bit rate. - - @param frame The frame whose bit rate to calculate - - @return the approximate bit rate in bits per second, - assuming that stream parameters are constant - */ -OI_UINT32 OI_CODEC_SBC_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame); - -/** - Calculate decoded audio data length for one frame. - - @param frame The frame whose audio data length to calculate - - @return length of decoded audio data for a - single frame, in bytes - */ -OI_UINT16 OI_CODEC_SBC_CalculatePcmBytes(OI_CODEC_SBC_COMMON_CONTEXT *common); - -/** - * Get the codec version text. - * - * @return pointer to text string containing codec version text - * - */ -OI_CHAR *OI_CODEC_Version(void); - -/** -@} - -@addtogroup codec_internal -@{ -*/ - -extern const OI_CHAR *const OI_CODEC_SBC_FreqText[]; -extern const OI_CHAR *const OI_CODEC_SBC_ModeText[]; -extern const OI_CHAR *const OI_CODEC_SBC_SubbandsText[]; -extern const OI_CHAR *const OI_CODEC_SBC_BlocksText[]; -extern const OI_CHAR *const OI_CODEC_SBC_AllocText[]; - -/** -@} - -@addtogroup codec_lib -@{ -*/ - -#ifdef OI_DEBUG -void OI_CODEC_SBC_DumpConfig(OI_CODEC_SBC_FRAME_INFO *frameInfo); -#else -#define OI_CODEC_SBC_DumpConfig(f) -#endif - -/** -@} -*/ - -#ifdef __cplusplus -} -#endif - -#endif /* _OI_CODEC_SBC_CORE_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_codec_sbc_private.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_codec_sbc_private.h deleted file mode 100644 index 09b2efc6..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_codec_sbc_private.h +++ /dev/null @@ -1,234 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#ifndef _OI_CODEC_SBC_PRIVATE_H -#define _OI_CODEC_SBC_PRIVATE_H - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -/** -@file -Function prototypes and macro definitions used internally by the codec. - -@ingroup codec_internal -*/ - -/** -@addtogroup codec_internal -@{ -*/ - -#ifdef USE_RESTRICT_KEYWORD -#define RESTRICT restrict -#else -#define RESTRICT -#endif - -#ifdef CODEC_DEBUG -#include -#define ERROR(x) \ - do { \ - BT_WARN x; \ - BT_WARN("\n"); \ - } while (0) -#else -#define ERROR(x) -#endif - -#ifdef TRACE_EXECUTION -#define TRACE(x) \ - do { \ - BT_WARN x; \ - BT_WARN("\n"); \ - } while (0) -#else -#define TRACE(x) -#endif - -#ifndef PRIVATE -#define PRIVATE -#endif - -#ifndef INLINE -#define INLINE -#endif - -#include "oi_assert.h" -#include "oi_codec_sbc.h" - -#ifndef OI_SBC_SYNCWORD -#define OI_SBC_SYNCWORD 0x9c -#endif - -#ifndef DIVIDE -#define DIVIDE(a, b) ((a) / (b)) -#endif - -typedef union { - OI_UINT8 uint8[SBC_MAX_BANDS]; - OI_UINT32 uint32[SBC_MAX_BANDS / 4]; -} BITNEED_UNION1; - -typedef union { - OI_UINT8 uint8[2 * SBC_MAX_BANDS]; - OI_UINT32 uint32[2 * SBC_MAX_BANDS / 4]; -} BITNEED_UNION2; - -static const OI_UINT16 freq_values[] = { 16000, 32000, 44100, 48000 }; -static const OI_UINT8 block_values[] = { 4, 8, 12, 16 }; -static const OI_UINT8 channel_values[] = { 1, 2, 2, 2 }; -static const OI_UINT8 band_values[] = { 4, 8 }; - -#define TEST_MODE_SENTINEL "OINA" -#define TEST_MODE_SENTINEL_LENGTH 4 - -/** Used internally. */ -typedef struct { - union { - const OI_UINT8 *r; - OI_UINT8 *w; - } ptr; - OI_UINT32 value; - OI_UINT bitPtr; -} OI_BITSTREAM; - -#define VALID_INT16(x) (((x) >= OI_INT16_MIN) && ((x) <= OI_INT16_MAX)) -#define VALID_INT32(x) (((x) >= OI_INT32_MIN) && ((x) <= OI_INT32_MAX)) - -#define DCTII_8_SHIFT_IN 0 -#define DCTII_8_SHIFT_OUT 16 - DCTII_8_SHIFT_IN - -#define DCTII_8_SHIFT_0 (DCTII_8_SHIFT_OUT) -#define DCTII_8_SHIFT_1 (DCTII_8_SHIFT_OUT) -#define DCTII_8_SHIFT_2 (DCTII_8_SHIFT_OUT) -#define DCTII_8_SHIFT_3 (DCTII_8_SHIFT_OUT) -#define DCTII_8_SHIFT_4 (DCTII_8_SHIFT_OUT) -#define DCTII_8_SHIFT_5 (DCTII_8_SHIFT_OUT) -#define DCTII_8_SHIFT_6 (DCTII_8_SHIFT_OUT - 1) -#define DCTII_8_SHIFT_7 (DCTII_8_SHIFT_OUT - 2) - -#define DCT_SHIFT 15 - -#define DCTIII_4_SHIFT_IN 2 -#define DCTIII_4_SHIFT_OUT 15 - -#define DCTIII_8_SHIFT_IN 3 -#define DCTIII_8_SHIFT_OUT 14 - -OI_UINT computeBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common, - OI_UINT8 *bitneeds, - OI_UINT ch, - OI_UINT *preferredBitpool); - -void oneChannelBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common, - BITNEED_UNION1 *bitneeds, - OI_UINT ch, - OI_UINT bitcount); - -OI_INT adjustToFitBitpool(const OI_UINT bitpool, - OI_UINT32 *bitneeds, - const OI_UINT subbands, - OI_UINT bitcount, - OI_UINT *excess); - -OI_INT allocAdjustedBits(OI_UINT8 *dest, - OI_INT bits, - OI_INT excess); - -OI_INT allocExcessBits(OI_UINT8 *dest, - OI_INT excess); - -PRIVATE OI_UINT32 internal_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame); - -PRIVATE OI_UINT16 internal_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame); - -void monoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common); - -typedef void (*BIT_ALLOC)(OI_CODEC_SBC_COMMON_CONTEXT *common); - -PRIVATE OI_STATUS internal_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context, - OI_UINT8 bitpool, - const OI_BYTE **frameData, - OI_UINT32 *frameBytes, - OI_INT16 *pcmData, - OI_UINT32 *pcmBytes); - -OI_STATUS internal_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context, - OI_UINT32 *decoderData, - OI_UINT32 decoderDataBytes, - OI_BYTE maxChannels, - OI_BYTE pcmStride, - OI_BOOL enhanced, - OI_BOOL msbc_enable); - -OI_UINT16 OI_SBC_CalculateFrameAndHeaderlen(OI_CODEC_SBC_FRAME_INFO *frame, OI_UINT *headerLen_); - -PRIVATE OI_UINT32 OI_SBC_MaxBitpool(OI_CODEC_SBC_FRAME_INFO *frame); - -PRIVATE void OI_SBC_ComputeBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *frame); -PRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data); - -/* Transform functions */ -PRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount); -PRIVATE void cosineModulateSynth4(SBC_BUFFER_T *RESTRICT out, OI_INT32 const *RESTRICT in); -PRIVATE void SynthWindow40_int32_int32_symmetry_with_sum(OI_INT16 *pcm, SBC_BUFFER_T buffer[80], OI_UINT strideShift); - -void dct3_4(OI_INT32 *RESTRICT out, OI_INT32 const *RESTRICT in); -PRIVATE void analyze4_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 40], - OI_INT16 *pcm, - OI_UINT strideShift, - OI_INT32 subband[4]); - -void dct3_8(OI_INT32 *RESTRICT out, OI_INT32 const *RESTRICT in); - -PRIVATE void analyze8_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 80], - OI_INT16 *pcm, - OI_UINT strideShift, - OI_INT32 subband[8]); - -#ifdef SBC_ENHANCED -PRIVATE void analyze8_enhanced_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 112], - OI_INT16 *pcm, - OI_UINT strideShift, - OI_INT32 subband[8]); -#endif - -/* Decoder functions */ - -void OI_SBC_ReadHeader(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *data); -PRIVATE void OI_SBC_ReadScalefactors(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *b, OI_BITSTREAM *bs); -PRIVATE void OI_SBC_ReadSamples(OI_CODEC_SBC_DECODER_CONTEXT *common, OI_BITSTREAM *ob); -PRIVATE void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_DECODER_CONTEXT *common, OI_BITSTREAM *global_bs); -PRIVATE void OI_SBC_SynthFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT start_block, OI_UINT nrof_blocks); -OI_INT32 OI_SBC_Dequant(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits); -PRIVATE OI_BOOL OI_SBC_ExamineCommandPacket(OI_CODEC_SBC_DECODER_CONTEXT *context, const OI_BYTE *data, OI_UINT32 len); -PRIVATE void OI_SBC_GenerateTestSignal(OI_INT16 pcmData[][2], OI_UINT32 sampleCount); - -PRIVATE void OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame); -PRIVATE OI_STATUS OI_CODEC_SBC_Alloc(OI_CODEC_SBC_COMMON_CONTEXT *common, - OI_UINT32 *codecDataAligned, - OI_UINT32 codecDataBytes, - OI_UINT8 maxChannels, - OI_UINT8 pcmStride); -/** -@} -*/ - -#endif /* _OI_CODEC_SBC_PRIVATE_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_codec_version.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_codec_version.c deleted file mode 100644 index e033226f..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_codec_version.c +++ /dev/null @@ -1,57 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/** -@file -This file contains a single function, which returns a string indicating the -version number of the eSBC codec - -@ingroup codec_internal -*/ - -/** -@addtogroup codec_internal -@{ -*/ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ -#include "oi_codec_sbc_private.h" -#include "oi_stddefs.h" - -#if defined(SBC_DEC_INCLUDED) -/** Version string for the BLUEmagic 3.0 protocol stack and profiles */ -PRIVATE OI_CHAR *const codecVersion = "v1.5" -#ifdef OI_SBC_EVAL - " (Evaluation version)" -#endif - ; - -/** This function returns the version string for the BLUEmagic 3.0 protocol stack - and profiles */ -OI_CHAR *OI_CODEC_Version(void) { return codecVersion; } - -/**********************************************************************************/ - -/** -@} -*/ - -#endif /* #if defined(SBC_DEC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_common.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_common.h deleted file mode 100644 index 39eda8f7..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_common.h +++ /dev/null @@ -1,42 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#ifndef _OI_COMMON_H -#define _OI_COMMON_H -/** - * @file - * - * This file is used to group commonly used BLUEmagic 3.0 software - * header files. - * - * This file should be included in application source code along with the header - * files for the specific modules of the protocol stack being used. - */ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -#include "oi_bt_spec.h" -#include "oi_stddefs.h" -#include "oi_status.h" -#include "oi_time.h" -#include "oi_osinterface.h" - -/*****************************************************************************/ -#endif /* _OI_COMMON_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_cpu_dep.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_cpu_dep.h deleted file mode 100644 index 04d41266..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_cpu_dep.h +++ /dev/null @@ -1,498 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#ifndef _OI_CPU_DEP_H -#define _OI_CPU_DEP_H -/** - * @file - * This file contains definitions for characteristics of the target CPU and - * compiler, including primitive data types and endianness. - * - * This file defines the byte order and primitive data types for various - * CPU families. The preprocessor symbol 'CPU' must be defined to be an - * appropriate value or this header will generate a compile-time error. - * - * @note The documentation for this header file uses the x86 family of processors - * as an illustrative example for CPU/compiler-dependent data type definitions. - * Go to the source code of this header file to see the details of primitive type - * definitions for each platform. - * - * Additional information is available in the @ref data_types_docpage section. - */ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -#ifdef __cplusplus -extern "C" { -#endif - -/** \addtogroup Misc Miscellaneous APIs */ -/**@{*/ - -/** @name Definitions indicating family of target OI_CPU_TYPE - * @{ - */ - -#define OI_CPU_X86 1 /**< x86 processor family */ -#define OI_CPU_ARM 2 /**< ARM processor family. - @deprecated Use #OI_CPU_ARM7_LEND or - #OI_CPU_ARM7_BEND. */ -#define OI_CPU_ARC 3 /**< ARC processor family. - @deprecated Use #OI_CPU_ARC_LEND or - #OI_CPU_ARC_BEND. */ -#define OI_CPU_SH3 4 /**< Hitachi SH-3 processor family */ -#define OI_CPU_H8 5 /**< Hitachi H8 processor family */ -#define OI_CPU_MIPS 6 /**< MIPS processor family */ -#define OI_CPU_SPARC 7 /**< SPARC processor family */ -#define OI_CPU_M68000 8 /**< Motorola M68000 processor family */ -#define OI_CPU_PPC 9 /**< PowerPC (PPC) processor family */ -#define OI_CPU_SH4_7750 10 /**< Hitachi SH7750 series in SH-4 processor family */ -#define OI_CPU_SH2 11 /**< Hitachi SH-2 processor family */ -#define OI_CPU_ARM7_LEND 12 /**< ARM7, little-endian */ -#define OI_CPU_ARM7_BEND 13 /**< ARM7, big-endian */ -#define OI_CPU_GDM1202 14 /**< GCT GDM1202 */ -#define OI_CPU_ARC_LEND 15 /**< ARC processor family, little-endian */ -#define OI_CPU_ARC_BEND 16 /**< ARC processor family, big-endian */ -#define OI_CPU_M30833F 17 /**< Mitsubishi M308 processor family */ -#define OI_CPU_CR16C 18 /**< National Semiconductor 16 bit processor family */ -#define OI_CPU_M64111 19 /**< Renesas M64111 processor (M32R family) */ -#define OI_CPU_ARMV5_LEND 20 //*< ARM5, little-endian */ - -#define OI_CPU_TYPE 12 - -#ifndef OI_CPU_TYPE -#error "OI_CPU_TYPE type not defined" -#endif - -/**@}*/ - -/** @name Definitions indicating byte-wise endianness of target CPU - * @{ - */ - -#define OI_BIG_ENDIAN_BYTE_ORDER 0 /**< Multiple-byte values are stored in memory beginning with the most significant byte at the lowest address. */ -#define OI_LITTLE_ENDIAN_BYTE_ORDER 1 /**< Multiple-byte values are stored in memory beginning with the least significant byte at the lowest address. */ - -/**@}*/ - -/** @name CPU/compiler-independent primitive data type definitions - * @{ - */ - -typedef int OI_BOOL; /**< Boolean values use native integer data type for target CPU. */ -typedef int OI_INT; /**< Integer values use native integer data type for target CPU. */ -typedef unsigned int OI_UINT; /**< Unsigned integer values use native unsigned integer data type for target CPU. */ -typedef unsigned char OI_BYTE; /**< Raw bytes type uses native character data type for target CPU. */ - -/**@}*/ - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_X86 - -#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER /**< x86 platform byte ordering is little-endian */ - -/** @name CPU/compiler-dependent primitive data type definitions for x86 processor family - * @{ - */ -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for x86 processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for x86 processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for x86 processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for x86 processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for x86 processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for x86 processor. */ - -typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ - -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_ARM -/* This CPU type is deprecated (removed from use). Instead, use OI_CPU_ARM7_LEND or OI_CPU_ARM7_BEND for - little-endian or big-endian configurations of the ARM7, respectively. */ -#error OI_CPU_ARM is deprecated -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_ARC -/* This CPU type is deprecated (removed from use). Instead, use OI_CPU_ARC_LEND or OI_CPU_ARC_BEND for - little-endian or big-endian configurations of the ARC, respectively. */ -#error OI_CPU_ARC is deprecated -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_SH3 -/* The Hitachi SH C compiler defines _LIT or _BIG, depending on the endianness - specified to the compiler on the command line. */ -#if defined(_LIT) -#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER /**< If _LIT is defined, SH-3 platform byte ordering is little-endian. */ -#elif defined(_BIG) -#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER /**< If _BIG is defined, SH-3 platform byte ordering is big-endian. */ -#else -#error SH compiler endianness undefined -#endif - -/** @name CPU/compiler-dependent primitive data type definitions for SH-3 processor family - * @{ - */ - -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for SH-3 processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for SH-3 processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for SH-3 processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for SH-3 processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for SH-3 processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for SH-3 processor. */ - -typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ - -#endif -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_SH2 - -#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER /**< SH-2 platform byte ordering is big-endian. */ - -/** @name CPU/compiler-dependent primitive data type definitions for SH-2 processor family - * @{ - */ - -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for SH-2 processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for SH-2 processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for SH-2 processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for SH-2 processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for SH-2 processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for SH-2 processor. */ - -typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ - -#endif -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_H8 -#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER -#error basic types not defined -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_MIPS -#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER -/** @name CPU/compiler-dependent primitive data type definitions for MIPS processor family - * @{ - */ -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */ - -typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ - -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_SPARC -#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER -#error basic types not defined -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_M68000 -#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER /**< M68000 platform byte ordering is big-endian. */ - -/** @name CPU/compiler-dependent primitive data type definitions for M68000 processor family - * @{ - */ - -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for M68000 processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for M68000 processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for M68000 processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for M68000 processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for M68000 processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for M68000 processor. */ - -typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ - -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_PPC -#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER - -/** @name CPU/compiler-dependent primitive data type definitions for PPC 8XX processor family - * @{ - */ - -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for PPC8XX processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for PPC8XX processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for PPC8XX processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for PPC8XX processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for PPC8XX processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for PPC8XX processor. */ - -typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ - -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_SH4_7750 -#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER /**< SH7750 platform byte ordering is big-endian. */ - -/** @name CPU/compiler-dependent primitive data type definitions for SH7750 processor series of the SH-4 processor family - * @{ - */ - -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for SH7750 SH-4 processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for SH7750 SH-4 processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for SH7750 SH-4 processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for SH7750 SH-4 processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for SH7750 SH-4 processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for SH7750 SH-4 processor. */ - -typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ - -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_ARM7_LEND -#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER - -/** @name little-endian CPU/compiler-dependent primitive data type definitions for the ARM7 processor family - * @{ - */ - -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */ - -typedef void *OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ - -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_ARM7_BEND -#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER -/** @name big-endian CPU/compiler-dependent primitive data type definitions for the ARM7 processor family - * @{ - */ -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */ - -typedef void *OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ - -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_GDM1202 -#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER - -typedef signed char OI_INT8; /**< 8-bit signed integer. */ -typedef signed short OI_INT16; /**< 16-bit signed integer. */ -typedef signed long OI_INT32; /**< 32-bit signed integer. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer. */ - -typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_ARC_LEND - -#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER - -/** @name CPU/compiler-dependent primitive data type definitions for ARC processor family - * @{ - */ - -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARC processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARC processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARC processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARC processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARC processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARC processor. */ - -typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_ARC_BEND - -#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER - -/** @name CPU/compiler-dependent primitive data type definitions for ARC processor family - * @{ - */ - -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARC processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARC processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARC processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARC processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARC processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARC processor. */ - -typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_M30833F - -#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER - -/** @name CPU/compiler-dependent primitive data type definitions for Mitsubishi M308 processor family - * @{ - */ - -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for M308 processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for M308 processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for M308 processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for M308 processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for M308 processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for M308 processor. */ - -typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_CR16C - -#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER - -/** @name CPU/compiler-dependent primitive data type definitions for National Semicnductor processor family - * @{ - */ - -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for CR16C processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for CR16C processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for CR16C processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for CR16C processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for CR16C processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for CR16C processor. */ - -typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_M64111 - -#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER - -/** @name CPU/compiler-dependent primitive data type definitions for Renesas M32R processor family - * @{ - */ - -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for M64111 processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for M64111 processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for M64111 processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for M64111 processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for M64111 processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for M64111 processor. */ - -typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ -#endif - -/*********************************************************************************/ - -#if OI_CPU_TYPE == OI_CPU_ARMV5_LEND -#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER - -/** @name little-endian CPU/compiler-dependent primitive data type definitions for the ARM7 processor family - * @{ - */ - -typedef signed char OI_INT8; /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */ -typedef signed short OI_INT16; /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */ -typedef signed long OI_INT32; /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */ -typedef unsigned char OI_UINT8; /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */ -typedef unsigned short OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */ -typedef unsigned long OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */ - -typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */ - -/**@}*/ - -#endif - -/*********************************************************************************/ - -#ifndef OI_CPU_BYTE_ORDER -#error "Byte order (endian-ness) not defined" -#endif - -/**@}*/ - -#ifdef __cplusplus -} -#endif - -/*********************************************************************************/ -#endif /* _OI_CPU_DEP_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_modules.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_modules.h deleted file mode 100644 index 90e998ce..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_modules.h +++ /dev/null @@ -1,166 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#ifndef _OI_MODULES_H -#define _OI_MODULES_H -/** - * @file - * - * Enumeration type defining the inidivual stack components. - * - */ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -/** \addtogroup Misc Miscellaneous APIs */ -/**@{*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * This enumeration lists constants for referencing the components of - * the BLUEmagic 3.0 protocol stack, profiles, and other functionalities. - * - * In order to distinguish types of modules, items are grouped with markers to - * delineate start and end of the groups - * - * The module type is used for various purposes: - * identification in debug print statements - * access to initialization flags - * access to the configuration table - */ - -typedef enum { - /* profiles and protocols --> Updates to oi_debug.c and oi_config_table.c */ - - /* XX --> Keep Enum values up-to-date! */ - OI_MODULE_AT, /**< 00 AT command processing */ - OI_MODULE_A2DP, /**< 01 Advanced Audio Distribution Profile */ - OI_MODULE_AVCTP, /**< 02 Audio-Visual Control Transport Profile */ - OI_MODULE_AVDTP, /**< 03 Audio-Visual Distribution Protocol */ - OI_MODULE_AVRCP, /**< 04 Audio-Visual Remote Control Profile */ - OI_MODULE_BIP_CLI, /**< 05 Basic Imaging Profile protocol client */ - OI_MODULE_BIP_SRV, /**< 06 Basic Imaging Profile protocol server */ - OI_MODULE_BNEP, /**< 07 Bluetooth Network Encapsulation Protocol */ - OI_MODULE_BPP_SENDER, /**< 08 Basic Printing Profile */ - OI_MODULE_BPP_PRINTER, /**< 09 Basic Printing Profile */ - OI_MODULE_CTP, /**< 10 Cordless Telephony Profile */ - OI_MODULE_DUN, /**< 11 Dial-Up Networking Profile */ - OI_MODULE_FAX, /**< 12 Fax Profile */ - OI_MODULE_FTP_CLI, /**< 13 File Transfer Profile protocol client */ - OI_MODULE_FTP_SRV, /**< 14 File Transfer Profile protocol server */ - OI_MODULE_HANDSFREE, /**< 15 Hands-Free Profile */ - OI_MODULE_HANDSFREE_AG, /**< 16 Hands-Free Profile */ - OI_MODULE_HCRP_CLI, /**< 17 Hardcopy Cable Replacement Profile */ - OI_MODULE_HCRP_SRV, /**< 18 Hardcopy Cable Replacement Profile */ - OI_MODULE_HEADSET, /**< 19 Headset Profile */ - OI_MODULE_HEADSET_AG, /**< 20 Headset Profile */ - OI_MODULE_HID, /**< 21 Human Interface Device profile */ - OI_MODULE_INTERCOM, /**< 22 Intercom Profile */ - OI_MODULE_OBEX_CLI, /**< 23 OBEX protocol client, Generic Object Exchange Profile */ - OI_MODULE_OBEX_SRV, /**< 24 OBEX protocol server, Generic Object Exchange Profile */ - OI_MODULE_OPP_CLI, /**< 25 Object Push Profile protocol client */ - OI_MODULE_OPP_SRV, /**< 26 Object Push Profile protocol server */ - OI_MODULE_PAN, /**< 27 PAN profile */ - OI_MODULE_PBAP_CLI, /**< 28 Phonebook Access Profile client */ - OI_MODULE_PBAP_SRV, /**< 29 Phonebook Access Profile server */ - OI_MODULE_SAP_CLI, /**< 30 SIM Access Profile */ - OI_MODULE_SAP_SRV, /**< 31 SIM Access Profile */ - OI_MODULE_SPP, /**< 32 Serial Port Profile */ - OI_MODULE_SYNC_CLI, /**< 33 Synchronization Profile */ - OI_MODULE_SYNC_SRV, /**< 34 Synchronization Profile */ - OI_MODULE_SYNC_CMD_CLI, /**< 35 Synchronization Profile */ - OI_MODULE_SYNC_CMD_SRV, /**< 36 Synchronization Profile */ - OI_MODULE_SYNCML, /**< 37 SyncML Profile */ - OI_MODULE_TCS, /**< 38 TCS Binary */ - OI_MODULE_VDP, /**< 39 Video Distribution Profile */ - - /* corestack components --> Updates to oi_debug.c and oi_config_table.c */ - - OI_MODULE_COMMON_CONFIG, /**< 40 Common configuration, module has no meaning other than for config struct */ - OI_MODULE_CMDCHAIN, /**< 41 Command chaining utility */ - OI_MODULE_DISPATCH, /**< 42 Dispatcher */ - OI_MODULE_DATAELEM, /**< 43 Data Elements, marshaller */ - OI_MODULE_DEVMGR, /**< 44 Device Manager */ - OI_MODULE_DEVMGR_MODES, /**< 45 Device Manager connectability/discoverability modes */ - OI_MODULE_HCI, /**< 46 Host Controller Interface command layer */ - OI_MODULE_L2CAP, /**< 47 L2CAP */ - OI_MODULE_MEMMGR, /**< 48 modules that do memory management */ - OI_MODULE_POLICYMGR, /**< 49 Policy Manager */ - OI_MODULE_RFCOMM, /**< 50 RFCOMM */ - OI_MODULE_RFCOMM_SD, /**< 51 RFCOMM Service discovery */ - OI_MODULE_SDP_CLI, /**< 52 Service Discovery Protocol client */ - OI_MODULE_SDP_SRV, /**< 53 Service Discovery Protocol server */ - OI_MODULE_SDPDB, /**< 54 Service Discovery Protocol database */ - OI_MODULE_SECMGR, /**< 55 Security Manager */ - OI_MODULE_SNIFFLOG, /**< 56 sniff log */ - OI_MODULE_SUPPORT, /**< 57 support functions, including CThru Dispatcher, time functions, and stack initialization */ - OI_MODULE_TRANSPORT, /**< 58 transport layer between HCI command layer and driver */ - OI_MODULE_TEST, /**< 59 used to debug output from internal test programs */ - OI_MODULE_XML, /**< 60 XML/CSS parser */ - - OI_MODULE_DI, /**< 61 Device Identification Profile */ - - // bhapi components --> Updates to oi_debug.c - - OI_MODULE_BHAPI, /**< 62 BLUEmagic Host API generic */ - OI_MODULE_BHCLI, /**< 63 BLUEmagic Host API client side */ - OI_MODULE_BHSRV, /**< 64 BLUEmagic Host API server side */ - OI_MODULE_MSGQ, /**< 65 module that handles message queuing */ - OI_MODULE_BHAPI_TRANSPORT, /**< 66 module that handles message queuing */ - OI_MODULE_BLST_SRV, /**< 67 module that provides server side BHAPI Lightweight Serial Transport */ - OI_MODULE_BLST_CLI, /**< 68 module that provides client side BHAPI Lightweight Serial Transport */ - - // OEM files --> Updates to oi_debug.c - OI_MODULE_OEM, /**< 69 Application Memory allocation */ - - // Application glue --> Updates to oi_debug.c - OI_MODULE_APP, /**< 70 Application Memory allocation */ - - /* various pieces of code depend on these last 2 elements occuring in a specific order: - OI_MODULE_ALL must be the 2nd to last element - OI_MODULE_UNKNOWN must be the last element - */ - OI_MODULE_ALL, /**< 71 special value identifying all modules - used for control of debug print statements */ - OI_MODULE_UNKNOWN /**< 72 special value - used for debug print statements */ -} OI_MODULE; - -/** - * This constant is the number of actual modules in the list. ALL and UNKNOWN are - * special values that are not actually modules. - * Used for debug print and memmgr profiling - */ -#define OI_NUM_MODULES OI_MODULE_ALL - -/** - * This constant is the number of profile and core components. It is used to size - * the initialization and configuration tables. - */ -#define OI_NUM_STACK_MODULES OI_MODULE_BHAPI - -#ifdef __cplusplus -} -#endif - -/**@}*/ - -#endif /* _OI_MODULES_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_osinterface.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_osinterface.h deleted file mode 100644 index dfd425a9..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_osinterface.h +++ /dev/null @@ -1,196 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#ifndef _OI_OSINTERFACE_H -#define _OI_OSINTERFACE_H -/** - @file - * This file provides the platform-independent interface for functions for which - * implementation is platform-specific. - * - * The functions in this header file define the operating system or hardware - * services needed by the BLUEmagic 3.0 protocol stack. The - * actual implementation of these services is platform-dependent. - * - */ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -#include "oi_stddefs.h" -#include "oi_time.h" -#include "oi_status.h" -#include "oi_modules.h" - -/** \addtogroup Misc Miscellaneous APIs */ -/**@{*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Terminates execution. - * - * @param reason Reason for termination - */ -void OI_FatalError(OI_STATUS reason); - -/** - * This function logs an error. - * - * When built for release mode, BLUEmagic 3 errors are logged to - * this function. (in debug mode, errors are logged via - * OI_Print()). - * - * @param module Module in which the error was detected (see - * oi_modules.h) - * @param lineno Line number of the C file OI_SLOG_ERROR called - * @param status Status code associated with the error event - */ -void OI_LogError(OI_MODULE module, OI_INT lineno, OI_STATUS status); - -/** - * This function initializes the debug code handling. - * - * When built for debug mode, this function performs platform - * dependent initialization to handle message codes passed in - * via OI_SetMsgCode(). - */ -void OI_InitDebugCodeHandler(void); - -/** - * This function reads the time from the real time clock. - * - * All timing in BM3 is relative, typically a granularity - * of 5 or 10 msecs is adequate. - * - * @param[out] now Pointer to the buffer to which the current - * time will be returned - */ -void OI_Time_Now(OI_TIME *now); - -/** - * This function causes the current thread to sleep for the - * specified amount of time. This function must be called - * without the stack access token. - * - * @note BM3 corestack and profiles never suspend and never call - * OI_Sleep. The use of OI_Sleep is limited to applications and - * platform-specific code. - * - * If your port and applications never use OI_Sleep, this function can be left unimplemented. - * - * @param milliseconds Number of milliseconds to sleep - */ -void OI_Sleep(OI_UINT32 milliseconds); - -/** - * Defines for message type codes. - */ -#define OI_MSG_CODE_APPLICATION 0 /**< Application output */ -#define OI_MSG_CODE_ERROR 1 /**< Error message output */ -#define OI_MSG_CODE_WARNING 2 /**< Warning message output */ -#define OI_MSG_CODE_TRACE 3 /**< User API function trace output */ -#define OI_MSG_CODE_PRINT1 4 /**< Catagory 1 debug print output */ -#define OI_MSG_CODE_PRINT2 5 /**< Catagory 2 debug print output */ -#define OI_MSG_CODE_HEADER 6 /**< Error/Debug output header */ - -/** - * This function is used to indicate the type of text being output with - * OI_Print(). For the Linux and Win32 platforms, it will set - * the color of the text. Other possible uses could be to insert - * HTML style tags, add some other message type indication, or - * be completely ignored altogether. - * - * @param code OI_MSG_CODE_* indicating setting the message type. - */ -void OI_SetMsgCode(OI_UINT8 code); - -/** - * All output from OI_Printf() and all debug output is sent to OI_Print. - * Typically, if the platform has a console, OI_Print() is sent to stdout. - * Embedded platforms typically send OI_Print() output to a serial port. - * - * @param str String to print - */ -void OI_Print(OI_CHAR const *str); - -/** - * In cases where OI_Print() is sending output to a logfile in addition to console, - * it is desirable to also put console input into the logfile. - * This function can be called by the console input process. - * - * @note This is an optional API which is strictly - * between the platform-specific stack_console and osinterface - * modules. This API need only be implemented on those - * platforms where is serves a useful purpose, e.g., win32. - * - * @param str Console input string - */ - -void OI_Print_ConsoleInput(OI_CHAR const *str); - -/** - * This function computes the CRC16 of the program image. - */ -OI_UINT16 OI_ProgramImageCRC16(void); - -/** - * Writes an integer to stdout in hex. This macro is intended - * for selective use when debugging in small memory - * configurations or other times when it is not possible to use - * OI_DBGPRINT. - * - * @param n the integer to print - */ - -#define OI_Print_Int(n) \ - { \ - static const OI_CHAR _digits[] = "0123456789ABCDEF"; \ - OI_CHAR _buf[9]; \ - OI_CHAR *_str = &_buf[8]; \ - OI_UINT32 _i = n; \ - *_str = 0; \ - do { \ - *(--_str) = _digits[(_i & 0xF)]; \ - _i >>= 4; \ - } while (_i); \ - OI_Print(_str); \ - } - -/** - * Application Dynamic Memory allocation. - * - * These APIs are provided for application use on those - * platforms which have no dynamic memory support. Memory is - * allocated from the pool-based heap managed by the stack's - * internal memory manager. - */ -void *OI_APP_Malloc(OI_INT32 size); -void OI_APP_Free(void *ptr); - -/*****************************************************************************/ -#ifdef __cplusplus -} -#endif - -/**@}*/ - -#endif /* _OI_OSINTERFACE_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_status.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_status.h deleted file mode 100644 index b2a39795..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_status.h +++ /dev/null @@ -1,572 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#ifndef _OI_STATUS_H -#define _OI_STATUS_H -/** - * @file - * This file contains status codes for BLUEmagic 3.0 software. - */ - -#include "oi_stddefs.h" - -/** \addtogroup Misc Miscellaneous APIs */ -/**@{*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/** test it **/ - -/** - * OI_STATUS must fit in 16 bits, so status codes can range from 0 to 66535, inclusive. - */ - -typedef enum { - OI_STATUS_SUCCESS = 0, /**< function call succeeded alias for #OI_OK */ - OI_OK = 0, /**< function call succeeded alias for #OI_STATUS_SUCCESS */ - OI_STATUS_INVALID_PARAMETERS = 101, /**< invalid function input parameters */ - OI_STATUS_NOT_IMPLEMENTED = 102, /**< attempt to use an unimplemented function */ - OI_STATUS_NOT_INITIALIZED = 103, /**< data not initialized */ - OI_STATUS_NO_RESOURCES = 104, /**< generic resource allocation failure status */ - OI_STATUS_INTERNAL_ERROR = 105, /**< internal inconsistency */ - OI_STATUS_OUT_OF_MEMORY = 106, /**< generally, OI_Malloc failed */ - OI_ILLEGAL_REENTRANT_CALL = 107, /**< violation of non-reentrant module policy */ - OI_STATUS_INITIALIZATION_FAILED = 108, /**< module initialization failed */ - OI_STATUS_INITIALIZATION_PENDING = 109, /**< inititialization not yet complete */ - OI_STATUS_NO_SCO_SUPPORT = 110, /**< SCO operation rejected; system not configured for SCO */ - OI_STATUS_OUT_OF_STATIC_MEMORY = 111, /**< static malloc failed */ - OI_TIMEOUT = 112, /**< generic timeout */ - OI_OS_ERROR = 113, /**< some operating system error */ - OI_FAIL = 114, /**< generic failure */ - OI_STRING_FORMAT_ERROR = 115, /**< error in VarString formatting string */ - OI_STATUS_PENDING = 116, /**< The operation is pending. */ - OI_STATUS_INVALID_COMMAND = 117, /**< The command was invalid. */ - OI_BUSY_FAIL = 118, /**< command rejected due to busy */ - OI_STATUS_ALREADY_REGISTERED = 119, /**< The registration has already been performed. */ - OI_STATUS_NOT_FOUND = 120, /**< The referenced resource was not found. */ - OI_STATUS_NOT_REGISTERED = 121, /**< not registered */ - OI_STATUS_NOT_CONNECTED = 122, /**< not connected */ - OI_CALLBACK_FUNCTION_REQUIRED = 123, /**< A callback function parameter was required. */ - OI_STATUS_MBUF_OVERFLOW = 124, /**< There is no room to add another buffer to an mbuf. */ - OI_STATUS_MBUF_UNDERFLOW = 125, /**< There was an attempt to pull too many bytes from an mbuf. */ - OI_STATUS_CONNECTION_EXISTS = 126, /**< connection exists */ - OI_STATUS_NOT_CONFIGURED = 127, /**< module not configured */ - OI_LOWER_STACK_ERROR = 128, /**< An error was reported by lower stack API. This is used for embedded platforms. */ - OI_STATUS_RESET_IN_PROGRESS = 129, /**< Request failed/rejected because we're busy resetting. */ - OI_STATUS_ACCESS_DENIED = 130, /**< Generic access denied error. */ - OI_STATUS_DATA_ERROR = 131, /**< Generic data error. */ - OI_STATUS_INVALID_ROLE = 132, /**< The requested role was invalid. */ - OI_STATUS_ALREADY_CONNECTED = 133, /**< The requested connection is already established. */ - OI_STATUS_PARSE_ERROR = 134, /**< Parse error */ - OI_STATUS_END_OF_FILE = 135, /**< End of file */ - OI_STATUS_READ_ERROR = 136, /**< Generic read error */ - OI_STATUS_WRITE_ERROR = 137, /**< Generic write error */ - OI_STATUS_NEGOTIATION_FAILURE = 138, /**< Error in negotiation */ - OI_STATUS_READ_IN_PROGRESS = 139, /**< A read is already in progress */ - OI_STATUS_ALREADY_INITIALIZED = 140, /**< Initialization has already been done */ - OI_STATUS_STILL_CONNECTED = 141, /**< The service cannot be shutdown because there are still active connections. */ - OI_STATUS_MTU_EXCEEDED = 142, /**< The packet is too big */ - OI_STATUS_LINK_TERMINATED = 143, /**< The link was terminated */ - OI_STATUS_PIN_CODE_TOO_LONG = 144, /**< Application gave us a pin code that is too long */ - OI_STATUS_STILL_REGISTERED = 145, /**< The service cannot be shutdown because there are still active registrations. */ - OI_STATUS_SPEC_VIOLATION = 146, /**< Some application behavior contrary to BT specifications */ - - OI_STATUS_PSM_ALREADY_REGISTERED = 402, /**< L2CAP: The specified PSM has already been registered. */ - OI_STATUS_INVALID_CID = 403, /**< L2CAP: CID is invalid or no longer valid (connection terminated) */ - OI_STATUS_CID_NOT_FOUND = 404, /**< L2CAP: CID does not represent a current connection */ - OI_STATUS_CHANNEL_NOT_FOUND = 406, /**< L2CAP: CID does not represent a current connection */ - OI_STATUS_PSM_NOT_FOUND = 407, /**< L2CAP: PSM not found */ - OI_STATUS_INVALID_STATE = 408, /**< L2CAP: invalid state */ - OI_STATUS_WRITE_IN_PROGRESS = 410, /**< L2CAP: write in progress */ - OI_STATUS_INVALID_PACKET = 411, /**< L2CAP: invalid packet */ - OI_STATUS_SEND_COMPLETE = 412, /**< L2CAP: send is complete */ - OI_STATUS_INVALID_HANDLE = 414, /**< L2CAP: handle is invalid */ - OI_STATUS_GROUP_FULL = 418, /**< L2CAP: No more members can be added to the specified group. */ - OI_STATUS_DEVICE_ALREADY_IN_GROUP = 423, /**< L2CAP: The device already exists in the group. */ - OI_STATUS_DUPLICATE_GROUP = 425, /**< L2CAP: attempt to add more than one group */ - OI_STATUS_EMPTY_GROUP = 426, /**< L2CAP: group is empty */ - OI_STATUS_PACKET_NOT_FOUND = 427, /**< L2CAP: packet not found */ - OI_STATUS_BUFFER_TOO_SMALL = 428, /**< L2CAP: The buffer size is too small. */ - OI_STATUS_IDENTIFIER_NOT_FOUND = 429, /**< L2CAP: identifier not found */ - - OI_L2CAP_DISCONNECT_LOWER_LAYER = 430, /**< L2CAP: The lower level forced a disconnect. */ - OI_L2CAP_DISCONNECT_REMOTE_REQUEST = 431, /**< L2CAP: The remote device requested a disconnect. */ - OI_L2CAP_GROUP_ADD_CONNECT_FAIL = 433, /**< L2CAP: Group add connect faiL */ - OI_L2CAP_GROUP_REMOVE_FAILURE = 434, /**< L2CAP: Group remove failure */ - OI_L2CAP_DATA_WRITE_ERROR_LINK_TERM = 435, /**< L2CAP: Data write error LINK_TERM */ - OI_L2CAP_DISCONNECT_LOCAL_REQUEST = 436, /**< L2CAP: Disconnect local request */ - - OI_L2CAP_CONNECT_TIMEOUT = 437, /**< L2CAP: Connect timeout */ - OI_L2CAP_DISCONNECT_TIMEOUT = 439, /**< L2CAP: Disconnect timeout */ - OI_L2CAP_PING_TIMEOUT = 440, /**< L2CAP: Ping timeout */ - OI_L2CAP_GET_INFO_TIMEOUT = 441, /**< L2CAP: Get info timeout */ - OI_L2CAP_INVALID_ADDRESS = 444, /**< L2CAP: Invalid address */ - OI_L2CAP_CMD_REJECT_RCVD = 445, /**< L2CAP: remote sent us 'command reject' response */ - - OI_L2CAP_CONNECT_BASE = 450, /**< L2CAP: Connect base */ - OI_L2CAP_CONNECT_PENDING = 451, /**< L2CAP: Connect pending */ - OI_L2CAP_CONNECT_REFUSED_INVALID_PSM = 452, /**< L2CAP: Connect refused invalid PSM */ - OI_L2CAP_CONNECT_REFUSED_SECURITY = 453, /**< L2CAP: Connect refused security */ - OI_L2CAP_CONNECT_REFUSED_NO_RESOURCES = 454, /**< L2CAP: Connect refused no resources */ - - OI_L2CAP_CONFIG_BASE = 460, /**< L2CAP: Config base */ - OI_L2CAP_CONFIG_FAIL_INVALID_PARAMETERS = 461, /**< L2CAP: Config fail invalid parameters */ - OI_L2CAP_CONFIG_FAIL_NO_REASON = 462, /**< L2CAP: Config fail no reason */ - OI_L2CAP_CONFIG_FAIL_UNKNOWN_OPTIONS = 463, /**< L2CAP: Config fail unknown options */ - - OI_L2CAP_GET_INFO_BASE = 470, /**< L2CAP: Get info base */ - OI_L2CAP_GET_INFO_NOT_SUPPORTED = 471, /**< L2CAP: Get info not supported */ - OI_L2CAP_MTU_EXCEEDED = 472, /**< L2CAP: The MTU of the channel was exceeded */ - OI_L2CAP_INVALID_PSM = 482, /**< L2CAP: Invalid PSM */ - OI_L2CAP_INVALID_MTU = 483, /**< L2CAP: Invalid MTU */ - OI_L2CAP_INVALID_FLUSHTO = 484, /**< L2CAP: Invalid flush timeout */ - - OI_HCI_NO_SUCH_CONNECTION = 601, /**< HCI: caller specified a non-existent connection handle */ - OI_HCI_CB_LIST_FULL = 603, /**< HCI: callback list is full, cannot attempt to send command */ - OI_HCI_EVENT_UNDERRUN = 605, /**< HCI: parsing event packet, premature end-of-parameters */ - OI_HCI_UNKNOWN_EVENT_CODE = 607, /**< HCI: event received - event code is unknown */ - OI_HCI_BAD_EVENT_PARM_LEN = 608, /**< HCI: event - parameter length is incorrect */ - OI_HCI_CMD_QUEUE_FULL = 611, /**< HCI: command queue is full */ - OI_HCI_SHORT_EVENT = 612, /**< HCI: event received, missing event code and/or parm len */ - OI_HCI_TRANSMIT_NOT_READY = 613, /**< HCI: ACL/SCO transmit request failed - busy or no buffers available */ - OI_HCI_ORPHAN_SENT_EVENT = 614, /**< HCI: got spurious 'sent' event from transport layer */ - OI_HCI_CMD_TABLE_ERROR = 615, /**< HCI: inconsistency in the internal command table */ - OI_HCI_UNKNOWN_CMD_ID = 616, /**< HCI: HciApi Command - unknown command id */ - OI_HCI_UNEXPECTED_EVENT = 619, /**< HCI: event received which only occurs in response to our cmd */ - OI_HCI_EVENT_TABLE_ERROR = 620, /**< HCI: inconsistency in the internal event table */ - OI_HCI_EXPECTED_EVENT_TIMOUT = 621, /**< HCI: timed out waiting for an expected event */ - OI_HCI_NO_CMD_DESC_FOR_OPCODE = 622, /**< HCI: event opcode is not known */ - OI_HCI_INVALID_OPCODE_ERROR = 623, /**< HCI: command opcode is invalid */ - OI_HCI_FLOW_CONTROL_DISABLED = 624, /**< HCI: can not use host flow control APIs if disabled in configuration */ - OI_HCI_TX_COMPLETE = 625, /**< HCI: packet delivery to Host Controler complete */ - OI_HCI_TX_ERROR = 626, /**< HCI: failed to deliver packet to Host Controler */ - OI_HCI_DEVICE_NOT_INITIALIZED = 627, /**< HCI: commands from upper layers disallowed until device is up and running */ - OI_HCI_UNSUPPORTED_COMMAND = 628, /**< HCI: command requested is not supported by local device */ - OI_HCI_PASSTHROUGH_ERROR = 629, /**< HCI: Error processing passthrough command */ - OI_HCI_PASSTHROUGH_ALREADY_SET = 630, /**< HCI: Passthrough mode already enabled */ - OI_HCI_RESET_FAILURE = 631, /**< HCI: failed to reset the device/baseband */ - OI_HCI_TRANSPORT_RESET = 632, /**< HCI: some operation failed because of a reset in the transport */ - OI_HCIERR_HCIIFC_INIT_FAILURE = 633, /**< HCI: failed to initialize transport layer interface */ - - OI_HCIERR_FIRST_ERROR_VALUE = 701, /**< marker for first HCI protocol error */ - OI_HCIERR_UNKNOWN_HCI_COMMAND = 701, /**< HCI: protocol error 0x01 */ - OI_HCIERR_NO_CONNECTION = 702, /**< HCI: protocol error 0x02 */ - OI_HCIERR_HARDWARE_FAILURE = 703, /**< HCI: protocol error 0x03 */ - OI_HCIERR_PAGE_TIMEOUT = 704, /**< HCI: protocol error 0x04 */ - OI_HCIERR_AUTHENTICATION_FAILURE = 705, /**< HCI: protocol error 0x05 */ - OI_HCIERR_KEY_MISSING = 706, /**< HCI: protocol error 0x06 */ - OI_HCIERR_MEMORY_FULL = 707, /**< HCI: protocol error 0x07 */ - OI_HCIERR_CONNECTION_TIMEOUT = 708, /**< HCI: protocol error 0x08 */ - OI_HCIERR_MAX_NUM_OF_CONNECTIONS = 709, /**< HCI: protocol error 0x09 */ - OI_HCIERR_MAX_NUM_OF_SCO_CONNECTIONS = 710, /**< HCI: protocol error 0x0A */ - OI_HCIERR_ACL_CONNECTION_ALREADY_EXISTS = 711, /**< HCI: protocol error 0x0B */ - OI_HCIERR_COMMAND_DISALLOWED = 712, /**< HCI: protocol error 0x0C */ - OI_HCIERR_HOST_REJECTED_RESOURCES = 713, /**< HCI: protocol error 0x0D */ - OI_HCIERR_HOST_REJECTED_SECURITY = 714, /**< HCI: protocol error 0x0E */ - OI_HCIERR_HOST_REJECTED_PERSONAL_DEVICE = 715, /**< HCI: protocol error 0x0F */ - OI_HCIERR_HOST_TIMEOUT = 716, /**< HCI: protocol error 0x10 */ - OI_HCIERR_UNSUPPORTED = 717, /**< HCI: protocol error 0x11 */ - OI_HCIERR_INVALID_PARAMETERS = 718, /**< HCI: protocol error 0x12 */ - OI_HCIERR_OTHER_END_USER_DISCONNECT = 719, /**< HCI: protocol error 0x13 */ - OI_HCIERR_OTHER_END_LOW_RESOURCES = 720, /**< HCI: protocol error 0x14 */ - OI_HCIERR_OTHER_END_POWERING_OFF = 721, /**< HCI: protocol error 0x15 */ - OI_HCIERR_CONNECTION_TERMINATED_LOCALLY = 722, /**< HCI: protocol error 0x16 */ - OI_HCIERR_REPEATED_ATTEMPTS = 723, /**< HCI: protocol error 0x17 */ - OI_HCIERR_PAIRING_NOT_ALLOWED = 724, /**< HCI: protocol error 0x18 */ - OI_HCIERR_UNKNOWN_LMP_PDU = 725, /**< HCI: protocol error 0x19 */ - OI_HCIERR_UNSUPPORTED_REMOTE_FEATURE = 726, /**< HCI: protocol error 0x1A */ - OI_HCIERR_SCO_OFFSET_REJECTED = 727, /**< HCI: protocol error 0x1B */ - OI_HCIERR_SCO_INTERVAL_REJECTED = 728, /**< HCI: protocol error 0x1C */ - OI_HCIERR_SCO_AIR_MODE_REJECTED = 729, /**< HCI: protocol error 0x1D */ - OI_HCIERR_INVALID_LMP_PARMS = 730, /**< HCI: protocol error 0x1E */ - OI_HCIERR_UNSPECIFIED_ERROR = 731, /**< HCI: protocol error 0x1F */ - OI_HCIERR_UNSUPPORTED_LMP_PARAMETERS = 732, /**< HCI: protocol error 0x20 */ - OI_HCIERR_ROLE_CHANGE_NOT_ALLOWED = 733, /**< HCI: protocol error 0x21 */ - OI_HCIERR_LMP_RESPONSE_TIMEOUT = 734, /**< HCI: protocol error 0x22 */ - OI_HCIERR_LMP_ERROR_TRANS_COLLISION = 735, /**< HCI: protocol error 0x23 */ - OI_HCIERR_LMP_PDU_NOT_ALLOWED = 736, /**< HCI: protocol error 0x24 */ - OI_HCIERR_ENCRYPTION_MODE_NOT_ACCEPTABLE = 737, /**< HCI: protocol error 0x25 */ - OI_HCIERR_UNIT_KEY_USED = 738, /**< HCI: protocol error 0x26 */ - OI_HCIERR_QOS_NOT_SUPPORTED = 739, /**< HCI: protocol error 0x27 */ - OI_HCIERR_INSTANT_PASSED = 740, /**< HCI: protocol error 0x28 */ - OI_HCIERR_UNIT_KEY_PAIRING_UNSUPPORTED = 741, /**< HCI: protocol error 0x29 */ - OI_HCIERR_DIFFERENT_TRANS_COLLISION = 742, /**< HCI: protocol error 0x2A */ - OI_HCIERR_RESERVED_2B = 743, /**< HCI: protocol error 0x2B */ - OI_HCIERR_QOS_UNACCEPTABLE_PARAMETER = 744, /**< HCI: protocol error 0x2C */ - OI_HCIERR_QOS_REJECTED = 745, /**< HCI: protocol error 0x2D */ - OI_HCIERR_CHANNEL_CLASSIFICATION_NS = 746, /**< HCI: protocol error 0x2E */ - OI_HCIERR_INSUFFICIENT_SECURITY = 747, /**< HCI: protocol error 0x2F */ - OI_HCIERR_PARM_OUT_OF_MANDATORY_RANGE = 748, /**< HCI: protocol error 0x30 */ - OI_HCIERR_RESERVED_31 = 749, /**< HCI: protocol error 0x31 */ - OI_HCIERR_ROLE_SWITCH_PENDING = 750, /**< HCI: protocol error 0x32 */ - OI_HCIERR_RESERVED_33 = 751, /**< HCI: protocol error 0x33 */ - OI_HCIERR_RESERVED_SLOT_VIOLATION = 752, /**< HCI: protocol error 0x34 */ - OI_HCIERR_ROLE_SWITCH_FAILED = 753, /**< HCI: protocol error 0x35 */ - OI_HCIERR_EIR_TOO_LARGE = 754, /**< HCI: protocol error 0x36 */ - OI_HCIERR_SSP_NOT_SUPPORTED_BY_HOST = 755, /**< HCI: protocol error 0x37 */ - OI_HCIERR_HOST_BUSY_PAIRING = 756, /**< HCI: protocol error 0x38 */ - - OI_HCIERR_UNKNOWN_ERROR = 757, /**< HCI: unknown error code */ - OI_HCIERR_LAST_ERROR_VALUE = 757, /**< marker for last HCI protocol error */ - - OI_SDP_SPEC_ERROR = 800, /**< SDP: Base error status for mapping OI_STATUS codes to SDP errors */ - OI_SDP_INVALID_SERVICE_RECORD_HANDLE = (OI_SDP_SPEC_ERROR + 2), /**< SDP: protocol error Invalid Service Record Handle */ - OI_SDP_INVALID_REQUEST_SYNTAX = (OI_SDP_SPEC_ERROR + 3), /**< SDP: protocol error Invalid Request Syntax */ - OI_SDP_INVALID_PDU_SIZE = (OI_SDP_SPEC_ERROR + 4), /**< SDP: protocol error Invalid PDU Size */ - OI_SDP_INVALID_CONTINUATION_STATE = (OI_SDP_SPEC_ERROR + 5), /**< SDP: protocol error Invalid Continuation State */ - OI_SDP_INSUFFICIENT_RESOURCES = (OI_SDP_SPEC_ERROR + 6), /**< SDP: protocol error Insufficient Resources */ - OI_SDP_ERROR = 807, /**< SDP: server returned an error code */ - OI_SDP_CORRUPT_DATA_ELEMENT = 808, /**< SDP: Invalid or corrupt data element representation */ - OI_SDP_SERVER_NOT_CONNECTED = 810, /**< SDP: Attempt to disconnect from an unconnected server */ - OI_SDP_ACCESS_DENIED = 811, /**< SDP: Server denied access to server */ - OI_SDP_ATTRIBUTES_OUT_OF_ORDER = 812, /**< SDP: Attributes in attribute list not in ascending order */ - OI_SDP_DEVICE_DOES_NOT_SUPPORT_SDP = 813, /**< SDP: Tried to connect to a device that does not support SDP */ - OI_SDP_NO_MORE_DATA = 815, /**< SDP: Server does not have more continuation data */ - OI_SDP_REQUEST_PARAMS_TOO_LONG = 816, /**< SDP: Parameters for a request exceed the L2CAP buffer size */ - OI_SDP_REQUEST_PENDING = 817, /**< SDP: Cannot make a request when another request is being processed */ - OI_SDP_SERVER_CONNECT_FAILED = 819, /**< SDP: Failed attempt to connect to an SDP server */ - OI_SDP_SERVER_TOO_MANY_CONNECTIONS = 821, /**< SDP: Exceeded maximum number of simultaneous server connections */ - OI_SDP_NO_MATCHING_SERVICE_RECORD = 823, /**< SDP: No service record matched the UUID list */ - OI_SDP_PARTIAL_RESPONSE = 824, /**< SDP: Internal use only */ - OI_SDP_ILLEGAL_ARGUMENT = 825, /**< SDP: Illegal argument passed to an SDP function */ - OI_SDP_ATTRIBUTE_NOT_FOUND = 826, /**< SDP: A requested attribute was not found in a service record */ - OI_SDP_DATABASE_OUT_OF_RESOURCES = 827, /**< SDP: server database is out of memory */ - OI_SDP_SHORT_PDU = 829, /**< SDP: Not enough bytes in the packet */ - OI_SDP_TRANSACTION_ID_MISMATCH = 830, /**< SDP: Transaction Id was not as expected */ - OI_SDP_UNEXPECTED_RESPONSE_PDU_ID = 831, /**< SDP: Did not expect this response PDU */ - OI_SDP_REQUEST_TIMEOUT = 832, /**< SDP: Did not get a response within the timeout period */ - OI_SDP_INVALID_RESPONSE_SYNTAX = 833, /**< SDP: Response is not correctly formatted */ - OI_SDP_CONNECTION_TIMEOUT = 834, /**< SDP: Connection attempt timed out at a lower layer */ - OI_SDP_RESPONSE_DATA_ERROR = 835, /**< SDP: Response to a service request appears to be corrupt */ - OI_SDP_TOO_MANY_ATTRIBUTE_BYTES = 836, /**< SDP: Response contained more bytes than requested. */ - OI_SDP_TOO_MANY_SERVICE_RECORDS = 837, /**< SDP: Response contained more service records than requested. */ - OI_SDP_INVALID_CONNECTION_ID = 838, /**< SDP: Invalid connection ID in an SDP request */ - OI_SDP_CANNOT_SET_ATTRIBUTE = 839, /**< SDP: Attempt to set a dynamic attribute value failed */ - OI_SDP_BADLY_FORMED_ATTRIBUTE_VALUE = 840, /**< SDP: An attribute value has the wrong type or structure */ - OI_SDP_NO_ATTRIBUTE_LIST_TO_REMOVE = 841, /**< SDP: Attempt to remove a non-existent attribute list from a service record */ - OI_SDP_ATTRIBUTE_LIST_ALREADY_ADDED = 842, /**< SDP: An attribute list has already been added to the service record */ - OI_SDP_DATA_ELEMENT_TRUNCATED = 843, /**< SDP: Data element truncated (too few bytes) */ - - OI_RFCOMM_WRITE_IN_PROGRESS = 901, /**< RFCOMM: Write in progress */ - OI_RFCOMM_INVALID_BAUDRATE = 903, /**< RFCOMM: Invalid baudrate */ - OI_RFCOMM_INVALID_DATABIT = 904, /**< RFCOMM: Invalid databit */ - OI_RFCOMM_INVALID_STOPBIT = 905, /**< RFCOMM: Invalid stopbit */ - OI_RFCOMM_INVALID_PARITY = 906, /**< RFCOMM: Invalid parity */ - OI_RFCOMM_INVALID_PARITYTYPE = 907, /**< RFCOMM: Invalid paritytype */ - OI_RFCOMM_INVALID_FLOWCONTROL = 908, /**< RFCOMM: Invalid flowcontrol */ - OI_RFCOMM_SESSION_EXISTS = 909, /**< RFCOMM: Session exists */ - OI_RFCOMM_INVALID_CHANNEL = 910, /**< RFCOMM: Invalid channel */ - OI_RFCOMM_DLCI_EXISTS = 911, /**< RFCOMM: DLCI exists */ - OI_RFCOMM_LINK_NOT_FOUND = 912, /**< RFCOMM: Link not found */ - OI_RFCOMM_REMOTE_REJECT = 913, /**< RFCOMM: Remote reject */ - OI_RFCOMM_TEST_IN_PROGRESS = 915, /**< RFCOMM: Test in progress */ - OI_RFCOMM_SESSION_NOT_FOUND = 916, /**< RFCOMM: Session not found */ - OI_RFCOMM_INVALID_PACKET = 917, /**< RFCOMM: Invalid packet */ - OI_RFCOMM_FRAMESIZE_EXCEEDED = 918, /**< RFCOMM: Framesize exceeded */ - OI_RFCOMM_INVALID_DLCI = 920, /**< RFCOMM: Invalid dlci */ - OI_RFCOMM_SERVER_NOT_REGISTERED = 921, /**< RFCOMM: Server not registered */ - OI_RFCOMM_CREDIT_ERROR = 922, /**< RFCOMM: Credit error */ - OI_RFCOMM_NO_CHANNEL_NUMBER = 923, /**< RFCOMM: No channel number */ - OI_RFCOMM_QUERY_IN_PROGRESS = 924, /**< RFCOMM: Query in progress */ - OI_RFCOMM_SESSION_SHUTDOWN = 925, /**< RFCOMM: Session shutdown */ - OI_RFCOMM_LOCAL_DEVICE_DISCONNECTED = 926, /**< RFCOMM: Local device disconnected */ - OI_RFCOMM_REMOTE_DEVICE_DISCONNECTED = 927, /**< RFCOMM: Remote device disconnected */ - OI_RFCOMM_OUT_OF_SERVER_CHANNELS = 928, /**< RFCOMM: Out of server channels */ - - OI_DISPATCH_INVALID_CB_HANDLE = 1001, /**< Dispatcher was handed an invalid callback handle */ - OI_DISPATCH_TABLE_OVERFLOW = 1002, /**< Dispatcher table is full */ - - OI_TEST_UNKNOWN_TEST = 1101, /**< TEST: Unknown test */ - OI_TEST_FAIL = 1102, /**< TEST: Fail */ - - OI_HCITRANS_CANNOT_CONNECT_TO_DEVICE = 1201, /**< TRANSPORT: Cannot connect to device */ - OI_HCITRANS_BUFFER_TOO_SMALL = 1203, /**< TRANSPORT: Buffer too small */ - OI_HCITRANS_NULL_DEVICE_HANDLE = 1204, /**< TRANSPORT: Null device handle */ - OI_HCITRANS_IO_ERROR = 1205, /**< TRANSPORT: IO error */ - OI_HCITRANS_DEVICE_NOT_READY = 1206, /**< TRANSPORT: Device not ready */ - OI_HCITRANS_FUNCTION_NOT_SUPPORTED = 1207, /**< TRANSPORT: Function not supporteD */ - OI_HCITRANS_ACCESS_DENIED = 1209, /**< TRANSPORT: win32 */ - OI_HCITRANS_ACL_DATA_ERROR = 1210, /**< TRANSPORT: ACL data error */ - OI_HCITRANS_SCO_DATA_ERROR = 1211, /**< TRANSPORT: SCO data error */ - OI_HCITRANS_EVENT_DATA_ERROR = 1212, /**< TRANSPORT: HCI event data error */ - OI_HCITRANS_INTERNAL_ERROR = 1214, /**< TRANSPORT: Internal error in the transport */ - OI_HCITRANS_LINK_NOT_ACTIVE = 1215, /**< TRANSPORT: Link to the device is not currently active */ - OI_HCITRANS_INITIALIZING = 1216, /**< TRANSPORT: Transport is initializing */ - - OI_DEVMGR_NO_CONNECTION = 1301, /**< DEVMGR: No connection */ - OI_DEVMGR_HARDWARE_ERROR = 1305, /**< DEVMGR: error reported by HCI */ - OI_DEVMGR_PENDING_CONNECT_LIST_FULL = 1307, /**< DEVMGR: Pending connect list full */ - OI_DEVMGR_CONNECTION_LIST_FULL = 1309, /**< DEVMGR: Connection list full */ - OI_DEVMGR_NO_SUCH_CONNECTION = 1310, /**< DEVMGR: No such connection */ - OI_DEVMGR_INQUIRY_IN_PROGRESS = 1311, /**< DEVMGR: Inquiry in progress */ - OI_DEVMGR_PERIODIC_INQUIRY_ACTIVE = 1312, /**< DEVMGR: Periodic inquiry active */ - OI_DEVMGR_NO_INQUIRIES_ACTIVE = 1313, /**< DEVMGR: can not cancel/exit if not active */ - OI_DEVMGR_DUPLICATE_CONNECTION = 1314, /**< DEVMGR: internal error */ - OI_DEVMGR_DUPLICATE_EVENT_CALLBACK = 1316, /**< DEVMGR: attempt to register same callback twice */ - OI_DEVMGR_EVENT_CALLBACK_LIST_FULL = 1317, /**< DEVMGR: can not register event callback, list is full */ - OI_DEVMGR_EVENT_CALLBACK_NOT_FOUND = 1318, /**< DEVMGR: attempt to unregister callback failed */ - OI_DEVMGR_BUSY = 1319, /**< DEVMGR: some operations can only execute one at a time */ - OI_DEVMGR_ENUM_UNEXPECTED_INQ_COMPLETE = 1320, /**< DEVMGR: inquiry complete event in inappropriate enumeration state */ - OI_DEVMGR_ENUM_UNEXPECTED_INQ_RESULT = 1321, /**< DEVMGR: inquiry result event in inappropriate enumeration state */ - OI_DEVMGR_ENUM_DATABASE_FULL = 1322, /**< DEVMGR: device enumeration, database is full, couldn't add a new device */ - OI_DEVMGR_ENUM_INQUIRIES_OVERLAP = 1323, /**< DEVMGR: device enumeration, periodic inquiries occurring too close together */ - OI_DEVMGR_UNKNOWN_LINK_TYPE = 1324, /**< DEVMGR: HCI connect request with unkown link type */ - OI_DEVMGR_PARAM_IO_ACTIVE = 1325, /**< DEVMGR: request for parameter read/write while param read/write active */ - OI_DEVMGR_UNKNOWN_IAC_LAP = 1326, /**< DEVMGR: unrecognized IAC LAP */ - OI_DEVMGR_SCO_ALREADY_REGISTERED = 1327, /**< DEVMGR: only one application can use SCO */ - OI_DEVMGR_SCO_NOT_REGISTERED = 1328, /**< DEVMGR: SCO applications must register before using the API */ - OI_DEVMGR_SCO_WITHOUT_ACL = 1329, /**< DEVMGR: Got SCO connection but there is no underlying ACL connection */ - OI_DEVMGR_NO_SUPPORT = 1330, /**< DEVMGR: Request is not supported by the device */ - OI_DEVMGR_WRITE_POLICY_FAILED = 1331, /**< DEVMGR: connection attempt failed - unable to write link policy */ - OI_DEVMGR_NOT_IN_MASTER_MODE = 1332, /**< DEVMGR: OI_DEVMGR EndMasterMode without prior OI_DEVMGR_BeginMasterMode */ - OI_DEVMGR_POLICY_VIOLATION = 1333, /**< DEVMGR: low-power request is rejected - link policy does not allow it */ - OI_DEVMGR_BUSY_TIMEOUT = 1334, /**< DEVMGR: queued operation timed out while in the queue; \n - timeout configurable via @ref OI_CONFIG_DEVMGR::connectQueueTimeoutSecs "connectQueueTimeoutSecs" */ - OI_DEVMGR_REENCRYPT_FAILED = 1335, /**< DEVMGR: failed to re-encrypt link after role switch */ - OI_DEVMGR_ROLE_POLICY_CONFLICT = 1336, /**< DEVMGR: requested role conflicts with current policy */ - OI_DEVMGR_BAD_INTERVAL = 1337, /**< DEVMGR: current linkTO outside range of requested min/max interval */ - OI_DEVMGR_INVALID_SCO_HANDLE = 1338, /**< DEVMGR: HCI SCO event, invalid handle */ - OI_DEVMGR_CONNECTION_OVERLAP = 1339, /**< DEVMGR: Connection failed due to race condition with remote side */ - OI_DEVMGR_ORPHAN_SUBRATE_COMPLETE = 1340, /**< DEVMGR: sniff subrate complete, but no callback */ - OI_DEVMGR_EIR_RESPONSE_2_LARGE = 1341, /**< DEVMGR: eir builder, response length would exceed spec max */ - - OI_SECMGR_NO_POLICY = 1401, /**< SECMGR: no security policy has been established */ - OI_SECMGR_INTERNAL_ERROR = 1402, /**< SECMGR: internal inconsistency */ - OI_SECMGR_ORPHANED_CALLBACK = 1403, /**< SECMGR: we've been called back, but CB context is gone */ - OI_SECMGR_BUSY = 1404, /**< SECMGR: configure and access request cannot be concurrent */ - OI_SECMGR_DEVICE_NOT_TRUSTED = 1405, /**< SECMGR: l2cap access denied - device is not trusted */ - OI_SECMGR_DEVICE_ENCRYPT_FAIL = 1407, /**< SECMGR: l2cap access denied - failed to start encryption */ - OI_SECMGR_DISCONNECTED_FAIL = 1408, /**< SECMGR: l2cap access denied - disconnected */ - OI_SECMGR_ACCESS_PENDING = 1409, /**< SECMGR: l2cap access request is still pending */ - OI_SECMGR_PIN_CODE_TOO_SHORT = 1410, /**< SECMGR: Higher-layer process gave us a pin code that is too short */ - OI_SECMGR_UNKNOWN_ENCRYPT_VALUE = 1411, /**< SECMGR: got EncryptionChange event, unknown encryption enable value */ - OI_SECMGR_INVALID_POLICY = 1412, /**< SECMGR: the specified security policy is not valid for security mode */ - OI_SECMGR_AUTHORIZATION_FAILED = 1413, /**< SECMGR: device authorization failed */ - OI_SECMGR_ENCRYPTION_FAILED = 1414, /**< SECMGR: device encryption failed */ - OI_SECMGR_UNIT_KEY_UNSUPPORTED = 1415, /**< SECMGR: authentication failed due to non-support of unit keys */ - OI_SECMGR_NOT_REGISTERED = 1416, /**< SECMGR: required registrations have not yet occurred */ - OI_SECMGR_ILLEGAL_WRITE_SSP_MODE = 1417, /**< SECMGR: 2.1 HCI spec does not allow SSP mode to be disabled */ - OI_SECMGR_INVALID_SEC_LEVEL = 1418, /**< SECMGR: security level for a service is not a valid value */ - OI_SECMGR_INSUFFICIENT_LINK_KEY = 1419, /**< SECMGR: link key type is not sufficient to meet service requirements */ - OI_SECMGR_INVALID_KEY_TYPE = 1420, /**< SECMGR: link key type is not a valid value */ - OI_SECMGR_SSP_NOT_ENCRYPTED = 1421, /**< SECMGR: ssp required encryption on incoming link */ - OI_SECMGR_ORPHAN_EVENT = 1422, /**< SECMGR: some HCI security event unrelated to current processes */ - OI_SECMGR_NOT_BONDABLE = 1423, /**< SECMGR: not in bondable mode */ - - OI_TCS_INVALID_ELEMENT_TYPE = 1602, /**< TCS: element type is invalid */ - OI_TCS_INVALID_PACKET = 1603, /**< TCS: packet is invalide */ - OI_TCS_CALL_IN_PROGRESS = 1604, /**< TCS: call is in progress */ - OI_TCS_NO_CALL_IN_PROGRESS = 1605, /**< TCS: no call in progress */ - - OI_OBEX_CONTINUE = 1701, /**< OBEX: Continue processing OBEX request */ - OI_OBEX_COMMAND_ERROR = 1702, /**< OBEX: An unrecognized OBEX command opcode */ - OI_OBEX_CONNECTION_TIMEOUT = 1703, /**< OBEX: Timeout waiting for a response to a request */ - OI_OBEX_CONNECT_FAILED = 1704, /**< OBEX: An OBEX connection request did not succeed */ - OI_OBEX_DISCONNECT_FAILED = 1705, /**< OBEX: A disconnect failed probably because the connection did not exist */ - OI_OBEX_ERROR = 1706, /**< OBEX: Unspecified OBEX error */ - OI_OBEX_INCOMPLETE_PACKET = 1707, /**< OBEX: Packet too short or corrupt */ - OI_OBEX_LENGTH_REQUIRED = 1708, /**< OBEX: Length header required in OBEX command */ - OI_OBEX_NOT_CONNECTED = 1709, /**< OBEX: No connection to OBEX server */ - OI_OBEX_NO_MORE_CONNECTIONS = 1710, /**< OBEX: Reached max connections limit */ - OI_OBEX_OPERATION_IN_PROGRESS = 1711, /**< OBEX: Another operation is still in progress on a connection */ - OI_OBEX_PUT_RESPONSE_ERROR = 1712, /**< OBEX: An error in the response to a PUT command */ - OI_OBEX_GET_RESPONSE_ERROR = 1713, /**< OBEX: An error in the response to a GET command */ - OI_OBEX_REQUIRED_HEADER_NOT_FOUND = 1714, /**< OBEX: packet was missing a required header */ - OI_OBEX_SERVICE_UNAVAILABLE = 1715, /**< OBEX: Unown OBEX target or required service */ - OI_OBEX_TOO_MANY_HEADER_BYTES = 1716, /**< OBEX: Headers will not fit in single OBEX packet */ - OI_OBEX_UNKNOWN_COMMAND = 1717, /**< OBEX: Unrecognized OBEX command */ - OI_OBEX_UNSUPPORTED_VERSION = 1718, /**< OBEX: Version mismatch */ - OI_OBEX_CLIENT_ABORTED_COMMAND = 1719, /**< OBEX: server received abort command */ - OI_OBEX_BAD_PACKET = 1720, /**< OBEX: Any malformed OBEX packet */ - OI_OBEX_BAD_REQUEST = 1721, /**< OBEX: Maps to OBEX response of the same name */ - OI_OBEX_OBJECT_OVERFLOW = 1723, /**< OBEX: Too many bytes received. */ - OI_OBEX_NOT_FOUND = 1724, /**< OBEX: Maps to obex response of same name */ - OI_OBEX_ACCESS_DENIED = 1735, /**< OBEX: Object could not be read or written. */ - OI_OBEX_VALUE_NOT_ACCEPTABLE = 1736, /**< OBEX: Value in a command was not in the acceptable range. */ - OI_OBEX_PACKET_OVERFLOW = 1737, /**< OBEX: Buffer will not fit in a single OBEX packet. */ - OI_OBEX_NO_SUCH_FOLDER = 1738, /**< OBEX: Error returned by a setpath operation. */ - OI_OBEX_NAME_REQUIRED = 1739, /**< OBEX: Name must be non-null and non-empty. */ - OI_OBEX_PASSWORD_TOO_LONG = 1740, /**< OBEX: Password exceeds implementation imposed length limit. */ - OI_OBEX_PRECONDITION_FAILED = 1741, /**< OBEX: response Precondition Failed */ - OI_OBEX_UNAUTHORIZED = 1742, /**< OBEX: authentication was not successful. */ - OI_OBEX_NOT_IMPLEMENTED = 1743, /**< OBEX: Unimplemented feature. */ - OI_OBEX_INVALID_AUTH_DIGEST = 1744, /**< OBEX: An authentication digest was bad. */ - OI_OBEX_INVALID_OPERATION = 1745, /**< OBEX: Operation not allowed at this time. */ - OI_OBEX_DATABASE_FULL = 1746, /**< OBEX: Sync database full. */ - OI_OBEX_DATABASE_LOCKED = 1747, /**< OBEX: Sync database locked. */ - OI_OBEX_INTERNAL_SERVER_ERROR = 1748, /**< OBEX: response Internal Server Error */ - OI_OBEX_UNSUPPORTED_MEDIA_TYPE = 1749, /**< OBEX: response Unsupported Media Type */ - OI_OBEX_PARTIAL_CONTENT = 1750, /**< OBEX: response Partial Content */ - OI_OBEX_METHOD_NOT_ALLOWED = 1751, /**< OBEX: response Method Not Allowed */ - OI_OBEXSRV_INCOMPLETE_GET = 1752, /**< OBEX: Indicates to a GET handler that the request phase is still in progress */ - OI_OBEX_FOLDER_BROWSING_NOT_ALLOWED = 1753, /**< OBEX: Indicates that an FTP server does not allow folder browsing */ - OI_OBEX_SERVER_FORCED_DISCONNECT = 1754, /**< OBEX: connection was forcibly terminated by the server */ - OI_OBEX_OFS_ERROR = 1755, /**< OBEX: OPP object file system error occurred */ - OI_OBEX_FILEOP_ERROR = 1756, /**< OBEX: FTP/PBAP file operation system error occurred */ - OI_OBEX_USERID_TOO_LONG = 1757, /**< OBEX: User Id exceeds spec limited length limit. */ - - OI_HANDSFREE_EVENT_REPORTING_DISABLED = 1801, /**< HANDSFREE: Event reporting disabled */ - OI_HANDSFREE_NOT_CONNECTED = 1802, /**< HANDSFREE: Not connected */ - OI_HANDSFREE_SERVICE_NOT_STARTED = 1803, /**< HANDSFREE: Cannot connect to handsfree AG if handsfree service not started */ - OI_HANDSFREE_AG_SERVICE_NOT_STARTED = 1804, /**< HANDSFREE: Cannot connect to handsfree device if handsfree AG service not started */ - OI_HANDSFREE_COMMAND_IN_PROGRESS = 1805, /**< HANDSFREE: Cannot accept a command at this time */ - OI_HANDSFREE_AUDIO_ALREADY_CONNECTED = 1806, /**< HANDSFREE: Audio is already connected */ - OI_HANDSFREE_AUDIO_NOT_CONNECTED = 1807, /**< HANDSFREE: Audio is not connected */ - OI_HANDSFREE_FEATURE_NOT_SUPPORTED = 1808, /**< HANDSFREE: Local or remote feature not supported for requested command */ - - OI_HEADSET_SERVICE_NOT_STARTED = 1901, /**< HEADSET: Cannot connect to headset AG if headset service not started */ - OI_HEADSET_AG_SERVICE_NOT_STARTED = 1902, /**< HEADSET: Cannot connect to headset device if headset AG service not started */ - OI_HEADSET_COMMAND_IN_PROGRESS = 1903, /**< HEADSET: Cannot accept a command at this time */ - - OI_BNEP_INVALID_MTU = 2001, /**< BNEP: The remote device cannot support the minimum BNEP MTU */ - OI_BNEP_SETUP_TIMEOUT = 2002, /**< BNEP: The setup request timed out. */ - OI_BNEP_SERVICE_NOT_REGISTERED = 2003, /**< BNEP: The requested service was not found. */ - OI_BNEP_INVALID_HANDLE = 2004, /**< BNEP: The specified connection handle is not valid. */ - OI_BNEP_RESPONSE_TIMEOUT = 2005, /**< BNEP: The timer for receiving a response has expired. */ - OI_BNEP_INVALID_CONNECTION = 2006, /**< BNEP: Invalid connection */ - OI_BNEP_INVALID_FILTER = 2007, /**< BNEP: The supplied filter was invalid. */ - OI_BNEP_CONNECTION_EXISTS = 2008, /**< BNEP: An attempt was made to create a duplicate connection. */ - OI_BNEP_NOT_INITIALIZED = 2009, /**< BNEP: Init has not been called */ - OI_BNEP_CONNECT_BASE = 2010, /**< BNEP: connection response codes */ - OI_BNEP_CONNECT_FAILED_INVALID_DEST_UUID = 2011, /**< BNEP: connect response code Invalid Dest UUID */ - OI_BNEP_CONNECT_FAILED_INVALID_SOURCE_UUID = 2012, /**< BNEP: connect response code Invalid Source UUID */ - OI_BNEP_CONNECT_FAILED_INVALID_UUID_SIZE = 2013, /**< BNEP: connect response code Invalid UUID Size */ - OI_BNEP_CONNECT_FAILED_NOT_ALLOWED = 2014, /**< BNEP: connect response code Not Allowed */ - OI_BNEP_FILTER_NET_BASE = 2020, /**< BNEP: filter response codes */ - OI_BNEP_FILTER_NET_UNSUPPORTED_REQUEST = 2021, /**< BNEP: filter response code Unsupported Request */ - OI_BNEP_FILTER_NET_FAILED_INVALID_PROTOCOL_TYPE = 2022, /**< BNEP: filter response code Invalid Protocol Type */ - OI_BNEP_FILTER_NET_FAILED_MAX_LIMIT_REACHED = 2023, /**< BNEP: filter response code Max Limit Reached */ - OI_BNEP_FILTER_NET_FAILED_SECURITY = 2024, /**< BNEP: filter response code Security */ - OI_BNEP_FILTER_MULTI_BASE = 2030, /**< BNEP: multicast response codes */ - OI_BNEP_FILTER_MULTI_UNSUPPORTED_REQUEST = 2031, /**< BNEP: multicast response code Unsupported Request */ - OI_BNEP_FILTER_MULTI_FAILED_INVALID_ADDRESS = 2032, /**< BNEP: multicast response code Invalid Address */ - OI_BNEP_FILTER_MULTI_FAILED_MAX_LIMIT_REACHED = 2033, /**< BNEP: multicast response code Max Limit Reached */ - OI_BNEP_FILTER_MULTI_FAILED_SECURITY = 2034, /**< BNEP: multicast response code Security */ - OI_BNEP_LOCAL_DEVICE_MUST_BE_MASTER = 2040, /**< BNEP: Device must be master of the piconet for this function */ - OI_BNEP_PACKET_FILTERED_OUT = 2041, /**< BNEP: Packet did not pass current filters */ - - OI_NETIFC_UP_FAILED = 2101, /**< NETIFC: Could not bring up network interface */ - OI_NETIFC_COULD_NOT_CREATE_THREAD = 2102, /**< NETIFC: Network interface could not create a read thread */ - OI_NETIFC_INITIALIZATION_FAILED = 2103, /**< NETIFC: Error in network interface initialization */ - OI_NETIFC_INTERFACE_ALREADY_UP = 2104, /**< NETIFC: Network interface is already up */ - OI_NETIFC_INTERFACE_NOT_UP = 2105, /**< NETIFC: Network interface is not up */ - OI_NETIFC_PACKET_TOO_BIG = 2106, /**< NETIFC: The packet is too big */ - - OI_PAN_ROLE_ALREADY_REGISTERED = 2201, /**< PAN: This PAN role was already registered */ - OI_PAN_ROLE_NOT_ALLOWED = 2202, /**< PAN: The PAN role is not currently allowed */ - OI_PAN_INCOMPATIBLE_ROLES = 2203, /**< PAN: Only certain local and remote role combinations are permitted */ - OI_PAN_INVALID_ROLE = 2204, /**< PAN: Role specified is not one the defined PAN roles */ - OI_PAN_CONNECTION_IN_PROGRESS = 2205, /**< PAN: A PAN connection is currently being established */ - OI_PAN_USER_ALREADY_CONNECTED = 2206, /**< PAN: PAN user role only allows a single connection */ - OI_PAN_DEVICE_CONNECTED = 2207, /**< PAN: A PAN connection already exists to specified device */ - - OI_CODEC_SBC_NO_SYNCWORD = 2301, /**< CODEC: Couldn't find an SBC SYNCWORD */ - OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA = 2302, /**< CODEC: Not enough data provided to decode an SBC header */ - OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA = 2303, /**< CODEC: Decoded the header, but not enough data to contain the rest of the frame */ - OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA = 2304, /**< CODEC: Not enough audio data for this frame */ - OI_CODEC_SBC_CHECKSUM_MISMATCH = 2305, /**< CODEC: The frame header didn't match the checksum */ - OI_CODEC_SBC_PARTIAL_DECODE = 2306, /**< CODEC: Decoding was successful, but frame data still remains. Next call will provide audio without consuming input data. */ - - OI_FIFOQ_QUEUE_NOT_ALIGNED = 2401, /**< FIFOQ: queue must be 32-bit aligned */ - OI_FIFOQ_INVALID_Q = 2402, /**< FIFOQ: queue parameter is not a valid queue */ - OI_FIFOQ_BUF_TOO_LARGE = 2403, /**< FIFOQ: attempt to queue a buffer which is too large */ - OI_FIFOQ_FULL = 2404, /**< FIFOQ: enqueue() failed, queue is full */ - OI_FIFOQ_NOT_ALLOCATED = 2405, /**< FIFOQ: Enqueue QBuf() failed, buffer not allocated */ - OI_FIFOQ_INVALID_DATA_PTR = 2406, /**< FIFOQ: Enqueue QBuf() failed, data pointer does not match */ - - OI_HID_HOST_SERVICE_NOT_STARTED = 2601, /**< HID: Cannot connect to a HID device unless HID host is started */ - OI_HID_DEVICE_SERVICE_NOT_STARTED = 2602, /**< HID: Cannot connect to a HID host unless HID device is started */ - - OI_AT_ERROR = 2701, /**< AT: ERROR response */ - OI_AT_NO_CARRIER = 2702, /**< AT: NO CARRIER response */ - OI_AT_BUSY = 2703, /**< AT: BUSY response */ - OI_AT_NO_ANSWER = 2704, /**< AT: NO ANSWER response */ - OI_AT_DELAYED = 2705, /**< AT: DELAYED response */ - OI_AT_BLACKLISTED = 2706, /**< AT: BLACKLISTED response */ - OI_AT_CME_ERROR = 2707, /**< AT: +CME ERROR response */ - OI_AT_CMS_ERROR = 2708, /**< AT: +CMS ERROR response */ - - OI_BLST_CHARACTER_TIMEOUT = 2801, /**< BLST: Timeout expired while waiting for a character from the client. */ - OI_BLST_ACKNOWLDGE_TIMEOUT = 2802, /**< BLST: Timeout expired while waiting for event acknowledgment from the client */ - OI_BLST_TX_NOT_READY = 2803, /**< BLST: BLST is not ready to send a BHAPI message to the client. */ - OI_BLST_TX_BUSY = 2804, /**< BLST: BLST transmit buffer is in use. */ - - OI_AVDTP_CONNECTION_SEQ_ERROR = 2901, /**< AVDTP: sequencing of signalling/media channel connections broken. */ - OI_AVDTP_OUT_OF_RESOURCES = 2902, /**< AVDTP: Tried to allocate too many endpoints or signalling channels. */ - - OI_PBAP_REPOSITORY_NOT_SET = 3001, /**< PBAP: Phonebook repository must be set for operation to complete. */ - OI_PBAP_PHONEBOOK_NOT_SET = 3002, /**< PBAP: Phonebook be set for operation to complete. */ - - OI_AADP_BAD_ENDPOINT = 3101, /**< AADP: Invalid local endpoint specified */ - OI_AADP_BAD_STATE = 3102, /**< AADP: AADP State is not correct for this operation. */ - - OI_UNICODE_INVALID_SOURCE = 3200, /**< Unicode Conversion: Source string has invalid character encoding. */ - OI_UNICODE_SOURCE_EXHAUSTED = 3201, /**< Unicode Conversion: Incomplete Unicode character at end of source buffer. */ - OI_UNICODE_DESTINATION_EXHAUSTED = 3202, /**< Unicode Conversion: Destination buffer not large enough to hold resulting Unicode string. */ - - OI_AVRCP_TOO_MANY_CONNECTIONS = 3300, /**< AVRCP: Exceeded maximum number of simultaneous AVCTP connections. */ - OI_AVRCP_NOT_IMPLEMENTED = 3301, /**< AVRCP: The target does not implement the command specified by the opcode and operand. */ - OI_AVRCP_REJECTED = 3302, /**< AVRCP: The target cannot respond because of invalid operands in command packet. */ - OI_AVRCP_INVALID_RESPONSE = 3303, /**< AVRCP: The controller received the response with invalid parameters */ - OI_AVRCP_RESPONSE_PACKET_OVERFLOW = 3304, /**< AVRCP: The response message does not fir in one AVRCP packet (512 bytes), has to be fragmented. */ - OI_AVRCP_RESPONSE_INVALID_PDU = 3305, /**< AVRCP: Command rejected: target received a PDU that it did not understand. */ - OI_AVRCP_RESPONSE_INVALID_PARAMETER = 3306, /**< AVRCP: Command rejected: target received a PDU with a parameter ID that it did not understand. */ - OI_AVRCP_RESPONSE_PARAMETER_NOT_FOUND = 3307, /**< AVRCP: Command rejected: specified parameter not found, sent if the parameter ID is understood, but content is wrong or corrupted.*/ - OI_AVRCP_RESPONSE_INTERNAL_ERROR = 3308, /**< AVRCP: Command rejected: target detected other error conditions. */ - OI_MAX_BM3_STATUS_VAL, /* Maximum BM3 status code */ - - /* Status code values reserved for BM3 SDK platform-specific implementations */ - OI_STATUS_RESERVED_FOR_BCOT = 9000, - - /* Status code values reserved for BHAPI products */ - OI_STATUS_RESERVED_FOR_BHAPI = 9200, - - /* Status code values reserved for Soundabout products */ - OI_STATUS_RESERVED_FOR_SOUNDABOUT = 9400, - - /* - * Status code values greater than or equal to this value are reserved for use by applications. - * However, because of differences between compilers, and differences between 16-bit and 32-bit - * platforms custom status codes should be in the 16-bit range, so status codes can range from 0 - * to 65534, inclusive (65535 is reserved) - */ - OI_STATUS_RESERVED_FOR_APPS = 10000, - - OI_STATUS_NONE = 0xffff /**< Special status code to indicate that there is no status. (Only to be used for special cases involving OI_SLOG_ERROR() and OI_SLOG_WARNING().) */ - -} OI_STATUS; - -/* Remeber to update the #define below when new reserved blocks are added to - * the list above. */ -#define OI_NUM_RESERVED_STATUS_BLOCKS 4 /**< Number of status code blocks reserved, including user apps */ - -/** - * Test for success - */ -#define OI_SUCCESS(x) ((x) == OI_OK) - -/*****************************************************************************/ -#ifdef __cplusplus -} -#endif - -/**@}*/ - -#endif /* _OI_STATUS_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_stddefs.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_stddefs.h deleted file mode 100644 index 8f210200..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_stddefs.h +++ /dev/null @@ -1,252 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#ifndef OI_STDDEFS_H -#define OI_STDDEFS_H -/** - * @file - * This file contains BM3 standard type definitions. - * - */ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -#include "oi_cpu_dep.h" - -/** \addtogroup Misc Miscellaneous APIs */ -/**@{*/ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef FALSE -#define FALSE 0 /**< This define statement sets FALSE as a preprocessor alias for 0. */ -#endif - -#ifndef TRUE -#define TRUE (!FALSE) /**< This define statement sets TRUE as a preprocessor alias for !FALSE. */ -#endif - -#ifdef HEW_TOOLCHAIN -#ifdef NULL -#undef NULL /**< Override HEW toolchain NULL definition */ -#endif -#define NULL 0 /**< HEW toolchain does not allow us to compare (void*) type to function pointer */ -#else -#ifndef NULL -#define NULL ((void *)0) /**< This define statement sets NULL as a preprocessor alias for (void*)0 */ -#endif -#endif - -/** - * @name Maximum and minimum values for basic types - * @{ - */ -#define OI_INT8_MIN ((OI_INT8)0x80) /**< decimal value: -128 */ -#define OI_INT8_MAX ((OI_INT8)0x7F) /**< decimal value: 127 */ -#define OI_INT16_MIN ((OI_INT16)0x8000) /**< decimal value: -32768 */ -#define OI_INT16_MAX ((OI_INT16)0x7FFF) /**< decimal value: 32767 */ -#define OI_INT32_MIN ((OI_INT32)0x80000000) /**< decimal value: -2,147,483,648 */ -#define OI_INT32_MAX ((OI_INT32)0x7FFFFFFF) /**< decimal value: 2,147,483,647 */ -#define OI_UINT8_MIN ((OI_UINT8)0) /**< decimal value: 0 */ -#define OI_UINT8_MAX ((OI_UINT8)0xFF) /**< decimal value: 255 */ -#define OI_UINT16_MIN ((OI_UINT16)0) /**< decimal value: 0 */ -#define OI_UINT16_MAX ((OI_UINT16)0xFFFF) /**< decimal value: 65535 */ -#define OI_UINT32_MIN ((OI_UINT32)0) /**< decimal value: 0 */ -#define OI_UINT32_MAX ((OI_UINT32)0xFFFFFFFF) /**< decimal value: 4,294,967,295 */ - -/** - * @} - */ - -/** - * @name Integer types required by the Service Discovery Protocol - * @{ - */ - -/** unsigned 64-bit integer as a structure of two unsigned 32-bit integers */ -typedef struct { - OI_UINT32 I1; /**< most significant 32 bits */ - OI_UINT32 I2; /**< least significant 32 bits */ -} OI_UINT64; - -#define OI_UINT64_MIN \ - { \ - (OI_UINT32)0x00000000, (OI_UINT32)0x00000000 \ - } -#define OI_UINT64_MAX \ - { \ - (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF \ - } - -/** signed 64-bit integer as a structure of one unsigned 32-bit integer and one signed 32-bit integer */ -typedef struct { - OI_INT32 I1; /**< most significant 32 bits as a signed integer */ - OI_UINT32 I2; /**< least significant 32 bits as an unsigned integer */ -} OI_INT64; - -#define OI_INT64_MIN \ - { \ - (OI_INT32)0x80000000, (OI_UINT32)0x00000000 \ - } -#define OI_INT64_MAX \ - { \ - (OI_INT32)0X7FFFFFFF, (OI_UINT32)0XFFFFFFFF \ - } - -/** unsigned 128-bit integer as a structure of four unsigned 32-bit integers */ -typedef struct { - OI_UINT32 I1; /**< most significant 32 bits */ - OI_UINT32 I2; /**< second-most significant 32 bits */ - OI_UINT32 I3; /**< third-most significant 32 bits */ - OI_UINT32 I4; /**< least significant 32 bits */ -} OI_UINT128; - -#define OI_UINT128_MIN \ - { \ - (OI_UINT32)0x00000000, (OI_UINT32)0x00000000, (OI_UINT32)0x00000000, (OI_UINT32)0x00000000 \ - } -#define OI_UINT128_MAX \ - { \ - (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF \ - } - -/** signed 128-bit integer as a structure of three unsigned 32-bit integers and one signed 32-bit integer */ -typedef struct { - OI_INT32 I1; /**< most significant 32 bits as a signed integer */ - OI_UINT32 I2; /**< second-most significant 32 bits as an unsigned integer */ - OI_UINT32 I3; /**< third-most significant 32 bits as an unsigned integer */ - OI_UINT32 I4; /**< least significant 32 bits as an unsigned integer */ -} OI_INT128; - -#define OI_INT128_MIN \ - { \ - (OI_UINT32)0x80000000, (OI_UINT32)0x00000000, (OI_UINT32)0x00000000, (OI_UINT32)0x00000000 \ - } -#define OI_INT128_MAX \ - { \ - (OI_UINT32)0X7FFFFFFF, (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF \ - } - -/** - * @} - */ - -/** - * type for ASCII character data items - */ -typedef char OI_CHAR; - -/** - * type for double-byte character data items - */ -typedef OI_UINT16 OI_CHAR16; - -/** - * types for UTF encoded strings. - */ -typedef OI_UINT8 OI_UTF8; -typedef OI_UINT16 OI_UTF16; -typedef OI_UINT32 OI_UTF32; - -/** - * @name Single-bit operation macros - * @{ - * In these macros, x is the data item for which a bit is to be tested or set and y specifies which bit - * is to be tested or set. - */ - -/** This macro's value is TRUE if the bit specified by y is set in data item x. */ -#define OI_BIT_TEST(x, y) ((x) & (y)) - -/** This macro's value is TRUE if the bit specified by y is not set in data item x. */ -#define OI_BIT_CLEAR_TEST(x, y) (((x) & (y)) == 0) - -/** This macro sets the bit specified by y in data item x. */ -#define OI_BIT_SET(x, y) ((x) |= (y)) - -/** This macro clears the bit specified by y in data item x. */ -#define OI_BIT_CLEAR(x, y) ((x) &= ~(y)) - -/** @} */ - -/** - * The OI_ARRAYSIZE macro is set to the number of elements in an array - * (instead of the number of bytes, which is returned by sizeof()). - */ - -#ifndef OI_ARRAYSIZE -#define OI_ARRAYSIZE(a) (sizeof(a) / sizeof(a[0])) -#endif - -/** - * @name Preprocessor aliases for individual bit positions - * Bits are defined here only if they are not already defined. - * @{ - */ - -#ifndef BIT0 - -#define BIT0 0x00000001 /**< preprocessor alias for 32-bit value with bit 0 set, used to specify this single bit */ -#define BIT1 0x00000002 /**< preprocessor alias for 32-bit value with bit 1 set, used to specify this single bit */ -#define BIT2 0x00000004 /**< preprocessor alias for 32-bit value with bit 2 set, used to specify this single bit */ -#define BIT3 0x00000008 /**< preprocessor alias for 32-bit value with bit 3 set, used to specify this single bit */ -#define BIT4 0x00000010 /**< preprocessor alias for 32-bit value with bit 4 set, used to specify this single bit */ -#define BIT5 0x00000020 /**< preprocessor alias for 32-bit value with bit 5 set, used to specify this single bit */ -#define BIT6 0x00000040 /**< preprocessor alias for 32-bit value with bit 6 set, used to specify this single bit */ -#define BIT7 0x00000080 /**< preprocessor alias for 32-bit value with bit 7 set, used to specify this single bit */ -#define BIT8 0x00000100 /**< preprocessor alias for 32-bit value with bit 8 set, used to specify this single bit */ -#define BIT9 0x00000200 /**< preprocessor alias for 32-bit value with bit 9 set, used to specify this single bit */ -#define BIT10 0x00000400 /**< preprocessor alias for 32-bit value with bit 10 set, used to specify this single bit */ -#define BIT11 0x00000800 /**< preprocessor alias for 32-bit value with bit 11 set, used to specify this single bit */ -#define BIT12 0x00001000 /**< preprocessor alias for 32-bit value with bit 12 set, used to specify this single bit */ -#define BIT13 0x00002000 /**< preprocessor alias for 32-bit value with bit 13 set, used to specify this single bit */ -#define BIT14 0x00004000 /**< preprocessor alias for 32-bit value with bit 14 set, used to specify this single bit */ -#define BIT15 0x00008000 /**< preprocessor alias for 32-bit value with bit 15 set, used to specify this single bit */ -#define BIT16 0x00010000 /**< preprocessor alias for 32-bit value with bit 16 set, used to specify this single bit */ -#define BIT17 0x00020000 /**< preprocessor alias for 32-bit value with bit 17 set, used to specify this single bit */ -#define BIT18 0x00040000 /**< preprocessor alias for 32-bit value with bit 18 set, used to specify this single bit */ -#define BIT19 0x00080000 /**< preprocessor alias for 32-bit value with bit 19 set, used to specify this single bit */ -#define BIT20 0x00100000 /**< preprocessor alias for 32-bit value with bit 20 set, used to specify this single bit */ -#define BIT21 0x00200000 /**< preprocessor alias for 32-bit value with bit 21 set, used to specify this single bit */ -#define BIT22 0x00400000 /**< preprocessor alias for 32-bit value with bit 22 set, used to specify this single bit */ -#define BIT23 0x00800000 /**< preprocessor alias for 32-bit value with bit 23 set, used to specify this single bit */ -#define BIT24 0x01000000 /**< preprocessor alias for 32-bit value with bit 24 set, used to specify this single bit */ -#define BIT25 0x02000000 /**< preprocessor alias for 32-bit value with bit 25 set, used to specify this single bit */ -#define BIT26 0x04000000 /**< preprocessor alias for 32-bit value with bit 26 set, used to specify this single bit */ -#define BIT27 0x08000000 /**< preprocessor alias for 32-bit value with bit 27 set, used to specify this single bit */ -#define BIT28 0x10000000 /**< preprocessor alias for 32-bit value with bit 28 set, used to specify this single bit */ -#define BIT29 0x20000000 /**< preprocessor alias for 32-bit value with bit 29 set, used to specify this single bit */ -#define BIT30 0x40000000 /**< preprocessor alias for 32-bit value with bit 30 set, used to specify this single bit */ -#define BIT31 0x80000000 /**< preprocessor alias for 32-bit value with bit 31 set, used to specify this single bit */ - -#endif /* BIT0 et al */ - -/** @} */ - -#ifdef __cplusplus -} -#endif - -/**@}*/ - -/*****************************************************************************/ -#endif /* OI_STDDEFS_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_string.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_string.h deleted file mode 100644 index 68e6aad2..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_string.h +++ /dev/null @@ -1,200 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#ifndef OI_STRING_H -#define OI_STRING_H -/** - * @file - * This file contains BM3 supplied portable string.h functions - * - */ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -#include "oi_cpu_dep.h" -#include "oi_stddefs.h" - -#if defined(USE_NATIVE_MEMCPY) || defined(USE_NATIVE_MALLOC) -#include -#endif - -/** \addtogroup Misc Miscellaneous APIs */ -/**@{*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * If we are using Native malloc(), we must also use - * native Ansi string.h functions for memory manipulation. - */ -#ifdef USE_NATIVE_MALLOC -#ifndef USE_NATIVE_MEMCPY -#define USE_NATIVE_MEMCPY -#endif -#endif - -#ifdef USE_NATIVE_MEMCPY - -#define OI_MemCopy(to, from, size) memcpy((to), (from), (size)) -#define OI_MemSet(block, val, size) memset((block), (val), (size)) -#define OI_MemZero(block, size) memset((block), 0, (size)) -#define OI_MemCmp(s1, s2, n) memcmp((s1), (s2), (n)) -#define OI_Strcpy(dest, src) strcpy((dest), (src)) -#define OI_Strcat(dest, src) strcat((dest), (src)) -#define OI_StrLen(str) strlen((str)) -#define OI_Strcmp(s1, s2) strcmp((s1), (s2)) -#define OI_Strncmp(s1, s2, n) strncmp((s1), (s2), (n)) - -#else - -/* - * OI_MemCopy - * - * Copy an arbitrary number of bytes from one memory address to another. - * The underlying implementation is the ANSI memmove() or equivalant, so - * overlapping memory copies will work correctly. - */ -void OI_MemCopy(void *To, void const *From, OI_UINT32 Size); - -/* - * OI_MemSet - * - * Sets all bytes in a block of memory to the same value - */ -void OI_MemSet(void *Block, OI_UINT8 Val, OI_UINT32 Size); - -/* - * OI_MemZero - * - * Sets all bytes in a block of memory to zero - */ -void OI_MemZero(void *Block, OI_UINT32 Size); - -/* - * OI_MemCmp - * - * Compare two blocks of memory - * - * Returns: - * 0, if s1 == s2 - * < 0, if s1 < s2 - * > 0, if s2 > s2 - */ -OI_INT OI_MemCmp(void const *s1, void const *s2, OI_UINT32 n); - -/* - * OI_Strcpy - * - * Copies the Null terminated string from pStr to pDest, and - * returns pDest. - */ - -OI_CHAR *OI_Strcpy(OI_CHAR *pDest, - OI_CHAR const *pStr); - -/* - * OI_Strcat - * - * Concatonates the pStr string to the end of pDest, and - * returns pDest. - */ - -OI_CHAR *OI_Strcat(OI_CHAR *pDest, - OI_CHAR const *pStr); - -/* - * OI_StrLen - * - * Calculates the number of OI_CHARs in pStr (not including - * the Null terminator) and returns the value. - */ -OI_UINT OI_StrLen(OI_CHAR const *pStr); - -/* - * OI_Strcmp - * - * Compares two Null terminated strings - * - * Returns: - * 0, if s1 == s2 - * < 0, if s1 < s2 - * > 0, if s2 > s2 - */ -OI_INT OI_Strcmp(OI_CHAR const *s1, - OI_CHAR const *s2); - -/* - * OI_Strncmp - * - * Compares the first "len" OI_CHARs of strings s1 and s2. - * - * Returns: - * 0, if s1 == s2 - * < 0, if s1 < s2 - * > 0, if s2 > s2 - */ -OI_INT OI_Strncmp(OI_CHAR const *s1, - OI_CHAR const *s2, - OI_UINT32 len); - -#endif /* USE_NATIVE_MEMCPY */ - -/* - * OI_StrcmpInsensitive - * - * Compares two Null terminated strings, treating - * the Upper and Lower case of 'A' through 'Z' as - * equivilent. - * - * Returns: - * 0, if s1 == s2 - * < 0, if s1 < s2 - * > 0, if s2 > s2 - */ -OI_INT OI_StrcmpInsensitive(OI_CHAR const *s1, - OI_CHAR const *s2); - -/* - * OI_StrncmpInsensitive - * - * Compares the first "len" OI_CHARs of strings s1 and s2, - * treating the Upper and Lower case of 'A' through 'Z' as - * equivilent. - * - * - * Returns: - * 0, if s1 == s2 - * < 0, if s1 < s2 - * > 0, if s2 > s2 - */ -OI_INT OI_StrncmpInsensitive(OI_CHAR const *s1, - OI_CHAR const *s2, - OI_UINT len); - -#ifdef __cplusplus -} -#endif - -/** @} */ - -/*****************************************************************************/ -#endif /* OI_STRING_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_time.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_time.h deleted file mode 100644 index b1ef5261..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_time.h +++ /dev/null @@ -1,188 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#ifndef _OI_TIME_H -#define _OI_TIME_H -/** @file - * - * This file provides time type definitions and interfaces to time-related functions. - * - * The stack maintains a 64-bit real-time millisecond clock. The choice of - * milliseconds is for convenience, not accuracy. - * - * Timeouts are specified as tenths of seconds in a 32-bit value. Timeout values - * specified by the Bluetooth specification are usually muliple seconds, so - * accuracy to a tenth of a second is more than adequate. - * - * This file also contains macros to convert between seconds and the Link - * Manager's 1.28-second units. - * - */ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -#include "oi_stddefs.h" - -/** \addtogroup Misc Miscellaneous APIs */ -/**@{*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Within the core stack timeouts are specified in intervals of tenths of seconds - */ - -typedef OI_UINT16 OI_INTERVAL; -#define OI_INTERVALS_PER_SECOND 10 -#define MSECS_PER_OI_INTERVAL (1000 / OI_INTERVALS_PER_SECOND) - -/** maximum interval (54 min 36.7 sec) */ -#define OI_MAX_INTERVAL 0x7fff - -/** - * Macro to convert seconds to OI_INTERVAL time units - */ - -#define OI_SECONDS(n) ((OI_INTERVAL)((n)*OI_INTERVALS_PER_SECOND)) - -/** - * Macro to convert milliseconds to OI_INTERVAL time units (Rounded Up) - */ - -#define OI_MSECONDS(n) ((OI_INTERVAL)((n + MSECS_PER_OI_INTERVAL - 1) / MSECS_PER_OI_INTERVAL)) - -/** - * Macro to convert minutes to OI_INTERVAL time units - */ - -#define OI_MINUTES(n) ((OI_INTERVAL)((n)*OI_SECONDS(60))) - -/** Convert an OI_INTERVAL to milliseconds. */ -#define OI_INTERVAL_TO_MILLISECONDS(i) ((i)*MSECS_PER_OI_INTERVAL) - -/** - * The stack depends on relative not absolute time. Any mapping between the - * stack's real-time clock and absolute time and date is implementation-dependent. - */ - -typedef struct { - OI_INT32 seconds; - OI_INT16 mseconds; -} OI_TIME; - -/** - * Convert an OI_TIME to milliseconds. - * - * @param t the time to convert - * - * @return the time in milliseconds - */ -OI_UINT32 OI_Time_ToMS(OI_TIME *t); - -/** - * This function compares two time values. - * - * @param T1 first time to compare. - * - * @param T2 second time to compare. - * - * @return - @verbatim - -1 if t1 < t2 - 0 if t1 = t2 - +1 if t1 > t2 - @endverbatim - */ - -OI_INT16 OI_Time_Compare(OI_TIME *T1, - OI_TIME *T2); - -/** - * This function returns the interval between two times to a granularity of 0.1 seconds. - * - * @param Sooner a time value more recent that Later - * - * @param Later a time value later than Sooner - * - * @note The result is an OI_INTERVAL value so this function only works for time intervals - * that are less than about 71 minutes. - * - * @return the time interval between the two times = (Later - Sooner) - */ - -OI_INTERVAL OI_Time_Interval(OI_TIME *Sooner, - OI_TIME *Later); - -/** - * This function returns the interval between two times to a granularity of milliseconds. - * - * @param Sooner a time value more recent that Later - * - * @param Later a time value later than Sooner - * - * @note The result is an OI_UINT32 value so this function only works for time intervals - * that are less than about 50 days. - * - * @return the time interval between the two times = (Later - Sooner) - */ - -OI_UINT32 OI_Time_IntervalMsecs(OI_TIME *Sooner, - OI_TIME *Later); - -/** - * This function answers the question, Have we reached or gone past the target time? - * - * @param pTargetTime target time - * - * @return TRUE means time now is at or past target time - * FALSE means target time is still some time in the future - */ - -OI_BOOL OI_Time_NowReachedTime(OI_TIME *pTargetTime); - -/** - * Convert seconds to the Link Manager 1.28-second units - * Approximate by using 1.25 conversion factor. - */ - -#define OI_SECONDS_TO_LM_TIME_UNITS(lmUnits) ((lmUnits) < 4 ? (lmUnits) : (lmUnits) - ((lmUnits) >> 2)) - -/** - * Convert Link Manager 1.28-second units to seconds. - * Approximate by using 1.25 conversion factor. - */ - -#define OI_LM_TIME_UNITS_TO_SECONDS(lmUnits) ((lmUnits) + ((lmUnits) >> 2)) - -#ifdef __cplusplus -} -#endif - -/**@}*/ - -/* Include for OI_Time_Now() prototype - * Must be included at end to obtain OI_TIME typedef - */ -#include "oi_osinterface.h" - -/*****************************************************************************/ -#endif /* _OI_TIME_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_utils.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_utils.h deleted file mode 100644 index 764b2680..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/oi_utils.h +++ /dev/null @@ -1,362 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#ifndef _OI_UTILS_H -#define _OI_UTILS_H -/** - * @file - * - * This file provides the interface for utility functions. - * Among the utilities are strlen (string length), strcmp (string compare), and - * other string manipulation functions. These are provided for those plaforms - * where this functionality is not available in stdlib. - */ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -#include -#include "oi_common.h" -#include "oi_string.h" -#include "oi_bt_spec.h" - -/** \addtogroup Misc Miscellaneous APIs */ -/**@{*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Opaque type for a callback function handle. See OI_ScheduleCallbackFunction() - */ -typedef OI_UINT32 OI_CALLBACK_HANDLE; - -/** - * Function prototype for a timed procedure callback. - * - * @param arg Value that was passed into the OI_ScheduleCallback() function - * - */ -typedef void (*OI_SCHEDULED_CALLBACK)(void *arg); - -/** - * Registers a function to be called when a timeout expires. This API uses BLUEmagic's internal - * function dispatch mechanism, so applications that make extensive use of this facility may need to - * increase the value of DispatchTableSize in the configuration block for the dispatcher (see - * oi_bt_stack_config.h). - * - * @param callbackFunction The function that will be called when the timeout expires - * - * @param arg Value that will be returned as the parameter to the callback function. - * - * @param timeout A timeout expressed in OI_INTERVALs (tenths of seconds). This can be - * zero in which case the callback function will be called as soon as - * possible. - * - * @param handle NULL or a pointer receive the callback handle. - * - * @return OI_OK if the function was reqistered, or an error status. - */ -OI_STATUS OI_ScheduleCallbackFunction(OI_SCHEDULED_CALLBACK callbackFunction, - void *arg, - OI_INTERVAL timeout, - OI_CALLBACK_HANDLE *handle); - -/** - * Cancels a function registered with OI_ScheduleCallbackFunction() before its timer expires. - * - * @param handle handle returned by OI_ScheduleCallbackFunction(). - * - * @return OI_OK if the function was cancelled, or an error status. - */ -OI_STATUS OI_CancelCallbackFunction(OI_CALLBACK_HANDLE handle); - -/** - * Registers a function to be called when a timeout expires. This version does not return a handle - * so can only be canceled by calling OI_CancelCallback(). - * - * @param callbackFunction The function that will be called when the timeout expires - * - * @param arg Value that will be returned as the parameter to the callback function. - * - * @param timeout A timeout expressed in OI_INTERVALs (tenths of seconds). This can be - * zero in which case the callback function will be called as soon as - * possible. - * - * @return OI_OK if the function was reqistered, or an error status. - */ -#define OI_ScheduleCallback(f, a, t) OI_ScheduleCallbackFunction(f, a, t, NULL); - -/** - * Cancels a function registered with OI_ScheduleCallback() before its timer expires. This - * function will cancel the first entry matches the indicated callback function pointer. - * - * @param callbackFunction The function that was originally registered - * - * @return OI_OK if the function was cancelled, or an error status. - */ -OI_STATUS OI_CancelCallback(OI_SCHEDULED_CALLBACK callbackFunction); - -/** - * Parse a Bluetooth device address from the specified string. - * - * @param str the string to parse - * @param addr the parsed address, if successful - * - * @return TRUE if an address was successfully parsed, FALSE otherwise - */ - -OI_BOOL OI_ParseBdAddr(const OI_CHAR *str, - OI_BD_ADDR *addr); - -/** - * Printf function for platforms which have no stdio or printf available. - * OI_Printf supports the basic formatting types, with the exception of - * floating point types. Additionally, OI_Printf supports several formats - * specific to BLUEmagic 3.0 software: - * - * \%! prints the string for an #OI_STATUS value. - * @code OI_Printf("There was an error %!", status); @endcode - * - * \%@ prints a hex dump of a buffer. - * Requires a pointer to the buffer and a signed integer length - * (0 for default length). If the buffer is large, only an excerpt will - * be printed. - * @code OI_Printf("Contents of buffer %@", buffer, sizeof(buffer)); @endcode - * - * \%: prints a Bluetooth address in the form "HH:HH:HH:HH:HH:HH". - * Requires a pointer to an #OI_BD_ADDR. - * @code OI_Printf("Bluetooth address %:", &bdaddr); @endcode - * - * \%^ decodes and prints a data element as formatted XML. - * Requires a pointer to an #OI_DATAELEM. - * @code OI_Printf("Service attribute list is:\n%^", &attributes); @endcode - * - * \%/ prints the base file name of a path, that is, the final substring - * following a '/' or '\\' character. Requires a pointer to a null - * terminated string. - * @code OI_Printf("File %/", "c:\\dir1\\dir2\\file.txt"); @endcode - * - * \%~ prints a string, escaping characters as needed to display it in - * ASCII. Requires a pointer to an #OI_PSTR and an #OI_UNICODE_ENCODING - * parameter. - * @code OI_Printf("Identifier %~", &id, OI_UNICODE_UTF16_BE); @endcode - * - * \%[ inserts an ANSI color escape sequence. Requires a single character - * identifying the color to select. Colors are red (r/R), green (g/G), - * blue (b/B), yellow (y/Y), cyan (c/C), magenta (m/M), white (W), - * light-gray (l/L), dark-gray (d/D), and black (0). The lower case is - * dim, the upper case is bright (except in the case of light-gray and - * dark-gray, where bright and dim are identical). Any other value will - * select the default color. - * @code OI_Printf("%[red text %[black %[normal\n", 'r', '0', 0); @endcode - * - * \%a same as \%s, except '\\r' and '\\n' are output as "" and "". - * \%?a is valid, but \%la is not. - * - * \%b prints an integer in base 2. - * @code OI_Printf("Bits are %b", I); @endcode - * - * \%lb prints a long integer in base 2. - * - * \%?b prints the least significant N bits of an integer (or long integer) - * in base 2. Requires the integer and a length N. - * @code OI_Printf("Bottom 4 bits are: %?b", I, 4); @endcode - * - * \%B prints an integer as boolean text, "TRUE" or "FALSE". - * @code OI_Printf("The value 0 is %B, the value 1 is %B", 0, 1); @endcode - * - * \%?s prints a substring up to a specified maximum length. - * Requires a pointer to a string and a length parameter. - * @code OI_Printf("String prefix is %?s", str, 3); @endcode - * - * \%ls same as \%S. - * - * \%S prints a UTF16 string as UTF8 (plain ASCII, plus 8-bit char sequences - * where needed). Requires a pointer to #OI_CHAR16. \%?S is valid. The - * length parameter is in OI_CHAR16 characters. - * - * \%T prints time, formatted as "secs.msecs". - * Requires pointer to #OI_TIME struct, NULL pointer prints current time. - * @code OI_Printf("The time now is %T", NULL); @endcode - * - * @param format The format string - * - */ -void OI_Printf(const OI_CHAR *format, ...); - -/** - * Var-args version OI_Printf - * - * @param format Same as for OI_Printf. - * - * @param argp Var-args list. - */ -void OI_VPrintf(const OI_CHAR *format, va_list argp); - -/** - * Writes a formatted string to a buffer. This function supports the same format specifiers as - * OI_Printf(). - * - * @param buffer Destination buffer for the formatted string. - * - * @param bufLen The length of the destination buffer. - * - * @param format The format string - * - * @return Number of characters written or -1 in the case of an error. - */ -OI_INT32 OI_SNPrintf(OI_CHAR *buffer, - OI_UINT16 bufLen, - const OI_CHAR *format, ...); - -/** - * Var-args version OI_SNPrintf - * - * @param buffer Destination buffer for the formatted string. - * - * @param bufLen The length of the destination buffer. - * - * @param format The format string - * - * @param argp Var-args list. - * - * @return Number of characters written or -1 in the case of an error. - */ -OI_INT32 OI_VSNPrintf(OI_CHAR *buffer, - OI_UINT16 bufLen, - const OI_CHAR *format, va_list argp); - -/** - * Convert a string to an integer. - * - * @param str the string to parse - * - * @return the integer value of the string or 0 if the string could not be parsed - */ -OI_INT OI_atoi(const OI_CHAR *str); - -/** - * Parse a signed integer in a string. - * - * Skips leading whitespace (space and tabs only) and parses a decimal or hex string. Hex string - * must be prefixed by "0x". Returns pointer to first character following the integer. Returns the - * pointer passed in if the string does not describe an integer. - * - * @param str String to parse. - * - * @param val Pointer to receive the parsed integer value. - * - * @return A pointer to the first character following the integer or the pointer passed in. - */ -const OI_CHAR *OI_ScanInt(const OI_CHAR *str, - OI_INT32 *val); - -/** - * Parse an unsigned integer in a string. - * - * Skips leading whitespace (space and tabs only) and parses a decimal or hex string. Hex string - * must be prefixed by "0x". Returns pointer to first character following the integer. Returns the - * pointer passed in if the string does not describe an integer. - * - * @param str String to parse. - * - * @param val Pointer to receive the parsed unsigned integer value. - * - * @return A pointer to the first character following the unsigned integer or the pointer passed in. - */ -const OI_CHAR *OI_ScanUInt(const OI_CHAR *str, - OI_UINT32 *val); - -/** - * Parse a whitespace delimited substring out of a string. - * - * @param str Input string to parse. - * @param outStr Buffer to return the substring - * @param len Length of outStr - * - * - * @return A pointer to the first character following the substring or the pointer passed in. - */ -const OI_CHAR *OI_ScanStr(const OI_CHAR *str, - OI_CHAR *outStr, - OI_UINT16 len); - -/** - * Parse a string for one of a set of alternative value. Skips leading whitespace (space and tabs - * only) and parses text matching one of the alternative strings. Returns pointer to first character - * following the matched text. - * - * @param str String to parse. - * - * @param alts Alternative matching strings separated by '|' - * - * @param index Pointer to receive the index of the matching alternative, return value is -1 if - * there is no match. - * - * @return A pointer to the first character following the matched value or the pointer passed in - * if there was no matching text. - */ -const OI_CHAR *OI_ScanAlt(const OI_CHAR *str, - const OI_CHAR *alts, - OI_INT *index); - -/** - * Parse a string for a BD Addr. Skips leading whitespace (space and tabs only) and parses a - * Bluetooth device address with nibbles optionally separated by colons. Return pointet to first - * character following the BD Addr. - * - * @param str String to parse. - * - * @param addr Pointer to receive the Bluetooth device address - * - * @return A pointer to the first character following the BD Addr or the pointer passed in. - */ -const OI_CHAR *OI_ScanBdAddr(const OI_CHAR *str, - OI_BD_ADDR *addr); - -/** Get a character from a digit integer value (0 - 9). */ -#define OI_DigitToChar(d) ((d) + '0') - -/** - * Determine Maximum and Minimum between two arguments. - * - * @param a 1st value - * @param b 2nd value - * - * @return the max or min value between a & b - */ -#define OI_MAX(a, b) (((a) < (b)) ? (b) : (a)) -#define OI_MIN(a, b) (((a) > (b)) ? (b) : (a)) - -/** - * Compare two BD_ADDRs - * SAME_BD_ADDR - Boolean: TRUE if they are the same address - */ - -#define SAME_BD_ADDR(x, y) (0 == OI_MemCmp((x), (y), OI_BD_ADDR_BYTE_SIZE)) - -#ifdef __cplusplus -} -#endif - -/**@}*/ - -#endif /* _OI_UTILS_H */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/readsamplesjoint.inc b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/readsamplesjoint.inc deleted file mode 100644 index 875a3949..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/readsamplesjoint.inc +++ /dev/null @@ -1,111 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/******************************************************************************* - * @file readsamplesjoint.inc - * - * This is the body of the generic version of OI_SBC_ReadSamplesJoint(). - * It is designed to be \#included into a function as follows: - \code - void OI_SBC_ReadSamplesJoint4(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs) - { - #define NROF_SUBBANDS 4 - #include "readsamplesjoint.inc" - #undef NROF_SUBBANDS - } - - void OI_SBC_ReadSamplesJoint8(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs) - { - #define NROF_SUBBANDS 8 - #include "readsamplesjoint.inc" - #undef NROF_SUBBANDS - } - \endcode - * Or to make a generic version: - \code - void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs) - { - OI_UINT nrof_subbands = common->frameInfo.nrof_subbands; - - #define NROF_SUBBANDS nrof_subbands - #include "readsamplesjoint.inc" - #undef NROF_SUBBANDS - } - \endcode - * @ingroup codec_internal - *******************************************************************************/ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -{ - OI_CODEC_SBC_COMMON_CONTEXT *common = &context->common; - OI_UINT bl = common->frameInfo.nrof_blocks; - OI_INT32 * RESTRICT s = common->subdata; - OI_UINT8 *ptr = global_bs->ptr.w; - OI_UINT32 value = global_bs->value; - OI_UINT bitPtr = global_bs->bitPtr; - OI_UINT8 jmask = common->frameInfo.join << (8 - NROF_SUBBANDS); - - do { - OI_INT8 *sf_array = &common->scale_factor[0]; - OI_UINT8 *bits_array = &common->bits.uint8[0]; - OI_UINT8 joint = jmask; - OI_UINT sb; - /* - * Left channel - */ - sb = NROF_SUBBANDS; - do { - OI_UINT32 raw; - OI_INT32 dequant; - OI_UINT8 bits = *bits_array++; - OI_INT sf = *sf_array++; - - OI_BITSTREAM_READUINT(raw, bits, ptr, value, bitPtr); - dequant = OI_SBC_Dequant(raw, sf, bits); - *s++ = dequant; - } while (--sb); - /* - * Right channel - */ - sb = NROF_SUBBANDS; - do { - OI_UINT32 raw; - OI_INT32 dequant; - OI_UINT8 bits = *bits_array++; - OI_INT sf = *sf_array++; - - OI_BITSTREAM_READUINT(raw, bits, ptr, value, bitPtr); - dequant = OI_SBC_Dequant(raw, sf, bits); - /* - * Check if we need to do mid/side - */ - if (joint & 0x80) { - OI_INT32 mid = *(s - NROF_SUBBANDS); - OI_INT32 side = dequant; - *(s - NROF_SUBBANDS) = mid + side; - dequant = mid - side; - } - joint <<= 1; - *s++ = dequant; - } while (--sb); - } while (--bl); -} diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/synthesis-8-generated.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/synthesis-8-generated.c deleted file mode 100644 index 1434d9d1..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/synthesis-8-generated.c +++ /dev/null @@ -1,160 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/** - @file - - DO NOT EDIT THIS FILE DIRECTLY - - This file is automatically generated by the "synthesis-gen.pl" script. - Any changes to this generated file will be lost when the script is re-run. - - These functions are called by functions in synthesis.c to perform the synthesis - filterbank computations for the SBC decoder. - - - */ -#include - -#if defined(SBC_DEC_INCLUDED) - -#ifndef CLIP_INT16 -#define CLIP_INT16(x) \ - do { \ - if (x > OI_INT16_MAX) { \ - x = OI_INT16_MAX; \ - } else if (x < OI_INT16_MIN) { \ - x = OI_INT16_MIN; \ - } \ - } while (0) -#endif - -#define MUL_16S_16S(_x, _y) ((_x) * (_y)) - -PRIVATE void SynthWindow80_generated(OI_INT16 *pcm, SBC_BUFFER_T const *RESTRICT buffer, OI_UINT strideShift) { - OI_INT32 pcm_a, pcm_b; - /* 1 - stage 0 */ pcm_b = 0; - /* 1 - stage 0 */ pcm_b += (MUL_16S_16S(8235, buffer[12])) >> 3; - /* 1 - stage 0 */ pcm_b += (MUL_16S_16S(-23167, buffer[20])) >> 3; - /* 1 - stage 0 */ pcm_b += (MUL_16S_16S(26479, buffer[28])) >> 2; - /* 1 - stage 0 */ pcm_b += (MUL_16S_16S(-17397, buffer[36])) << 1; - /* 1 - stage 0 */ pcm_b += (MUL_16S_16S(9399, buffer[44])) << 3; - /* 1 - stage 0 */ pcm_b += (MUL_16S_16S(17397, buffer[52])) << 1; - /* 1 - stage 0 */ pcm_b += (MUL_16S_16S(26479, buffer[60])) >> 2; - /* 1 - stage 0 */ pcm_b += (MUL_16S_16S(23167, buffer[68])) >> 3; - /* 1 - stage 0 */ pcm_b += (MUL_16S_16S(8235, buffer[76])) >> 3; - /* 1 - stage 0 */ pcm_b /= 32768; - CLIP_INT16(pcm_b); - pcm[0 << strideShift] = (OI_INT16)pcm_b; - /* 1 - stage 1 */ pcm_a = 0; - /* 1 - stage 1 */ pcm_b = 0; - /* 1 - stage 1 */ pcm_a += (MUL_16S_16S(-3263, buffer[5])) >> 5; - /* 1 - stage 1 */ pcm_b += (MUL_16S_16S(9293, buffer[5])) >> 3; - /* 1 - stage 1 */ pcm_a += (MUL_16S_16S(29293, buffer[11])) >> 5; - /* 1 - stage 1 */ pcm_b += (MUL_16S_16S(-6087, buffer[11])) >> 2; - /* 1 - stage 1 */ pcm_a += (MUL_16S_16S(-5229, buffer[21])); - /* 1 - stage 1 */ pcm_b += (MUL_16S_16S(1247, buffer[21])) << 3; - /* 1 - stage 1 */ pcm_a += (MUL_16S_16S(30835, buffer[27])) >> 3; - /* 1 - stage 1 */ pcm_b += (MUL_16S_16S(-2893, buffer[27])) << 3; - /* 1 - stage 1 */ pcm_a += (MUL_16S_16S(-27021, buffer[37])) << 1; - /* 1 - stage 1 */ pcm_b += (MUL_16S_16S(23671, buffer[37])) << 2; - /* 1 - stage 1 */ pcm_a += (MUL_16S_16S(31633, buffer[43])) << 1; - /* 1 - stage 1 */ pcm_b += (MUL_16S_16S(18055, buffer[43])) << 1; - /* 1 - stage 1 */ pcm_a += (MUL_16S_16S(17319, buffer[53])) << 1; - /* 1 - stage 1 */ pcm_b += (MUL_16S_16S(11537, buffer[53])) >> 1; - /* 1 - stage 1 */ pcm_a += (MUL_16S_16S(26663, buffer[59])) >> 2; - /* 1 - stage 1 */ pcm_b += (MUL_16S_16S(1747, buffer[59])) << 1; - /* 1 - stage 1 */ pcm_a += (MUL_16S_16S(4555, buffer[69])) >> 1; - /* 1 - stage 1 */ pcm_b += (MUL_16S_16S(685, buffer[69])) << 1; - /* 1 - stage 1 */ pcm_a += (MUL_16S_16S(12419, buffer[75])) >> 4; - /* 1 - stage 1 */ pcm_b += (MUL_16S_16S(8721, buffer[75])) >> 7; - /* 1 - stage 1 */ pcm_a /= 32768; - CLIP_INT16(pcm_a); - pcm[1 << strideShift] = (OI_INT16)pcm_a; - /* 1 - stage 1 */ pcm_b /= 32768; - CLIP_INT16(pcm_b); - pcm[7 << strideShift] = (OI_INT16)pcm_b; - /* 1 - stage 2 */ pcm_a = 0; - /* 1 - stage 2 */ pcm_b = 0; - /* 1 - stage 2 */ pcm_a += (MUL_16S_16S(-10385, buffer[6])) >> 6; - /* 1 - stage 2 */ pcm_b += (MUL_16S_16S(11167, buffer[6])) >> 4; - /* 1 - stage 2 */ pcm_a += (MUL_16S_16S(24995, buffer[10])) >> 5; - /* 1 - stage 2 */ pcm_b += (MUL_16S_16S(-10337, buffer[10])) >> 4; - /* 1 - stage 2 */ pcm_a += (MUL_16S_16S(-309, buffer[22])) << 4; - /* 1 - stage 2 */ pcm_b += (MUL_16S_16S(1917, buffer[22])) << 2; - /* 1 - stage 2 */ pcm_a += (MUL_16S_16S(9161, buffer[26])) >> 3; - /* 1 - stage 2 */ pcm_b += (MUL_16S_16S(-30605, buffer[26])) >> 1; - /* 1 - stage 2 */ pcm_a += (MUL_16S_16S(-23063, buffer[38])) << 1; - /* 1 - stage 2 */ pcm_b += (MUL_16S_16S(8317, buffer[38])) << 3; - /* 1 - stage 2 */ pcm_a += (MUL_16S_16S(27561, buffer[42])) << 1; - /* 1 - stage 2 */ pcm_b += (MUL_16S_16S(9553, buffer[42])) << 2; - /* 1 - stage 2 */ pcm_a += (MUL_16S_16S(2309, buffer[54])) << 3; - /* 1 - stage 2 */ pcm_b += (MUL_16S_16S(22117, buffer[54])) >> 4; - /* 1 - stage 2 */ pcm_a += (MUL_16S_16S(12705, buffer[58])) >> 1; - /* 1 - stage 2 */ pcm_b += (MUL_16S_16S(16383, buffer[58])) >> 2; - /* 1 - stage 2 */ pcm_a += (MUL_16S_16S(6239, buffer[70])) >> 3; - /* 1 - stage 2 */ pcm_b += (MUL_16S_16S(7543, buffer[70])) >> 3; - /* 1 - stage 2 */ pcm_a += (MUL_16S_16S(9251, buffer[74])) >> 4; - /* 1 - stage 2 */ pcm_b += (MUL_16S_16S(8603, buffer[74])) >> 6; - /* 1 - stage 2 */ pcm_a /= 32768; - CLIP_INT16(pcm_a); - pcm[2 << strideShift] = (OI_INT16)pcm_a; - /* 1 - stage 2 */ pcm_b /= 32768; - CLIP_INT16(pcm_b); - pcm[6 << strideShift] = (OI_INT16)pcm_b; - /* 1 - stage 3 */ pcm_a = 0; - /* 1 - stage 3 */ pcm_b = 0; - /* 1 - stage 3 */ pcm_a += (MUL_16S_16S(-16457, buffer[7])) >> 6; - /* 1 - stage 3 */ pcm_b += (MUL_16S_16S(16913, buffer[7])) >> 5; - /* 1 - stage 3 */ pcm_a += (MUL_16S_16S(19083, buffer[9])) >> 5; - /* 1 - stage 3 */ pcm_b += (MUL_16S_16S(-8443, buffer[9])) >> 7; - /* 1 - stage 3 */ pcm_a += (MUL_16S_16S(-23641, buffer[23])) >> 2; - /* 1 - stage 3 */ pcm_b += (MUL_16S_16S(3687, buffer[23])) << 1; - /* 1 - stage 3 */ pcm_a += (MUL_16S_16S(-29015, buffer[25])) >> 4; - /* 1 - stage 3 */ pcm_b += (MUL_16S_16S(-301, buffer[25])) << 5; - /* 1 - stage 3 */ pcm_a += (MUL_16S_16S(-12889, buffer[39])) << 2; - /* 1 - stage 3 */ pcm_b += (MUL_16S_16S(15447, buffer[39])) << 2; - /* 1 - stage 3 */ pcm_a += (MUL_16S_16S(6145, buffer[41])) << 3; - /* 1 - stage 3 */ pcm_b += (MUL_16S_16S(10255, buffer[41])) << 2; - /* 1 - stage 3 */ pcm_a += (MUL_16S_16S(24211, buffer[55])) >> 1; - /* 1 - stage 3 */ pcm_b += (MUL_16S_16S(-18233, buffer[55])) >> 3; - /* 1 - stage 3 */ pcm_a += (MUL_16S_16S(23469, buffer[57])) >> 2; - /* 1 - stage 3 */ pcm_b += (MUL_16S_16S(9405, buffer[57])) >> 1; - /* 1 - stage 3 */ pcm_a += (MUL_16S_16S(21223, buffer[71])) >> 8; - /* 1 - stage 3 */ pcm_b += (MUL_16S_16S(1499, buffer[71])) >> 1; - /* 1 - stage 3 */ pcm_a += (MUL_16S_16S(26913, buffer[73])) >> 6; - /* 1 - stage 3 */ pcm_b += (MUL_16S_16S(26189, buffer[73])) >> 7; - /* 1 - stage 3 */ pcm_a /= 32768; - CLIP_INT16(pcm_a); - pcm[3 << strideShift] = (OI_INT16)pcm_a; - /* 1 - stage 3 */ pcm_b /= 32768; - CLIP_INT16(pcm_b); - pcm[5 << strideShift] = (OI_INT16)pcm_b; - /* 1 - stage 4 */ pcm_a = 0; - /* 1 - stage 4 */ pcm_a += (MUL_16S_16S(10445, buffer[8])) >> 4; - /* 1 - stage 4 */ pcm_a += (MUL_16S_16S(-5297, buffer[24])) << 1; - /* 1 - stage 4 */ pcm_a += (MUL_16S_16S(22299, buffer[40])) << 2; - /* 1 - stage 4 */ pcm_a += (MUL_16S_16S(10603, buffer[56])); - /* 1 - stage 4 */ pcm_a += (MUL_16S_16S(9539, buffer[72])) >> 4; - /* 1 - stage 4 */ pcm_a /= 32768; - CLIP_INT16(pcm_a); - pcm[4 << strideShift] = (OI_INT16)pcm_a; -} - -#endif /* #if defined(SBC_DEC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/synthesis-dct8.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/synthesis-dct8.c deleted file mode 100644 index 4133ae5e..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/synthesis-dct8.c +++ /dev/null @@ -1,346 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -/** @file -@ingroup codec_internal -*/ - -/**@addgroup codec_internal*/ -/**@{*/ - -/* - * Performs an 8-point Type-II scaled DCT using the Arai-Agui-Nakajima - * factorization. The scaling factors are folded into the windowing - * constants. 29 adds and 5 16x32 multiplies per 8 samples. - */ -#include "oi_codec_sbc_private.h" - -#if defined(SBC_DEC_INCLUDED) - -#define AAN_C4_FIX (759250125) /* S1.30 759250125 0.707107*/ - -#define AAN_C6_FIX (410903207) /* S1.30 410903207 0.382683*/ - -#define AAN_Q0_FIX (581104888) /* S1.30 581104888 0.541196*/ - -#define AAN_Q1_FIX (1402911301) /* S1.30 1402911301 1.306563*/ - -/** Scales x by y bits to the right, adding a rounding factor. - */ -#ifndef SCALE -#define SCALE(x, y) (((x) + (1 << ((y)-1))) >> (y)) -#endif - -/** - * Default C language implementation of a 32x32->32 multiply. This function may - * be replaced by a platform-specific version for speed. - * - * @param u A signed 32-bit multiplicand - * @param v A signed 32-bit multiplier - - * @return A signed 32-bit value corresponding to the 32 most significant bits - * of the 64-bit product of u and v. - */ -static INLINE OI_INT32 default_mul_32s_32s_hi(OI_INT32 u, OI_INT32 v) { - OI_UINT32 u0, v0; - OI_INT32 u1, v1, w1, w2, t; - - u0 = u & 0xFFFF; - u1 = u >> 16; - v0 = v & 0xFFFF; - v1 = v >> 16; - t = u0 * v0; - t = u1 * v0 + ((OI_UINT32)t >> 16); - w1 = t & 0xFFFF; - w2 = t >> 16; - w1 = u0 * v1 + w1; - return u1 * v1 + w2 + (w1 >> 16); -} - -#define MUL_32S_32S_HI(_x, _y) default_mul_32s_32s_hi(_x, _y) - -#ifdef DEBUG_DCT -PRIVATE void float_dct2_8(float *RESTRICT out, OI_INT32 const *RESTRICT in) { -#define FIX(x, bits) (((int)floor(0.5f + ((x) * ((float)(1 << bits))))) / ((float)(1 << bits))) -#define FLOAT_BUTTERFLY(x, y) \ - x += y; \ - y = x - (y * 2); \ - OI_ASSERT(VALID_INT32(x)); \ - OI_ASSERT(VALID_INT32(y)); -#define FLOAT_MULT_DCT(K, sample) (FIX(K, 20) * sample) -#define FLOAT_SCALE(x, y) (((x) / (double)(1 << (y)))) - - double L00, L01, L02, L03, L04, L05, L06, L07; - double L25; - - double in0, in1, in2, in3; - double in4, in5, in6, in7; - - in0 = FLOAT_SCALE(in[0], DCTII_8_SHIFT_IN); - OI_ASSERT(VALID_INT32(in0)); - in1 = FLOAT_SCALE(in[1], DCTII_8_SHIFT_IN); - OI_ASSERT(VALID_INT32(in1)); - in2 = FLOAT_SCALE(in[2], DCTII_8_SHIFT_IN); - OI_ASSERT(VALID_INT32(in2)); - in3 = FLOAT_SCALE(in[3], DCTII_8_SHIFT_IN); - OI_ASSERT(VALID_INT32(in3)); - in4 = FLOAT_SCALE(in[4], DCTII_8_SHIFT_IN); - OI_ASSERT(VALID_INT32(in4)); - in5 = FLOAT_SCALE(in[5], DCTII_8_SHIFT_IN); - OI_ASSERT(VALID_INT32(in5)); - in6 = FLOAT_SCALE(in[6], DCTII_8_SHIFT_IN); - OI_ASSERT(VALID_INT32(in6)); - in7 = FLOAT_SCALE(in[7], DCTII_8_SHIFT_IN); - OI_ASSERT(VALID_INT32(in7)); - - L00 = (in0 + in7); - OI_ASSERT(VALID_INT32(L00)); - L01 = (in1 + in6); - OI_ASSERT(VALID_INT32(L01)); - L02 = (in2 + in5); - OI_ASSERT(VALID_INT32(L02)); - L03 = (in3 + in4); - OI_ASSERT(VALID_INT32(L03)); - - L04 = (in3 - in4); - OI_ASSERT(VALID_INT32(L04)); - L05 = (in2 - in5); - OI_ASSERT(VALID_INT32(L05)); - L06 = (in1 - in6); - OI_ASSERT(VALID_INT32(L06)); - L07 = (in0 - in7); - OI_ASSERT(VALID_INT32(L07)); - - FLOAT_BUTTERFLY(L00, L03); - FLOAT_BUTTERFLY(L01, L02); - - L02 += L03; - OI_ASSERT(VALID_INT32(L02)); - - L02 = FLOAT_MULT_DCT(AAN_C4_FLOAT, L02); - OI_ASSERT(VALID_INT32(L02)); - - FLOAT_BUTTERFLY(L00, L01); - - out[0] = (float)FLOAT_SCALE(L00, DCTII_8_SHIFT_0); - OI_ASSERT(VALID_INT16(out[0])); - out[4] = (float)FLOAT_SCALE(L01, DCTII_8_SHIFT_4); - OI_ASSERT(VALID_INT16(out[4])); - - FLOAT_BUTTERFLY(L03, L02); - out[6] = (float)FLOAT_SCALE(L02, DCTII_8_SHIFT_6); - OI_ASSERT(VALID_INT16(out[6])); - out[2] = (float)FLOAT_SCALE(L03, DCTII_8_SHIFT_2); - OI_ASSERT(VALID_INT16(out[2])); - - L04 += L05; - OI_ASSERT(VALID_INT32(L04)); - L05 += L06; - OI_ASSERT(VALID_INT32(L05)); - L06 += L07; - OI_ASSERT(VALID_INT32(L06)); - - L04 /= 2; - L05 /= 2; - L06 /= 2; - L07 /= 2; - - L05 = FLOAT_MULT_DCT(AAN_C4_FLOAT, L05); - OI_ASSERT(VALID_INT32(L05)); - - L25 = L06 - L04; - OI_ASSERT(VALID_INT32(L25)); - L25 = FLOAT_MULT_DCT(AAN_C6_FLOAT, L25); - OI_ASSERT(VALID_INT32(L25)); - - L04 = FLOAT_MULT_DCT(AAN_Q0_FLOAT, L04); - OI_ASSERT(VALID_INT32(L04)); - L04 -= L25; - OI_ASSERT(VALID_INT32(L04)); - - L06 = FLOAT_MULT_DCT(AAN_Q1_FLOAT, L06); - OI_ASSERT(VALID_INT32(L06)); - L06 -= L25; - OI_ASSERT(VALID_INT32(L25)); - - FLOAT_BUTTERFLY(L07, L05); - - FLOAT_BUTTERFLY(L05, L04); - out[3] = (float)(FLOAT_SCALE(L04, DCTII_8_SHIFT_3 - 1)); - OI_ASSERT(VALID_INT16(out[3])); - out[5] = (float)(FLOAT_SCALE(L05, DCTII_8_SHIFT_5 - 1)); - OI_ASSERT(VALID_INT16(out[5])); - - FLOAT_BUTTERFLY(L07, L06); - out[7] = (float)(FLOAT_SCALE(L06, DCTII_8_SHIFT_7 - 1)); - OI_ASSERT(VALID_INT16(out[7])); - out[1] = (float)(FLOAT_SCALE(L07, DCTII_8_SHIFT_1 - 1)); - OI_ASSERT(VALID_INT16(out[1])); -} -#undef BUTTERFLY -#endif - -/* - * This function calculates the AAN DCT. Its inputs are in S16.15 format, as - * returned by OI_SBC_Dequant. In practice, abs(in[x]) < 52429.0 / 1.38 - * (1244918057 integer). The function it computes is an approximation to the array defined - * by: - * - * diag(aan_s) * AAN= C2 - * - * or - * - * AAN = diag(1/aan_s) * C2 - * - * where C2 is as it is defined in the comment at the head of this file, and - * - * aan_s[i] = aan_s = 1/(2*cos(i*pi/16)) with i = 1..7, aan_s[0] = 1; - * - * aan_s[i] = [ 1.000 0.510 0.541 0.601 0.707 0.900 1.307 2.563 ] - * - * The output ranges are shown as follows: - * - * Let Y[0..7] = AAN * X[0..7] - * - * Without loss of generality, assume the input vector X consists of elements - * between -1 and 1. The maximum possible value of a given output element occurs - * with some particular combination of input vector elements each of which is -1 - * or 1. Consider the computation of Y[i]. Y[i] = sum t=0..7 of AAN[t,i]*X[i]. Y is - * maximized if the sign of X[i] matches the sign of AAN[t,i], ensuring a - * positive contribution to the sum. Equivalently, one may simply sum - * abs(AAN)[t,i] over t to get the maximum possible value of Y[i]. - * - * This yields approximately [8.00 10.05 9.66 8.52 8.00 5.70 4.00 2.00] - * - * Given the maximum magnitude sensible input value of +/-37992, this yields the - * following vector of maximum output magnitudes: - * - * [ 303936 381820 367003 323692 303936 216555 151968 75984 ] - * - * Ultimately, these values must fit into 16 bit signed integers, so they must - * be scaled. A non-uniform scaling helps maximize the kept precision. The - * relative number of extra bits of precision maintainable with respect to the - * largest value is given here: - * - * [ 0 0 0 0 0 0 1 2 ] - * - */ -PRIVATE void dct2_8(SBC_BUFFER_T *RESTRICT out, OI_INT32 const *RESTRICT in) { -#define BUTTERFLY(x, y) \ - x += y; \ - y = x - (y << 1); -#define FIX_MULT_DCT(K, x) (MUL_32S_32S_HI(K, x) << 2) - - OI_INT32 L00, L01, L02, L03, L04, L05, L06, L07; - OI_INT32 L25; - - OI_INT32 in0, in1, in2, in3; - OI_INT32 in4, in5, in6, in7; - -#if DCTII_8_SHIFT_IN != 0 - in0 = SCALE(in[0], DCTII_8_SHIFT_IN); - in1 = SCALE(in[1], DCTII_8_SHIFT_IN); - in2 = SCALE(in[2], DCTII_8_SHIFT_IN); - in3 = SCALE(in[3], DCTII_8_SHIFT_IN); - in4 = SCALE(in[4], DCTII_8_SHIFT_IN); - in5 = SCALE(in[5], DCTII_8_SHIFT_IN); - in6 = SCALE(in[6], DCTII_8_SHIFT_IN); - in7 = SCALE(in[7], DCTII_8_SHIFT_IN); -#else - in0 = in[0]; - in1 = in[1]; - in2 = in[2]; - in3 = in[3]; - in4 = in[4]; - in5 = in[5]; - in6 = in[6]; - in7 = in[7]; -#endif - - L00 = in0 + in7; - L01 = in1 + in6; - L02 = in2 + in5; - L03 = in3 + in4; - - L04 = in3 - in4; - L05 = in2 - in5; - L06 = in1 - in6; - L07 = in0 - in7; - - BUTTERFLY(L00, L03); - BUTTERFLY(L01, L02); - - L02 += L03; - - L02 = FIX_MULT_DCT(AAN_C4_FIX, L02); - - BUTTERFLY(L00, L01); - - out[0] = (OI_INT16)SCALE(L00, DCTII_8_SHIFT_0); - out[4] = (OI_INT16)SCALE(L01, DCTII_8_SHIFT_4); - - BUTTERFLY(L03, L02); - out[6] = (OI_INT16)SCALE(L02, DCTII_8_SHIFT_6); - out[2] = (OI_INT16)SCALE(L03, DCTII_8_SHIFT_2); - - L04 += L05; - L05 += L06; - L06 += L07; - - L04 /= 2; - L05 /= 2; - L06 /= 2; - L07 /= 2; - - L05 = FIX_MULT_DCT(AAN_C4_FIX, L05); - - L25 = L06 - L04; - L25 = FIX_MULT_DCT(AAN_C6_FIX, L25); - - L04 = FIX_MULT_DCT(AAN_Q0_FIX, L04); - L04 -= L25; - - L06 = FIX_MULT_DCT(AAN_Q1_FIX, L06); - L06 -= L25; - - BUTTERFLY(L07, L05); - - BUTTERFLY(L05, L04); - out[3] = (OI_INT16)SCALE(L04, DCTII_8_SHIFT_3 - 1); - out[5] = (OI_INT16)SCALE(L05, DCTII_8_SHIFT_5 - 1); - - BUTTERFLY(L07, L06); - out[7] = (OI_INT16)SCALE(L06, DCTII_8_SHIFT_7 - 1); - out[1] = (OI_INT16)SCALE(L07, DCTII_8_SHIFT_1 - 1); -#undef BUTTERFLY - -#ifdef DEBUG_DCT - { - float float_out[8]; - float_dct2_8(float_out, in); - } -#endif -} - -/**@}*/ -#endif /* #if defined(SBC_DEC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/synthesis-sbc.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/synthesis-sbc.c deleted file mode 100644 index f8926df5..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/dec/synthesis-sbc.c +++ /dev/null @@ -1,515 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2014 The Android Open Source Project - * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/********************************************************************************** - $Revision: #1 $ -***********************************************************************************/ - -/** @file - -This file, along with synthesis-generated.c, contains the synthesis -filterbank routines. The operations performed correspond to the -operations described in A2DP Appendix B, Figure 12.3. Several -mathematical optimizations are performed, particularly for the -8-subband case. - -One important optimization is to note that the "matrixing" operation -can be decomposed into the product of a type II discrete cosine kernel -and another, sparse matrix. - -According to Fig 12.3, in the 8-subband case, -@code - N[k][i] = cos((i+0.5)*(k+4)*pi/8), k = 0..15 and i = 0..7 -@endcode - -N can be factored as R * C2, where C2 is an 8-point type II discrete -cosine kernel given by -@code - C2[k][i] = cos((i+0.5)*k*pi/8)), k = 0..7 and i = 0..7 -@endcode - -R turns out to be a sparse 16x8 matrix with the following non-zero -entries: -@code - R[k][k+4] = 1, k = 0..3 - R[k][abs(12-k)] = -1, k = 5..15 -@endcode - -The spec describes computing V[0..15] as N * R. -@code - V[0..15] = N * R = (R * C2) * R = R * (C2 * R) -@endcode - -C2 * R corresponds to computing the discrete cosine transform of R, so -V[0..15] can be computed by taking the DCT of R followed by assignment -and selective negation of the DCT result into V. - - Although this was derived empirically using GNU Octave, it is - formally demonstrated in, e.g., Liu, Chi-Min and Lee, - Wen-Chieh. "A Unified Fast Algorithm for Cosine Modulated - Filter Banks in Current Audio Coding Standards." Journal of - the AES 47 (December 1999): 1061. - -Given the shift operation performed prior to computing V[0..15], it is -clear that V[0..159] represents a rolling history of the 10 most -recent groups of blocks input to the synthesis operation. Interpreting -the matrix N in light of its factorization into C2 and R, R's -sparseness has implications for interpreting the values in V. In -particular, there is considerable redundancy in the values stored in -V. Furthermore, since R[4][0..7] are all zeros, one out of every 16 -values in V will be zero regardless of the input data. Within each -block of 16 values in V, fully half of them are redundant or -irrelevant: - -@code - V[ 0] = DCT[4] - V[ 1] = DCT[5] - V[ 2] = DCT[6] - V[ 3] = DCT[7] - V[ 4] = 0 - V[ 5] = -DCT[7] = -V[3] (redundant) - V[ 6] = -DCT[6] = -V[2] (redundant) - V[ 7] = -DCT[5] = -V[1] (redundant) - V[ 8] = -DCT[4] = -V[0] (redundant) - V[ 9] = -DCT[3] - V[10] = -DCT[2] - V[11] = -DCT[1] - V[12] = -DCT[0] - V[13] = -DCT[1] = V[11] (redundant) - V[14] = -DCT[2] = V[10] (redundant) - V[15] = -DCT[3] = V[ 9] (redundant) -@endcode - -Since the elements of V beyond 15 were originally computed the same -way during a previous run, what holds true for V[x] also holds true -for V[x+16]. Thus, so long as care is taken to maintain the mapping, -we need only actually store the unique values, which correspond to the -output of the DCT, in some cases inverted. In fact, instead of storing -V[0..159], we could store DCT[0..79] which would contain a history of -DCT results. More on this in a bit. - -Going back to figure 12.3 in the spec, it should be clear that the -vector U need not actually be explicitly constructed, but that with -suitable indexing into V during the window operation, the same end can -be accomplished. In the same spirit of the pseudocode shown in the -figure, the following is the construction of W without using U: - -@code - for i=0 to 79 do - W[i] = D[i]*VSIGN(i)*V[remap_V(i)] where remap_V(i) = 32*(int(i/16)) + (i % 16) + (i % 16 >= 8 ? 16 : 0) - and VSIGN(i) maps i%16 into {1, 1, 1, 1, 0, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1 } - These values correspond to the - signs of the redundant values as - shown in the explanation three - paragraphs above. -@endcode - -We saw above how V[4..8,13..15] (and by extension -V[(4..8,13..15)+16*n]) can be defined in terms of other elements -within the subblock of V. V[0..3,9..12] correspond to DCT elements. - -@code - for i=0 to 79 do - W[i] = D[i]*DSIGN(i)*DCT[remap_DCT(i)] -@endcode - -The DCT is calculated using the Arai-Agui-Nakajima factorization, -which saves some computation by producing output that needs to be -multiplied by scaling factors before being used. - -@code - for i=0 to 79 do - W[i] = D[i]*SCALE[i%8]*AAN_DCT[remap_DCT(i)] -@endcode - -D can be premultiplied with the DCT scaling factors to yield - -@code - for i=0 to 79 do - W[i] = DSCALED[i]*AAN_DCT[remap_DCT(i)] where DSCALED[i] = D[i]*SCALE[i%8] -@endcode - -The output samples X[0..7] are defined as sums of W: - -@code - X[j] = sum{i=0..9}(W[j+8*i]) -@endcode - -@ingroup codec_internal -*/ - -/** -@addtogroup codec_internal -@{ -*/ -#include "oi_codec_sbc_private.h" - -#if defined(SBC_DEC_INCLUDED) - -const OI_INT32 dec_window_4[21] = { - 0, /* +0.00000000E+00 */ - 97, /* +5.36548976E-04 */ - 270, /* +1.49188357E-03 */ - 495, /* +2.73370904E-03 */ - 694, /* +3.83720193E-03 */ - 704, /* +3.89205149E-03 */ - 338, /* +1.86581691E-03 */ - -554, /* -3.06012286E-03 */ - 1974, /* +1.09137620E-02 */ - 3697, /* +2.04385087E-02 */ - 5224, /* +2.88757392E-02 */ - 5824, /* +3.21939290E-02 */ - 4681, /* +2.58767811E-02 */ - 1109, /* +6.13245186E-03 */ - -5214, /* -2.88217274E-02 */ - -14047, /* -7.76463494E-02 */ - 24529, /* +1.35593274E-01 */ - 35274, /* +1.94987841E-01 */ - 44618, /* +2.46636662E-01 */ - 50984, /* +2.81828203E-01 */ - 53243, /* +2.94315332E-01 */ -}; - -#define DCTII_4_K06_FIX (11585) /* S1.14 11585 0.707107*/ - -#define DCTII_4_K08_FIX (21407) /* S1.14 21407 1.306563*/ - -#define DCTII_4_K09_FIX (-15137) /* S1.14 -15137 -0.923880*/ - -#define DCTII_4_K10_FIX (-8867) /* S1.14 -8867 -0.541196*/ - -/** Scales x by y bits to the right, adding a rounding factor. - */ -#ifndef SCALE -#define SCALE(x, y) (((x) + (1 << ((y)-1))) >> (y)) -#endif - -#ifndef CLIP_INT16 -#define CLIP_INT16(x) \ - do { \ - if (x > OI_INT16_MAX) { \ - x = OI_INT16_MAX; \ - } else if (x < OI_INT16_MIN) { \ - x = OI_INT16_MIN; \ - } \ - } while (0) -#endif - -/** - * Default C language implementation of a 16x32->32 multiply. This function may - * be replaced by a platform-specific version for speed. - * - * @param u A signed 16-bit multiplicand - * @param v A signed 32-bit multiplier - - * @return A signed 32-bit value corresponding to the 32 most significant bits - * of the 48-bit product of u and v. - */ -static INLINE OI_INT32 default_mul_16s_32s_hi(OI_INT16 u, OI_INT32 v) { - OI_UINT16 v0; - OI_INT16 v1; - - OI_INT32 w, x; - - v0 = (OI_UINT16)(v & 0xffff); - v1 = (OI_INT16)(v >> 16); - - w = v1 * u; - x = u * v0; - - return w + (x >> 16); -} - -#define MUL_16S_32S_HI(_x, _y) default_mul_16s_32s_hi(_x, _y) - -#define LONG_MULT_DCT(K, sample) (MUL_16S_32S_HI(K, sample) << 2) - -PRIVATE void SynthWindow80_generated(OI_INT16 *pcm, SBC_BUFFER_T const *RESTRICT buffer, OI_UINT strideShift); -PRIVATE void SynthWindow112_generated(OI_INT16 *pcm, SBC_BUFFER_T const *RESTRICT buffer, OI_UINT strideShift); -PRIVATE void dct2_8(SBC_BUFFER_T *RESTRICT out, OI_INT32 const *RESTRICT x); - -typedef void (*SYNTH_FRAME)(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount); - -#ifndef COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS -#define COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(dest, src) \ - do { \ - shift_buffer(dest, src, 72); \ - } while (0) -#endif - -#ifndef DCT2_8 -#define DCT2_8(dst, src) dct2_8(dst, src) -#endif - -#ifndef SYNTH80 -#define SYNTH80 SynthWindow80_generated -#endif - -#ifndef SYNTH112 -#define SYNTH112 SynthWindow112_generated -#endif - -PRIVATE void OI_SBC_SynthFrame_80(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount) { - OI_UINT blk; - OI_UINT ch; - OI_UINT nrof_channels = context->common.frameInfo.nrof_channels; - OI_UINT pcmStrideShift = context->common.pcmStride == 1 ? 0 : 1; - OI_UINT offset = context->common.filterBufferOffset; - OI_INT32 *s = context->common.subdata + 8 * nrof_channels * blkstart; - OI_UINT blkstop = blkstart + blkcount; - - for (blk = blkstart; blk < blkstop; blk++) { - if (offset == 0) { - COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[0] + context->common.filterBufferLen - 72, context->common.filterBuffer[0]); - if (nrof_channels == 2) { - COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[1] + context->common.filterBufferLen - 72, context->common.filterBuffer[1]); - } - offset = context->common.filterBufferLen - 80; - } else { - offset -= 1 * 8; - } - - for (ch = 0; ch < nrof_channels; ch++) { - DCT2_8(context->common.filterBuffer[ch] + offset, s); - SYNTH80(pcm + ch, context->common.filterBuffer[ch] + offset, pcmStrideShift); - s += 8; - } - pcm += (8 << pcmStrideShift); - } - context->common.filterBufferOffset = offset; -} - -PRIVATE void OI_SBC_SynthFrame_4SB(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount) { - OI_UINT blk; - OI_UINT ch; - OI_UINT nrof_channels = context->common.frameInfo.nrof_channels; - OI_UINT pcmStrideShift = context->common.pcmStride == 1 ? 0 : 1; - OI_UINT offset = context->common.filterBufferOffset; - OI_INT32 *s = context->common.subdata + 8 * nrof_channels * blkstart; - OI_UINT blkstop = blkstart + blkcount; - - for (blk = blkstart; blk < blkstop; blk++) { - if (offset == 0) { - COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[0] + context->common.filterBufferLen - 72, context->common.filterBuffer[0]); - if (nrof_channels == 2) { - COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[1] + context->common.filterBufferLen - 72, context->common.filterBuffer[1]); - } - offset = context->common.filterBufferLen - 80; - } else { - offset -= 8; - } - for (ch = 0; ch < nrof_channels; ch++) { - cosineModulateSynth4(context->common.filterBuffer[ch] + offset, s); - SynthWindow40_int32_int32_symmetry_with_sum(pcm + ch, context->common.filterBuffer[ch] + offset, pcmStrideShift); - s += 4; - } - pcm += (4 << pcmStrideShift); - } - context->common.filterBufferOffset = offset; -} - -#ifdef SBC_ENHANCED - -PRIVATE void OI_SBC_SynthFrame_Enhanced(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount) { - OI_UINT blk; - OI_UINT ch; - OI_UINT nrof_channels = context->common.frameInfo.nrof_channels; - OI_UINT pcmStrideShift = context->common.pcmStride == 1 ? 0 : 1; - OI_UINT offset = context->common.filterBufferOffset; - OI_INT32 *s = context->common.subdata + 8 * nrof_channels * blkstart; - OI_UINT blkstop = blkstart + blkcount; - - for (blk = blkstart; blk < blkstop; blk++) { - if (offset == 0) { - COPY_BACKWARD_32BIT_ALIGNED_104_HALFWORDS(context->common.filterBuffer[0] + context->common.filterBufferLen - 104, context->common.filterBuffer[0]); - if (nrof_channels == 2) { - COPY_BACKWARD_32BIT_ALIGNED_104_HALFWORDS(context->common.filterBuffer[1] + context->common.filterBufferLen - 104, context->common.filterBuffer[1]); - } - offset = context->common.filterBufferLen - 112; - } else { - offset -= 8; - } - for (ch = 0; ch < nrof_channels; ++ch) { - DCT2_8(context->common.filterBuffer[ch] + offset, s); - SYNTH112(pcm + ch, context->common.filterBuffer[ch] + offset, pcmStrideShift); - s += 8; - } - pcm += (8 << pcmStrideShift); - } - context->common.filterBufferOffset = offset; -} - -static const SYNTH_FRAME SynthFrameEnhanced[] = { - NULL, /* invalid */ - OI_SBC_SynthFrame_Enhanced, /* mono */ - OI_SBC_SynthFrame_Enhanced /* stereo */ -}; - -#endif - -static const SYNTH_FRAME SynthFrame8SB[] = { - NULL, /* invalid */ - OI_SBC_SynthFrame_80, /* mono */ - OI_SBC_SynthFrame_80 /* stereo */ -}; - -static const SYNTH_FRAME SynthFrame4SB[] = { - NULL, /* invalid */ - OI_SBC_SynthFrame_4SB, /* mono */ - OI_SBC_SynthFrame_4SB /* stereo */ -}; - -PRIVATE void OI_SBC_SynthFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT start_block, OI_UINT nrof_blocks) { - OI_UINT nrof_subbands = context->common.frameInfo.nrof_subbands; - OI_UINT nrof_channels = context->common.frameInfo.nrof_channels; - - OI_ASSERT(nrof_subbands == 4 || nrof_subbands == 8); - if (nrof_subbands == 4) { - SynthFrame4SB[nrof_channels](context, pcm, start_block, nrof_blocks); -#ifdef SBC_ENHANCED - } else if (context->common.frameInfo.enhanced) { - SynthFrameEnhanced[nrof_channels](context, pcm, start_block, nrof_blocks); -#endif /* SBC_ENHANCED */ - } else { - SynthFrame8SB[nrof_channels](context, pcm, start_block, nrof_blocks); - } -} - -void SynthWindow40_int32_int32_symmetry_with_sum(OI_INT16 *pcm, SBC_BUFFER_T buffer[80], OI_UINT strideShift) { - OI_INT32 pa; - OI_INT32 pb; - - /* These values should be zero, since out[2] of the 4-band cosine modulation - * is always zero. */ - OI_ASSERT(buffer[2] == 0); - OI_ASSERT(buffer[10] == 0); - OI_ASSERT(buffer[18] == 0); - OI_ASSERT(buffer[26] == 0); - OI_ASSERT(buffer[34] == 0); - OI_ASSERT(buffer[42] == 0); - OI_ASSERT(buffer[50] == 0); - OI_ASSERT(buffer[58] == 0); - OI_ASSERT(buffer[66] == 0); - OI_ASSERT(buffer[74] == 0); - - pa = dec_window_4[4] * (buffer[12] + buffer[76]); - pa += dec_window_4[8] * (buffer[16] - buffer[64]); - pa += dec_window_4[12] * (buffer[28] + buffer[60]); - pa += dec_window_4[16] * (buffer[32] - buffer[48]); - pa += dec_window_4[20] * buffer[44]; - pa = SCALE(-pa, 15); - CLIP_INT16(pa); - pcm[0 << strideShift] = (OI_INT16)pa; - - pa = dec_window_4[1] * buffer[1]; - pb = dec_window_4[1] * buffer[79]; - pb += dec_window_4[3] * buffer[3]; - pa += dec_window_4[3] * buffer[77]; - pa += dec_window_4[5] * buffer[13]; - pb += dec_window_4[5] * buffer[67]; - pb += dec_window_4[7] * buffer[15]; - pa += dec_window_4[7] * buffer[65]; - pa += dec_window_4[9] * buffer[17]; - pb += dec_window_4[9] * buffer[63]; - pb += dec_window_4[11] * buffer[19]; - pa += dec_window_4[11] * buffer[61]; - pa += dec_window_4[13] * buffer[29]; - pb += dec_window_4[13] * buffer[51]; - pb += dec_window_4[15] * buffer[31]; - pa += dec_window_4[15] * buffer[49]; - pa += dec_window_4[17] * buffer[33]; - pb += dec_window_4[17] * buffer[47]; - pb += dec_window_4[19] * buffer[35]; - pa += dec_window_4[19] * buffer[45]; - pa = SCALE(-pa, 15); - CLIP_INT16(pa); - pcm[1 << strideShift] = (OI_INT16)(pa); - pb = SCALE(-pb, 15); - CLIP_INT16(pb); - pcm[3 << strideShift] = (OI_INT16)(pb); - - pa = dec_window_4[2] * (/*buffer[ 2] + */ buffer[78]); /* buffer[ 2] is always zero */ - pa += dec_window_4[6] * (buffer[14] /* + buffer[66]*/); /* buffer[66] is always zero */ - pa += dec_window_4[10] * (/*buffer[18] + */ buffer[62]); /* buffer[18] is always zero */ - pa += dec_window_4[14] * (buffer[30] /* + buffer[50]*/); /* buffer[50] is always zero */ - pa += dec_window_4[18] * (/*buffer[34] + */ buffer[46]); /* buffer[34] is always zero */ - pa = SCALE(-pa, 15); - CLIP_INT16(pa); - pcm[2 << strideShift] = (OI_INT16)(pa); -} - -/** - This routine implements the cosine modulation matrix for 4-subband - synthesis. This is called "matrixing" in the SBC specification. This - matrix, M4, can be factored into an 8-point Type II Discrete Cosine - Transform, DCTII_4 and a matrix S4, given here: - - @code - __ __ - | 0 0 1 0 | - | 0 0 0 1 | - | 0 0 0 0 | - | 0 0 0 -1 | - S4 = | 0 0 -1 0 | - | 0 -1 0 0 | - | -1 0 0 0 | - |__ 0 -1 0 0 __| - - M4 * in = S4 * (DCTII_4 * in) - @endcode - - (DCTII_4 * in) is computed using a Fast Cosine Transform. The algorithm - here is based on an implementation computed by the SPIRAL computer - algebra system, manually converted to fixed-point arithmetic. S4 can be - implemented using only assignment and negation. - */ -PRIVATE void cosineModulateSynth4(SBC_BUFFER_T *RESTRICT out, OI_INT32 const *RESTRICT in) { - OI_INT32 f0, f1, f2, f3, f4, f7, f8, f9, f10; - OI_INT32 y0, y1, y2, y3; - - f0 = (in[0] - in[3]); - f1 = (in[0] + in[3]); - f2 = (in[1] - in[2]); - f3 = (in[1] + in[2]); - - f4 = f1 - f3; - - y0 = -SCALE(f1 + f3, DCT_SHIFT); - y2 = -SCALE(LONG_MULT_DCT(DCTII_4_K06_FIX, f4), DCT_SHIFT); - f7 = f0 + f2; - f8 = LONG_MULT_DCT(DCTII_4_K08_FIX, f0); - f9 = LONG_MULT_DCT(DCTII_4_K09_FIX, f7); - f10 = LONG_MULT_DCT(DCTII_4_K10_FIX, f2); - y3 = -SCALE(f8 + f9, DCT_SHIFT); - y1 = -SCALE(f10 - f9, DCT_SHIFT); - - out[0] = (OI_INT16)-y2; - out[1] = (OI_INT16)-y3; - out[2] = (OI_INT16)0; - out[3] = (OI_INT16)y3; - out[4] = (OI_INT16)y2; - out[5] = (OI_INT16)y1; - out[6] = (OI_INT16)y0; - out[7] = (OI_INT16)y1; -} - -/** -@} -*/ -#endif /* #if defined(SBC_DEC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_analysis.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_analysis.c deleted file mode 100644 index 40a079ae..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_analysis.c +++ /dev/null @@ -1,1155 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1999-2012 Broadcom Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/****************************************************************************** - * - * This file contains the code that performs Analysis of the input audio - * stream. - * - ******************************************************************************/ -#include "sbc_enc_func_declare.h" -#include "sbc_encoder.h" -#include -#include -// #include "osi/allocator.h" -/*#include */ -#if defined(SBC_ENC_INCLUDED) - -#if (SBC_IS_64_MULT_IN_WINDOW_ACCU == TRUE) -#define WIND_4_SUBBANDS_0_1 (SINT32)0x01659F45 /* gas32CoeffFor4SBs[8] = -gas32CoeffFor4SBs[32] = 0x01659F45 */ -#define WIND_4_SUBBANDS_0_2 (SINT32)0x115B1ED2 /* gas32CoeffFor4SBs[16] = -gas32CoeffFor4SBs[24] = 0x115B1ED2 */ -#define WIND_4_SUBBANDS_1_0 (SINT32)0x001194E6 /* gas32CoeffFor4SBs[1 et 39] = 0x001194E6 */ -#define WIND_4_SUBBANDS_1_1 (SINT32)0x029DBAA3 /* gas32CoeffFor4SBs[9 et 31] = 0x029DBAA3 */ -#define WIND_4_SUBBANDS_1_2 (SINT32)0x18F55C90 /* gas32CoeffFor4SBs[17 et 23] = 0x18F55C90 */ -#define WIND_4_SUBBANDS_1_3 (SINT32)0xF60FAF37 /* gas32CoeffFor4SBs[15 et 25] = 0xF60FAF37 */ -#define WIND_4_SUBBANDS_1_4 (SINT32)0xFF9BB9D5 /* gas32CoeffFor4SBs[7 et 33] = 0xFF9BB9D5 */ -#define WIND_4_SUBBANDS_2_0 (SINT32)0x0030E2D3 /* gas32CoeffFor4SBs[2 et 38] = 0x0030E2D3 */ -#define WIND_4_SUBBANDS_2_1 (SINT32)0x03B23341 /* gas32CoeffFor4SBs[10 et 30] = 0x03B23341 */ -#define WIND_4_SUBBANDS_2_2 (SINT32)0x1F91CA46 /* gas32CoeffFor4SBs[18 et 22] = 0x1F91CA46 */ -#define WIND_4_SUBBANDS_2_3 (SINT32)0xFC4F91D4 /* gas32CoeffFor4SBs[14 et 26] = 0xFC4F91D4 */ -#define WIND_4_SUBBANDS_2_4 (SINT32)0x003D239B /* gas32CoeffFor4SBs[6 et 34] = 0x003D239B */ -#define WIND_4_SUBBANDS_3_0 (SINT32)0x00599403 /* gas32CoeffFor4SBs[3 et 37] = 0x00599403 */ -#define WIND_4_SUBBANDS_3_1 (SINT32)0x041EEE40 /* gas32CoeffFor4SBs[11 et 29] = 0x041EEE40 */ -#define WIND_4_SUBBANDS_3_2 (SINT32)0x2412F251 /* gas32CoeffFor4SBs[19 et 21] = 0x2412F251 */ -#define WIND_4_SUBBANDS_3_3 (SINT32)0x00C8F2BC /* gas32CoeffFor4SBs[13 et 27] = 0x00C8F2BC */ -#define WIND_4_SUBBANDS_3_4 (SINT32)0x007F88E4 /* gas32CoeffFor4SBs[5 et 35] = 0x007F88E4 */ -#define WIND_4_SUBBANDS_4_0 (SINT32)0x007DBCC8 /* gas32CoeffFor4SBs[4 et 36] = 0x007DBCC8 */ -#define WIND_4_SUBBANDS_4_1 (SINT32)0x034FEE2C /* gas32CoeffFor4SBs[12 et 28] = 0x034FEE2C */ -#define WIND_4_SUBBANDS_4_2 (SINT32)0x25AC1FF2 /* gas32CoeffFor4SBs[20] = 0x25AC1FF2 */ - -#define WIND_8_SUBBANDS_0_1 (SINT32)0x00B97348 /* 16 0x00B97348 */ -#define WIND_8_SUBBANDS_0_2 (SINT32)0x08B4307A /* 32 0x08B4307A */ -#define WIND_8_SUBBANDS_1_0 (SINT32)0x00052173 /* 1 et 79 = 0x00052173 */ -#define WIND_8_SUBBANDS_1_1 (SINT32)0x01071B96 /* 17 et 63 = 0x01071B96 */ -#define WIND_8_SUBBANDS_1_2 (SINT32)0x0A9F3E9A /* 33 et 47 = 0x0A9F3E9A*/ -#define WIND_8_SUBBANDS_1_3 (SINT32)0xF9312891 /* 31 et 49 = 0xF9312891 */ -#define WIND_8_SUBBANDS_1_4 (SINT32)0xFF8D6793 /* 15 et 65 = 0xFF8D6793 */ -#define WIND_8_SUBBANDS_2_0 (SINT32)0x000B3F71 /* 2 et 78 = 0x000B3F71 */ -#define WIND_8_SUBBANDS_2_1 (SINT32)0x0156B3CA /* 18 et 62 = 0x0156B3CA */ -#define WIND_8_SUBBANDS_2_2 (SINT32)0x0C7D59B6 /* 34 et 46 = 0x0C7D59B6 */ -#define WIND_8_SUBBANDS_2_3 (SINT32)0xFAFF95FC /* 30 et 50 = 0xFAFF95FC */ -#define WIND_8_SUBBANDS_2_4 (SINT32)0xFFC9F10E /* 14 et 66 = 0xFFC9F10E */ -#define WIND_8_SUBBANDS_3_0 (SINT32)0x00122C7D /* 3 et 77 = 0x00122C7D*/ -#define WIND_8_SUBBANDS_3_1 (SINT32)0x01A1B38B /* 19 et 61 = 0x01A1B38B */ -#define WIND_8_SUBBANDS_3_2 (SINT32)0x0E3BB16F /* 35 et 45 = 0x0E3BB16F */ -#define WIND_8_SUBBANDS_3_3 (SINT32)0xFCA86E7E /* 29 et 51 = 0xFCA86E7E */ -#define WIND_8_SUBBANDS_3_4 (SINT32)0xFFFA2413 /* 13 et 67 = 0xFFFA2413 */ -#define WIND_8_SUBBANDS_4_0 (SINT32)0x001AFF89 /* 4 et 66 = 0x001AFF89 */ -#define WIND_8_SUBBANDS_4_1 (SINT32)0x01E0224C /* 20 et 60 = 0x01E0224C */ -#define WIND_8_SUBBANDS_4_2 (SINT32)0x0FC721F9 /* 36 et 44 = 0x0FC721F9 */ -#define WIND_8_SUBBANDS_4_3 (SINT32)0xFE20435D /* 28 et 52 = 0xFE20435D */ -#define WIND_8_SUBBANDS_4_4 (SINT32)0x001D8FD2 /* 12 et 68 = 0x001D8FD2 */ -#define WIND_8_SUBBANDS_5_0 (SINT32)0x00255A62 /* 5 et 75 = 0x00255A62 */ -#define WIND_8_SUBBANDS_5_1 (SINT32)0x0209291F /* 21 et 59 = 0x0209291F */ -#define WIND_8_SUBBANDS_5_2 (SINT32)0x110ECEF0 /* 37 et 43 = 0x110ECEF0 */ -#define WIND_8_SUBBANDS_5_3 (SINT32)0xFF5EEB73 /* 27 et 53 = 0xFF5EEB73 */ -#define WIND_8_SUBBANDS_5_4 (SINT32)0x0034F8B6 /* 11 et 69 = 0x0034F8B6 */ -#define WIND_8_SUBBANDS_6_0 (SINT32)0x003060F4 /* 6 et 74 = 0x003060F4 */ -#define WIND_8_SUBBANDS_6_1 (SINT32)0x02138653 /* 22 et 58 = 0x02138653 */ -#define WIND_8_SUBBANDS_6_2 (SINT32)0x120435FA /* 38 et 42 = 0x120435FA */ -#define WIND_8_SUBBANDS_6_3 (SINT32)0x005FD0FF /* 26 et 54 = 0x005FD0FF */ -#define WIND_8_SUBBANDS_6_4 (SINT32)0x00415B75 /* 10 et 70 = 0x00415B75 */ -#define WIND_8_SUBBANDS_7_0 (SINT32)0x003A72E7 /* 7 et 73 = 0x003A72E7 */ -#define WIND_8_SUBBANDS_7_1 (SINT32)0x01F5F424 /* 23 et 57 = 0x01F5F424 */ -#define WIND_8_SUBBANDS_7_2 (SINT32)0x129C226F /* 39 et 41 = 0x129C226F */ -#define WIND_8_SUBBANDS_7_3 (SINT32)0x01223EBA /* 25 et 55 = 0x01223EBA */ -#define WIND_8_SUBBANDS_7_4 (SINT32)0x0044EF48 /* 9 et 71 = 0x0044EF48 */ -#define WIND_8_SUBBANDS_8_0 (SINT32)0x0041EC6A /* 8 et 72 = 0x0041EC6A */ -#define WIND_8_SUBBANDS_8_1 (SINT32)0x01A7ECEF /* 24 et 56 = 0x01A7ECEF */ -#define WIND_8_SUBBANDS_8_2 (SINT32)0x12CF6C75 /* 40 = 0x12CF6C75 */ -#else -#define WIND_4_SUBBANDS_0_1 (SINT16)0x0166 /* gas32CoeffFor4SBs[8] = -gas32CoeffFor4SBs[32] = 0x01659F45 */ -#define WIND_4_SUBBANDS_0_2 (SINT16)0x115B /* gas32CoeffFor4SBs[16] = -gas32CoeffFor4SBs[24] = 0x115B1ED2 */ -#define WIND_4_SUBBANDS_1_0 (SINT16)0x0012 /* gas32CoeffFor4SBs[1 et 39] = 0x001194E6 */ -#define WIND_4_SUBBANDS_1_1 (SINT16)0x029E /* gas32CoeffFor4SBs[9 et 31] = 0x029DBAA3 */ -#define WIND_4_SUBBANDS_1_2 (SINT16)0x18F5 /* gas32CoeffFor4SBs[17 et 23] = 0x18F55C90 */ -#define WIND_4_SUBBANDS_1_3 (SINT16)0xF610 /* gas32CoeffFor4SBs[15 et 25] = 0xF60FAF37 */ -#define WIND_4_SUBBANDS_1_4 (SINT16)0xFF9C /* gas32CoeffFor4SBs[7 et 33] = 0xFF9BB9D5 */ -#define WIND_4_SUBBANDS_2_0 (SINT16)0x0031 /* gas32CoeffFor4SBs[2 et 38] = 0x0030E2D3 */ -#define WIND_4_SUBBANDS_2_1 (SINT16)0x03B2 /* gas32CoeffFor4SBs[10 et 30] = 0x03B23341 */ -#define WIND_4_SUBBANDS_2_2 (SINT16)0x1F91 /* gas32CoeffFor4SBs[18 et 22] = 0x1F91CA46 */ -#define WIND_4_SUBBANDS_2_3 (SINT16)0xFC50 /* gas32CoeffFor4SBs[14 et 26] = 0xFC4F91D4 */ -#define WIND_4_SUBBANDS_2_4 (SINT16)0x003D /* gas32CoeffFor4SBs[6 et 34] = 0x003D239B */ -#define WIND_4_SUBBANDS_3_0 (SINT16)0x005A /* gas32CoeffFor4SBs[3 et 37] = 0x00599403 */ -#define WIND_4_SUBBANDS_3_1 (SINT16)0x041F /* gas32CoeffFor4SBs[11 et 29] = 0x041EEE40 */ -#define WIND_4_SUBBANDS_3_2 (SINT16)0x2413 /* gas32CoeffFor4SBs[19 et 21] = 0x2412F251 */ -#define WIND_4_SUBBANDS_3_3 (SINT16)0x00C9 /* gas32CoeffFor4SBs[13 et 27] = 0x00C8F2BC */ -#define WIND_4_SUBBANDS_3_4 (SINT16)0x0080 /* gas32CoeffFor4SBs[5 et 35] = 0x007F88E4 */ -#define WIND_4_SUBBANDS_4_0 (SINT16)0x007E /* gas32CoeffFor4SBs[4 et 36] = 0x007DBCC8 */ -#define WIND_4_SUBBANDS_4_1 (SINT16)0x0350 /* gas32CoeffFor4SBs[12 et 28] = 0x034FEE2C */ -#define WIND_4_SUBBANDS_4_2 (SINT16)0x25AC /* gas32CoeffFor4SBs[20] = 25AC1FF2 */ - -#define WIND_8_SUBBANDS_0_1 (SINT16)0x00B9 /* 16 0x12CF6C75 */ -#define WIND_8_SUBBANDS_0_2 (SINT16)0x08B4 /* 32 0x08B4307A */ -#define WIND_8_SUBBANDS_1_0 (SINT16)0x0005 /* 1 et 79 = 0x00052173 */ -#define WIND_8_SUBBANDS_1_1 (SINT16)0x0107 /* 17 et 63 = 0x01071B96 */ -#define WIND_8_SUBBANDS_1_2 (SINT16)0x0A9F /* 33 et 47 = 0x0A9F3E9A*/ -#define WIND_8_SUBBANDS_1_3 (SINT16)0xF931 /* 31 et 49 = 0xF9312891 */ -#define WIND_8_SUBBANDS_1_4 (SINT16)0xFF8D /* 15 et 65 = 0xFF8D6793 */ -#define WIND_8_SUBBANDS_2_0 (SINT16)0x000B /* 2 et 78 = 0x000B3F71 */ -#define WIND_8_SUBBANDS_2_1 (SINT16)0x0157 /* 18 et 62 = 0x0156B3CA */ -#define WIND_8_SUBBANDS_2_2 (SINT16)0x0C7D /* 34 et 46 = 0x0C7D59B6 */ -#define WIND_8_SUBBANDS_2_3 (SINT16)0xFB00 /* 30 et 50 = 0xFAFF95FC */ -#define WIND_8_SUBBANDS_2_4 (SINT16)0xFFCA /* 14 et 66 = 0xFFC9F10E */ -#define WIND_8_SUBBANDS_3_0 (SINT16)0x0012 /* 3 et 77 = 0x00122C7D*/ -#define WIND_8_SUBBANDS_3_1 (SINT16)0x01A2 /* 19 et 61 = 0x01A1B38B */ -#define WIND_8_SUBBANDS_3_2 (SINT16)0x0E3C /* 35 et 45 = 0x0E3BB16F */ -#define WIND_8_SUBBANDS_3_3 (SINT16)0xFCA8 /* 29 et 51 = 0xFCA86E7E */ -#define WIND_8_SUBBANDS_3_4 (SINT16)0xFFFA /* 13 et 67 = 0xFFFA2413 */ -#define WIND_8_SUBBANDS_4_0 (SINT16)0x001B /* 4 et 66 = 0x001AFF89 */ -#define WIND_8_SUBBANDS_4_1 (SINT16)0x01E0 /* 20 et 60 = 0x01E0224C */ -#define WIND_8_SUBBANDS_4_2 (SINT16)0x0FC7 /* 36 et 44 = 0x0FC721F9 */ -#define WIND_8_SUBBANDS_4_3 (SINT16)0xFE20 /* 28 et 52 = 0xFE20435D */ -#define WIND_8_SUBBANDS_4_4 (SINT16)0x001E /* 12 et 68 = 0x001D8FD2 */ -#define WIND_8_SUBBANDS_5_0 (SINT16)0x0025 /* 5 et 75 = 0x00255A62 */ -#define WIND_8_SUBBANDS_5_1 (SINT16)0x0209 /* 21 et 59 = 0x0209291F */ -#define WIND_8_SUBBANDS_5_2 (SINT16)0x110F /* 37 et 43 = 0x110ECEF0 */ -#define WIND_8_SUBBANDS_5_3 (SINT16)0xFF5F /* 27 et 53 = 0xFF5EEB73 */ -#define WIND_8_SUBBANDS_5_4 (SINT16)0x0035 /* 11 et 69 = 0x0034F8B6 */ -#define WIND_8_SUBBANDS_6_0 (SINT16)0x0030 /* 6 et 74 = 0x003060F4 */ -#define WIND_8_SUBBANDS_6_1 (SINT16)0x0214 /* 22 et 58 = 0x02138653 */ -#define WIND_8_SUBBANDS_6_2 (SINT16)0x1204 /* 38 et 42 = 0x120435FA */ -#define WIND_8_SUBBANDS_6_3 (SINT16)0x0060 /* 26 et 54 = 0x005FD0FF */ -#define WIND_8_SUBBANDS_6_4 (SINT16)0x0041 /* 10 et 70 = 0x00415B75 */ -#define WIND_8_SUBBANDS_7_0 (SINT16)0x003A /* 7 et 73 = 0x003A72E7 */ -#define WIND_8_SUBBANDS_7_1 (SINT16)0x01F6 /* 23 et 57 = 0x01F5F424 */ -#define WIND_8_SUBBANDS_7_2 (SINT16)0x129C /* 39 et 41 = 0x129C226F */ -#define WIND_8_SUBBANDS_7_3 (SINT16)0x0122 /* 25 et 55 = 0x01223EBA */ -#define WIND_8_SUBBANDS_7_4 (SINT16)0x0045 /* 9 et 71 = 0x0044EF48 */ -#define WIND_8_SUBBANDS_8_0 (SINT16)0x0042 /* 8 et 72 = 0x0041EC6A */ -#define WIND_8_SUBBANDS_8_1 (SINT16)0x01A8 /* 24 et 56 = 0x01A7ECEF */ -#define WIND_8_SUBBANDS_8_2 (SINT16)0x12CF /* 40 = 0x12CF6C75 */ -#endif - -#if (SBC_USE_ARM_PRAGMA == TRUE) -#pragma arm section zidata = "sbc_s32_analysis_section" -#endif -#if BT_BLE_DYNAMIC_ENV_MEMORY == FALSE -static SINT32 s32DCTY[16] = {0}; -static SINT32 s32X[ENC_VX_BUFFER_SIZE / 2]; -static SINT16 *s16X = (SINT16 *)s32X; /* s16X must be 32 bits aligned cf SHIFTUP_X8_2*/ -#else -static SINT32 *s32DCTY; -static SINT32 *s32X; -static SINT16 *s16X; /* s16X must be 32 bits aligned cf SHIFTUP_X8_2*/ -#endif // BT_BLE_DYNAMIC_ENV_MEMORY == FALSE - -#if (SBC_USE_ARM_PRAGMA == TRUE) -#pragma arm section zidata -#endif - -/* This macro is for 4 subbands */ -#define SHIFTUP_X4 \ - { \ - ps32X = (SINT32 *)(s16X + EncMaxShiftCounter + 38); \ - for (i = 0; i < 9; i++) { \ - *ps32X = *(ps32X - 2 - (ShiftCounter >> 1)); \ - ps32X--; \ - *ps32X = *(ps32X - 2 - (ShiftCounter >> 1)); \ - ps32X--; \ - } \ - } -#define SHIFTUP_X4_2 \ - { \ - ps32X = (SINT32 *)(s16X + EncMaxShiftCounter + 38); \ - ps32X2 = (SINT32 *)(s16X + (EncMaxShiftCounter << 1) + 78); \ - for (i = 0; i < 9; i++) { \ - *ps32X = *(ps32X - 2 - (ShiftCounter >> 1)); \ - *(ps32X2) = *(ps32X2 - 2 - (ShiftCounter >> 1)); \ - ps32X--; \ - ps32X2--; \ - *ps32X = *(ps32X - 2 - (ShiftCounter >> 1)); \ - *(ps32X2) = *(ps32X2 - 2 - (ShiftCounter >> 1)); \ - ps32X--; \ - ps32X2--; \ - } \ - } - -/* This macro is for 8 subbands */ -#define SHIFTUP_X8 \ - { \ - ps32X = (SINT32 *)(s16X + EncMaxShiftCounter + 78); \ - for (i = 0; i < 9; i++) { \ - *ps32X = *(ps32X - 4 - (ShiftCounter >> 1)); \ - ps32X--; \ - *ps32X = *(ps32X - 4 - (ShiftCounter >> 1)); \ - ps32X--; \ - *ps32X = *(ps32X - 4 - (ShiftCounter >> 1)); \ - ps32X--; \ - *ps32X = *(ps32X - 4 - (ShiftCounter >> 1)); \ - ps32X--; \ - } \ - } -#define SHIFTUP_X8_2 \ - { \ - ps32X = (SINT32 *)(s16X + EncMaxShiftCounter + 78); \ - ps32X2 = (SINT32 *)(s16X + (EncMaxShiftCounter << 1) + 158); \ - for (i = 0; i < 9; i++) { \ - *ps32X = *(ps32X - 4 - (ShiftCounter >> 1)); \ - *(ps32X2) = *(ps32X2 - 4 - (ShiftCounter >> 1)); \ - ps32X--; \ - ps32X2--; \ - *ps32X = *(ps32X - 4 - (ShiftCounter >> 1)); \ - *(ps32X2) = *(ps32X2 - 4 - (ShiftCounter >> 1)); \ - ps32X--; \ - ps32X2--; \ - *ps32X = *(ps32X - 4 - (ShiftCounter >> 1)); \ - *(ps32X2) = *(ps32X2 - 4 - (ShiftCounter >> 1)); \ - ps32X--; \ - ps32X2--; \ - *ps32X = *(ps32X - 4 - (ShiftCounter >> 1)); \ - *(ps32X2) = *(ps32X2 - 4 - (ShiftCounter >> 1)); \ - ps32X--; \ - ps32X2--; \ - } \ - } - -#if (SBC_ARM_ASM_OPT == TRUE) -#define WINDOW_ACCU_8_0 \ - { \ - __asm {\ - MUL s32Hi,WIND_8_SUBBANDS_0_1,(s16X[ChOffset+16]-s16X[ChOffset+64]);\ - MLA s32Hi,WIND_8_SUBBANDS_0_2,(s16X[ChOffset+32]-s16X[ChOffset+48]),s32Hi;\ - MOV s32DCTY[0],s32Hi; } \ - } -#define WINDOW_ACCU_8_1_15 \ - { \ - __asm {\ - MUL s32Hi,WIND_8_SUBBANDS_1_0,s16X[ChOffset+1];\ - MUL s32Hi2,WIND_8_SUBBANDS_1_0,s16X[ChOffset+64+15];\ - MLA s32Hi,WIND_8_SUBBANDS_1_1,s16X[ChOffset+16+1],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_1_1,s16X[ChOffset+48+15],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_1_2,s16X[ChOffset+32+1],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_1_2,s16X[ChOffset+32+15],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_1_3,s16X[ChOffset+48+1],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_1_3,s16X[ChOffset+16+15],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_1_4,s16X[ChOffset+64+1],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_1_4,s16X[ChOffset+15],s32Hi2;\ - MOV s32DCTY[1],s32Hi;\ - MOV s32DCTY[15],s32Hi2; \ - } \ - } -#define WINDOW_ACCU_8_2_14 \ - { \ - __asm {\ - MUL s32Hi,WIND_8_SUBBANDS_2_0,s16X[ChOffset+2];\ - MUL s32Hi2,WIND_8_SUBBANDS_2_0,s16X[ChOffset+64+14];\ - MLA s32Hi,WIND_8_SUBBANDS_2_1,s16X[ChOffset+16+2],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_2_1,s16X[ChOffset+48+14],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_2_2,s16X[ChOffset+32+2],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_2_2,s16X[ChOffset+32+14],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_2_3,s16X[ChOffset+48+2],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_2_3,s16X[ChOffset+16+14],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_2_4,s16X[ChOffset+64+2],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_2_4,s16X[ChOffset+14],s32Hi2;\ - MOV s32DCTY[2],s32Hi;\ - MOV s32DCTY[14],s32Hi2; \ - } \ - } -#define WINDOW_ACCU_8_3_13 \ - { \ - __asm {\ - MUL s32Hi,WIND_8_SUBBANDS_3_0,s16X[ChOffset+3];\ - MUL s32Hi2,WIND_8_SUBBANDS_3_0,s16X[ChOffset+64+13];\ - MLA s32Hi,WIND_8_SUBBANDS_3_1,s16X[ChOffset+16+3],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_3_1,s16X[ChOffset+48+13],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_3_2,s16X[ChOffset+32+3],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_3_2,s16X[ChOffset+32+13],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_3_3,s16X[ChOffset+48+3],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_3_3,s16X[ChOffset+16+13],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_3_4,s16X[ChOffset+64+3],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_3_4,s16X[ChOffset+13],s32Hi2;\ - MOV s32DCTY[3],s32Hi;\ - MOV s32DCTY[13],s32Hi2; \ - } \ - } -#define WINDOW_ACCU_8_4_12 \ - { \ - __asm {\ - MUL s32Hi,WIND_8_SUBBANDS_4_0,s16X[ChOffset+4];\ - MUL s32Hi2,WIND_8_SUBBANDS_4_0,s16X[ChOffset+64+12];\ - MLA s32Hi,WIND_8_SUBBANDS_4_1,s16X[ChOffset+16+4],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_4_1,s16X[ChOffset+48+12],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_4_2,s16X[ChOffset+32+4],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_4_2,s16X[ChOffset+32+12],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_4_3,s16X[ChOffset+48+4],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_4_3,s16X[ChOffset+16+12],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_4_4,s16X[ChOffset+64+4],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_4_4,s16X[ChOffset+12],s32Hi2;\ - MOV s32DCTY[4],s32Hi;\ - MOV s32DCTY[12],s32Hi2; \ - } \ - } -#define WINDOW_ACCU_8_5_11 \ - { \ - __asm {\ - MUL s32Hi,WIND_8_SUBBANDS_5_0,s16X[ChOffset+5];\ - MUL s32Hi2,WIND_8_SUBBANDS_5_0,s16X[ChOffset+64+11];\ - MLA s32Hi,WIND_8_SUBBANDS_5_1,s16X[ChOffset+16+5],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_5_1,s16X[ChOffset+48+11],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_5_2,s16X[ChOffset+32+5],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_5_2,s16X[ChOffset+32+11],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_5_3,s16X[ChOffset+48+5],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_5_3,s16X[ChOffset+16+11],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_5_4,s16X[ChOffset+64+5],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_5_4,s16X[ChOffset+11],s32Hi2;\ - MOV s32DCTY[5],s32Hi;\ - MOV s32DCTY[11],s32Hi2; \ - } \ - } -#define WINDOW_ACCU_8_6_10 \ - { \ - __asm {\ - MUL s32Hi,WIND_8_SUBBANDS_6_0,s16X[ChOffset+6];\ - MUL s32Hi2,WIND_8_SUBBANDS_6_0,s16X[ChOffset+64+10];\ - MLA s32Hi,WIND_8_SUBBANDS_6_1,s16X[ChOffset+16+6],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_6_1,s16X[ChOffset+48+10],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_6_2,s16X[ChOffset+32+6],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_6_2,s16X[ChOffset+32+10],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_6_3,s16X[ChOffset+48+6],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_6_3,s16X[ChOffset+16+10],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_6_4,s16X[ChOffset+64+6],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_6_4,s16X[ChOffset+10],s32Hi2;\ - MOV s32DCTY[6],s32Hi;\ - MOV s32DCTY[10],s32Hi2; \ - } \ - } -#define WINDOW_ACCU_8_7_9 \ - { \ - __asm {\ - MUL s32Hi,WIND_8_SUBBANDS_7_0,s16X[ChOffset+7];\ - MUL s32Hi2,WIND_8_SUBBANDS_7_0,s16X[ChOffset+64+9];\ - MLA s32Hi,WIND_8_SUBBANDS_7_1,s16X[ChOffset+16+7],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_7_1,s16X[ChOffset+48+9],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_7_2,s16X[ChOffset+32+7],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_7_2,s16X[ChOffset+32+9],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_7_3,s16X[ChOffset+48+7],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_7_3,s16X[ChOffset+16+9],s32Hi2;\ - MLA s32Hi,WIND_8_SUBBANDS_7_4,s16X[ChOffset+64+7],s32Hi;\ - MLA s32Hi2,WIND_8_SUBBANDS_7_4,s16X[ChOffset+9],s32Hi2;\ - MOV s32DCTY[7],s32Hi;\ - MOV s32DCTY[9],s32Hi2; \ - } \ - } -#define WINDOW_ACCU_8_8 \ - { \ - __asm {\ - MUL s32Hi,WIND_8_SUBBANDS_8_0,(s16X[ChOffset+8]+s16X[ChOffset+8+64]);\ - MLA s32Hi,WIND_8_SUBBANDS_8_1,(s16X[ChOffset+8+16]+s16X[ChOffset+8+64]),s32Hi;\ - MLA s32Hi,WIND_8_SUBBANDS_8_2,s16X[ChOffset+8+32],s32Hi;\ - MOV s32DCTY[8],s32Hi; \ - } \ - } -#define WINDOW_ACCU_4_0 \ - { \ - __asm {\ - MUL s32Hi,WIND_4_SUBBANDS_0_1,(s16X[ChOffset+8]-s16X[ChOffset+32]);\ - MLA s32Hi,WIND_4_SUBBANDS_0_2,(s16X[ChOffset+16]-s16X[ChOffset+24]),s32Hi;\ - MOV s32DCTY[0],s32Hi; } \ - } -#define WINDOW_ACCU_4_1_7 \ - { \ - __asm {\ - MUL s32Hi,WIND_4_SUBBANDS_1_0,s16X[ChOffset+1];\ - MUL s32Hi2,WIND_4_SUBBANDS_1_0,s16X[ChOffset+32+7];\ - MLA s32Hi,WIND_4_SUBBANDS_1_1,s16X[ChOffset+8+1],s32Hi;\ - MLA s32Hi2,WIND_4_SUBBANDS_1_1,s16X[ChOffset+24+7],s32Hi2;\ - MLA s32Hi,WIND_4_SUBBANDS_1_2,s16X[ChOffset+16+1],s32Hi;\ - MLA s32Hi2,WIND_4_SUBBANDS_1_2,s16X[ChOffset+16+7],s32Hi2;\ - MLA s32Hi,WIND_4_SUBBANDS_1_3,s16X[ChOffset+24+1],s32Hi;\ - MLA s32Hi2,WIND_4_SUBBANDS_1_3,s16X[ChOffset+8+7],s32Hi2;\ - MLA s32Hi,WIND_4_SUBBANDS_1_4,s16X[ChOffset+32+1],s32Hi;\ - MLA s32Hi2,WIND_4_SUBBANDS_1_4,s16X[ChOffset+7],s32Hi2;\ - MOV s32DCTY[1],s32Hi;\ - MOV s32DCTY[7],s32Hi2; \ - } \ - } -#define WINDOW_ACCU_4_2_6 \ - { \ - __asm {\ - MUL s32Hi,WIND_4_SUBBANDS_2_0,s16X[ChOffset+2];\ - MUL s32Hi2,WIND_4_SUBBANDS_2_0,s16X[ChOffset+32+6];\ - MLA s32Hi,WIND_4_SUBBANDS_2_1,s16X[ChOffset+8+2],s32Hi;\ - MLA s32Hi2,WIND_4_SUBBANDS_2_1,s16X[ChOffset+24+6],s32Hi2;\ - MLA s32Hi,WIND_4_SUBBANDS_2_2,s16X[ChOffset+16+2],s32Hi;\ - MLA s32Hi2,WIND_4_SUBBANDS_2_2,s16X[ChOffset+16+6],s32Hi2;\ - MLA s32Hi,WIND_4_SUBBANDS_2_3,s16X[ChOffset+24+2],s32Hi;\ - MLA s32Hi2,WIND_4_SUBBANDS_2_3,s16X[ChOffset+8+6],s32Hi2;\ - MLA s32Hi,WIND_4_SUBBANDS_2_4,s16X[ChOffset+32+2],s32Hi;\ - MLA s32Hi2,WIND_4_SUBBANDS_2_4,s16X[ChOffset+6],s32Hi2;\ - MOV s32DCTY[2],s32Hi;\ - MOV s32DCTY[6],s32Hi2; \ - } \ - } -#define WINDOW_ACCU_4_3_5 \ - { \ - __asm {\ - MUL s32Hi,WIND_4_SUBBANDS_3_0,s16X[ChOffset+3];\ - MUL s32Hi2,WIND_4_SUBBANDS_3_0,s16X[ChOffset+32+5];\ - MLA s32Hi,WIND_4_SUBBANDS_3_1,s16X[ChOffset+8+3],s32Hi;\ - MLA s32Hi2,WIND_4_SUBBANDS_3_1,s16X[ChOffset+24+5],s32Hi2;\ - MLA s32Hi,WIND_4_SUBBANDS_3_2,s16X[ChOffset+16+3],s32Hi;\ - MLA s32Hi2,WIND_4_SUBBANDS_3_2,s16X[ChOffset+16+5],s32Hi2;\ - MLA s32Hi,WIND_4_SUBBANDS_3_3,s16X[ChOffset+24+3],s32Hi;\ - MLA s32Hi2,WIND_4_SUBBANDS_3_3,s16X[ChOffset+8+5],s32Hi2;\ - MLA s32Hi,WIND_4_SUBBANDS_3_4,s16X[ChOffset+32+3],s32Hi;\ - MLA s32Hi2,WIND_4_SUBBANDS_3_4,s16X[ChOffset+5],s32Hi2;\ - MOV s32DCTY[3],s32Hi;\ - MOV s32DCTY[5],s32Hi2; \ - } \ - } -#define WINDOW_ACCU_4_4 \ - { \ - __asm {\ - MUL s32Hi,WIND_4_SUBBANDS_4_0,(s16X[ChOffset+4]+s16X[ChOffset+4+32]);\ - MLA s32Hi,WIND_4_SUBBANDS_4_1,(s16X[ChOffset+4+8]+s16X[ChOffset+4+24]),s32Hi;\ - MLA s32Hi,WIND_4_SUBBANDS_4_2,s16X[ChOffset+4+16],s32Hi;\ - MOV s32DCTY[4],s32Hi; \ - } \ - } - -#define WINDOW_PARTIAL_4 \ - { \ - WINDOW_ACCU_4_0; \ - WINDOW_ACCU_4_1_7; \ - WINDOW_ACCU_4_2_6; \ - WINDOW_ACCU_4_3_5; \ - WINDOW_ACCU_4_4; \ - } - -#define WINDOW_PARTIAL_8 \ - { \ - WINDOW_ACCU_8_0; \ - WINDOW_ACCU_8_1_15; \ - WINDOW_ACCU_8_2_14; \ - WINDOW_ACCU_8_3_13; \ - WINDOW_ACCU_8_4_12; \ - WINDOW_ACCU_8_5_11; \ - WINDOW_ACCU_8_6_10; \ - WINDOW_ACCU_8_7_9; \ - WINDOW_ACCU_8_8; \ - } - -#else -#if (SBC_IPAQ_OPT == TRUE) - -#if (SBC_IS_64_MULT_IN_WINDOW_ACCU == TRUE) -#define WINDOW_ACCU_8_0 \ - { \ - s64Temp = (SINT64)WIND_8_SUBBANDS_0_1 * (SINT64)(s16X[ChOffset + 16] - s16X[ChOffset + 64]); \ - s64Temp += (SINT64)WIND_8_SUBBANDS_0_2 * (SINT64)(s16X[ChOffset + 32] - s16X[ChOffset + 48]); \ - s32DCTY[0] = (SINT32)(s64Temp >> 16); \ - } -#define WINDOW_ACCU_8_1_15 \ - { \ - s64Temp = (SINT64)WIND_8_SUBBANDS_1_0 * (SINT64)s16X[ChOffset + 1]; \ - s64Temp2 = (SINT64)WIND_8_SUBBANDS_1_0 * (SINT64)s16X[ChOffset + 64 + 15]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_1_1 * (SINT64)s16X[ChOffset + 16 + 1]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_1_1 * (SINT64)s16X[ChOffset + 48 + 15]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_1_2 * (SINT64)s16X[ChOffset + 32 + 1]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_1_2 * (SINT64)s16X[ChOffset + 32 + 15]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_1_3 * (SINT64)s16X[ChOffset + 48 + 1]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_1_3 * (SINT64)s16X[ChOffset + 16 + 15]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_1_4 * (SINT64)s16X[ChOffset + 64 + 1]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_1_4 * (SINT64)s16X[ChOffset + 15]; \ - s32DCTY[1] = (SINT32)(s64Temp >> 16); \ - s32DCTY[15] = (SINT32)(s64Temp2 >> 16); \ - } -#define WINDOW_ACCU_8_2_14 \ - { \ - s64Temp = (SINT64)WIND_8_SUBBANDS_2_0 * (SINT64)s16X[ChOffset + 2]; \ - s64Temp2 = (SINT64)WIND_8_SUBBANDS_2_0 * (SINT64)s16X[ChOffset + 64 + 14]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_2_1 * (SINT64)s16X[ChOffset + 16 + 2]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_2_1 * (SINT64)s16X[ChOffset + 48 + 14]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_2_2 * (SINT64)s16X[ChOffset + 32 + 2]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_2_2 * (SINT64)s16X[ChOffset + 32 + 14]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_2_3 * (SINT64)s16X[ChOffset + 48 + 2]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_2_3 * (SINT64)s16X[ChOffset + 16 + 14]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_2_4 * (SINT64)s16X[ChOffset + 64 + 2]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_2_4 * (SINT64)s16X[ChOffset + 14]; \ - s32DCTY[2] = (SINT32)(s64Temp >> 16); \ - s32DCTY[14] = (SINT32)(s64Temp2 >> 16); \ - } -#define WINDOW_ACCU_8_3_13 \ - { \ - s64Temp = (SINT64)WIND_8_SUBBANDS_3_0 * (SINT64)s16X[ChOffset + 3]; \ - s64Temp2 = (SINT64)WIND_8_SUBBANDS_3_0 * (SINT64)s16X[ChOffset + 64 + 13]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_3_1 * (SINT64)s16X[ChOffset + 16 + 3]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_3_1 * (SINT64)s16X[ChOffset + 48 + 13]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_3_2 * (SINT64)s16X[ChOffset + 32 + 3]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_3_2 * (SINT64)s16X[ChOffset + 32 + 13]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_3_3 * (SINT64)s16X[ChOffset + 48 + 3]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_3_3 * (SINT64)s16X[ChOffset + 16 + 13]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_3_4 * (SINT64)s16X[ChOffset + 64 + 3]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_3_4 * (SINT64)s16X[ChOffset + 13]; \ - s32DCTY[3] = (SINT32)(s64Temp >> 16); \ - s32DCTY[13] = (SINT32)(s64Temp2 >> 16); \ - } -#define WINDOW_ACCU_8_4_12 \ - { \ - s64Temp = (SINT64)WIND_8_SUBBANDS_4_0 * (SINT64)s16X[ChOffset + 4]; \ - s64Temp2 = (SINT64)WIND_8_SUBBANDS_4_0 * (SINT64)s16X[ChOffset + 64 + 12]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_4_1 * (SINT64)s16X[ChOffset + 16 + 4]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_4_1 * (SINT64)s16X[ChOffset + 48 + 12]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_4_2 * (SINT64)s16X[ChOffset + 32 + 4]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_4_2 * (SINT64)s16X[ChOffset + 32 + 12]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_4_3 * (SINT64)s16X[ChOffset + 48 + 4]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_4_3 * (SINT64)s16X[ChOffset + 16 + 12]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_4_4 * (SINT64)s16X[ChOffset + 64 + 4]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_4_4 * (SINT64)s16X[ChOffset + 12]; \ - s32DCTY[4] = (SINT32)(s64Temp >> 16); \ - s32DCTY[12] = (SINT32)(s64Temp2 >> 16); \ - } -#define WINDOW_ACCU_8_5_11 \ - { \ - s64Temp = (SINT64)WIND_8_SUBBANDS_5_0 * (SINT64)s16X[ChOffset + 5]; \ - s64Temp2 = (SINT64)WIND_8_SUBBANDS_5_0 * (SINT64)s16X[ChOffset + 64 + 11]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_5_1 * (SINT64)s16X[ChOffset + 16 + 5]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_5_1 * (SINT64)s16X[ChOffset + 48 + 11]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_5_2 * (SINT64)s16X[ChOffset + 32 + 5]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_5_2 * (SINT64)s16X[ChOffset + 32 + 11]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_5_3 * (SINT64)s16X[ChOffset + 48 + 5]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_5_3 * (SINT64)s16X[ChOffset + 16 + 11]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_5_4 * (SINT64)s16X[ChOffset + 64 + 5]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_5_4 * (SINT64)s16X[ChOffset + 11]; \ - s32DCTY[5] = (SINT32)(s64Temp >> 16); \ - s32DCTY[11] = (SINT32)(s64Temp2 >> 16); \ - } -#define WINDOW_ACCU_8_6_10 \ - { \ - s64Temp = (SINT64)WIND_8_SUBBANDS_6_0 * (SINT64)s16X[ChOffset + 6]; \ - s64Temp2 = (SINT64)WIND_8_SUBBANDS_6_0 * (SINT64)s16X[ChOffset + 64 + 10]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_6_1 * (SINT64)s16X[ChOffset + 16 + 6]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_6_1 * (SINT64)s16X[ChOffset + 48 + 10]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_6_2 * (SINT64)s16X[ChOffset + 32 + 6]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_6_2 * (SINT64)s16X[ChOffset + 32 + 10]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_6_3 * (SINT64)s16X[ChOffset + 48 + 6]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_6_3 * (SINT64)s16X[ChOffset + 16 + 10]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_6_4 * (SINT64)s16X[ChOffset + 64 + 6]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_6_4 * (SINT64)s16X[ChOffset + 10]; \ - s32DCTY[6] = (SINT32)(s64Temp >> 16); \ - s32DCTY[10] = (SINT32)(s64Temp2 >> 16); \ - } -#define WINDOW_ACCU_8_7_9 \ - { \ - s64Temp = (SINT64)WIND_8_SUBBANDS_7_0 * (SINT64)s16X[ChOffset + 7]; \ - s64Temp2 = (SINT64)WIND_8_SUBBANDS_7_0 * (SINT64)s16X[ChOffset + 64 + 9]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_7_1 * (SINT64)s16X[ChOffset + 16 + 7]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_7_1 * (SINT64)s16X[ChOffset + 48 + 9]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_7_2 * (SINT64)s16X[ChOffset + 32 + 7]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_7_2 * (SINT64)s16X[ChOffset + 32 + 9]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_7_3 * (SINT64)s16X[ChOffset + 48 + 7]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_7_3 * (SINT64)s16X[ChOffset + 16 + 9]; \ - s64Temp += (SINT64)WIND_8_SUBBANDS_7_4 * (SINT64)s16X[ChOffset + 64 + 7]; \ - s64Temp2 += (SINT64)WIND_8_SUBBANDS_7_4 * (SINT64)s16X[ChOffset + 9]; \ - s32DCTY[7] = (SINT32)(s64Temp >> 16); \ - s32DCTY[9] = (SINT32)(s64Temp2 >> 16); \ - } -#define WINDOW_ACCU_8_8 \ - { \ - s64Temp = (SINT64)WIND_8_SUBBANDS_8_0 * (SINT64)(s16X[ChOffset + 8] + s16X[ChOffset + 64 + 8]); \ - s64Temp += (SINT64)WIND_8_SUBBANDS_8_1 * (SINT64)(s16X[ChOffset + 16 + 8] + s16X[ChOffset + 48 + 8]); \ - s64Temp += (SINT64)WIND_8_SUBBANDS_8_2 * (SINT64)s16X[ChOffset + 32 + 8]; \ - s32DCTY[8] = (SINT32)(s64Temp >> 16); \ - } -#define WINDOW_ACCU_4_0 \ - { \ - s64Temp = (SINT64)WIND_4_SUBBANDS_0_1 * (SINT64)(s16X[ChOffset + 8] - s16X[ChOffset + 32]); \ - s64Temp += (SINT64)WIND_4_SUBBANDS_0_2 * (SINT64)(s16X[ChOffset + 16] - s16X[ChOffset + 24]); \ - s32DCTY[0] = (SINT32)(s64Temp >> 16); \ - } -#define WINDOW_ACCU_4_1_7 \ - { \ - s64Temp = (SINT64)WIND_4_SUBBANDS_1_0 * (SINT64)s16X[ChOffset + 1]; \ - s64Temp2 = (SINT64)WIND_4_SUBBANDS_1_0 * (SINT64)s16X[ChOffset + 32 + 7]; \ - s64Temp += (SINT64)WIND_4_SUBBANDS_1_1 * (SINT64)s16X[ChOffset + 8 + 1]; \ - s64Temp2 += (SINT64)WIND_4_SUBBANDS_1_1 * (SINT64)s16X[ChOffset + 24 + 7]; \ - s64Temp += (SINT64)WIND_4_SUBBANDS_1_2 * (SINT64)s16X[ChOffset + 16 + 1]; \ - s64Temp2 += (SINT64)WIND_4_SUBBANDS_1_2 * (SINT64)s16X[ChOffset + 16 + 7]; \ - s64Temp += (SINT64)WIND_4_SUBBANDS_1_3 * (SINT64)s16X[ChOffset + 24 + 1]; \ - s64Temp2 += (SINT64)WIND_4_SUBBANDS_1_3 * (SINT64)s16X[ChOffset + 8 + 7]; \ - s64Temp += (SINT64)WIND_4_SUBBANDS_1_4 * (SINT64)s16X[ChOffset + 32 + 1]; \ - s64Temp2 += (SINT64)WIND_4_SUBBANDS_1_4 * (SINT64)s16X[ChOffset + 7]; \ - s32DCTY[1] = (SINT32)(s64Temp >> 16); \ - s32DCTY[7] = (SINT32)(s64Temp2 >> 16); \ - } -#define WINDOW_ACCU_4_2_6 \ - { \ - s64Temp = (SINT64)WIND_4_SUBBANDS_2_0 * (SINT64)s16X[ChOffset + 2]; \ - s64Temp2 = (SINT64)WIND_4_SUBBANDS_2_0 * (SINT64)s16X[ChOffset + 32 + 6]; \ - s64Temp += (SINT64)WIND_4_SUBBANDS_2_1 * (SINT64)s16X[ChOffset + 8 + 2]; \ - s64Temp2 += (SINT64)WIND_4_SUBBANDS_2_1 * (SINT64)s16X[ChOffset + 24 + 6]; \ - s64Temp += (SINT64)WIND_4_SUBBANDS_2_2 * (SINT64)s16X[ChOffset + 16 + 2]; \ - s64Temp2 += (SINT64)WIND_4_SUBBANDS_2_2 * (SINT64)s16X[ChOffset + 16 + 6]; \ - s64Temp += (SINT64)WIND_4_SUBBANDS_2_3 * (SINT64)s16X[ChOffset + 24 + 2]; \ - s64Temp2 += (SINT64)WIND_4_SUBBANDS_2_3 * (SINT64)s16X[ChOffset + 8 + 6]; \ - s64Temp += (SINT64)WIND_4_SUBBANDS_2_4 * (SINT64)s16X[ChOffset + 32 + 2]; \ - s64Temp2 += (SINT64)WIND_4_SUBBANDS_2_4 * (SINT64)s16X[ChOffset + 6]; \ - s32DCTY[2] = (SINT32)(s64Temp >> 16); \ - s32DCTY[6] = (SINT32)(s64Temp2 >> 16); \ - } -#define WINDOW_ACCU_4_3_5 \ - { \ - s64Temp = (SINT64)WIND_4_SUBBANDS_3_0 * (SINT64)s16X[ChOffset + 3]; \ - s64Temp2 = (SINT64)WIND_4_SUBBANDS_3_0 * (SINT64)s16X[ChOffset + 32 + 5]; \ - s64Temp += (SINT64)WIND_4_SUBBANDS_3_1 * (SINT64)s16X[ChOffset + 8 + 3]; \ - s64Temp2 += (SINT64)WIND_4_SUBBANDS_3_1 * (SINT64)s16X[ChOffset + 24 + 5]; \ - s64Temp += (SINT64)WIND_4_SUBBANDS_3_2 * (SINT64)s16X[ChOffset + 16 + 3]; \ - s64Temp2 += (SINT64)WIND_4_SUBBANDS_3_2 * (SINT64)s16X[ChOffset + 16 + 5]; \ - s64Temp += (SINT64)WIND_4_SUBBANDS_3_3 * (SINT64)s16X[ChOffset + 24 + 3]; \ - s64Temp2 += (SINT64)WIND_4_SUBBANDS_3_3 * (SINT64)s16X[ChOffset + 8 + 5]; \ - s64Temp += (SINT64)WIND_4_SUBBANDS_3_4 * (SINT64)s16X[ChOffset + 32 + 3]; \ - s64Temp2 += (SINT64)WIND_4_SUBBANDS_3_4 * (SINT64)s16X[ChOffset + 5]; \ - s32DCTY[3] = (SINT32)(s64Temp >> 16); \ - s32DCTY[5] = (SINT32)(s64Temp2 >> 16); \ - } - -#define WINDOW_ACCU_4_4 \ - { \ - s64Temp = (SINT64)WIND_4_SUBBANDS_4_0 * (SINT64)(s16X[ChOffset + 4] + s16X[ChOffset + 4 + 32]); \ - s64Temp += (SINT64)WIND_4_SUBBANDS_4_1 * (SINT64)(s16X[ChOffset + 4 + 8] + s16X[ChOffset + 4 + 24]); \ - s64Temp += (SINT64)WIND_4_SUBBANDS_4_2 * (SINT64)s16X[ChOffset + 4 + 16]; \ - s32DCTY[4] = (SINT32)(s64Temp >> 16); \ - } -#else /* SBC_IS_64_MULT_IN_WINDOW_ACCU == FALSE */ -#define WINDOW_ACCU_8_0 \ - { \ - s32Temp = (SINT32)WIND_8_SUBBANDS_0_1 * (SINT32)(s16X[ChOffset + 16] - s16X[ChOffset + 64]); \ - s32Temp += (SINT32)WIND_8_SUBBANDS_0_2 * (SINT32)(s16X[ChOffset + 32] - s16X[ChOffset + 48]); \ - s32DCTY[0] = (SINT32)s32Temp; \ - } -#define WINDOW_ACCU_8_1_15 \ - { \ - s32Temp = (SINT32)WIND_8_SUBBANDS_1_0 * (SINT32)s16X[ChOffset + 1]; \ - s32Temp2 = (SINT32)WIND_8_SUBBANDS_1_0 * (SINT32)s16X[ChOffset + 64 + 15]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_1_1 * (SINT32)s16X[ChOffset + 16 + 1]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_1_1 * (SINT32)s16X[ChOffset + 48 + 15]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_1_2 * (SINT32)s16X[ChOffset + 32 + 1]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_1_2 * (SINT32)s16X[ChOffset + 32 + 15]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_1_3 * (SINT32)s16X[ChOffset + 48 + 1]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_1_3 * (SINT32)s16X[ChOffset + 16 + 15]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_1_4 * (SINT32)s16X[ChOffset + 64 + 1]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_1_4 * (SINT32)s16X[ChOffset + 15]; \ - s32DCTY[1] = (SINT32)s32Temp; \ - s32DCTY[15] = (SINT32)s32Temp2; \ - } -#define WINDOW_ACCU_8_2_14 \ - { \ - s32Temp = (SINT32)WIND_8_SUBBANDS_2_0 * (SINT32)s16X[ChOffset + 2]; \ - s32Temp2 = (SINT32)WIND_8_SUBBANDS_2_0 * (SINT32)s16X[ChOffset + 64 + 14]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_2_1 * (SINT32)s16X[ChOffset + 16 + 2]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_2_1 * (SINT32)s16X[ChOffset + 48 + 14]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_2_2 * (SINT32)s16X[ChOffset + 32 + 2]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_2_2 * (SINT32)s16X[ChOffset + 32 + 14]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_2_3 * (SINT32)s16X[ChOffset + 48 + 2]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_2_3 * (SINT32)s16X[ChOffset + 16 + 14]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_2_4 * (SINT32)s16X[ChOffset + 64 + 2]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_2_4 * (SINT32)s16X[ChOffset + 14]; \ - s32DCTY[2] = (SINT32)s32Temp; \ - s32DCTY[14] = (SINT32)s32Temp2; \ - } -#define WINDOW_ACCU_8_3_13 \ - { \ - s32Temp = (SINT32)WIND_8_SUBBANDS_3_0 * (SINT32)s16X[ChOffset + 3]; \ - s32Temp2 = (SINT32)WIND_8_SUBBANDS_3_0 * (SINT32)s16X[ChOffset + 64 + 13]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_3_1 * (SINT32)s16X[ChOffset + 16 + 3]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_3_1 * (SINT32)s16X[ChOffset + 48 + 13]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_3_2 * (SINT32)s16X[ChOffset + 32 + 3]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_3_2 * (SINT32)s16X[ChOffset + 32 + 13]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_3_3 * (SINT32)s16X[ChOffset + 48 + 3]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_3_3 * (SINT32)s16X[ChOffset + 16 + 13]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_3_4 * (SINT32)s16X[ChOffset + 64 + 3]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_3_4 * (SINT32)s16X[ChOffset + 13]; \ - s32DCTY[3] = (SINT32)s32Temp; \ - s32DCTY[13] = (SINT32)s32Temp2; \ - } -#define WINDOW_ACCU_8_4_12 \ - { \ - s32Temp = (SINT32)WIND_8_SUBBANDS_4_0 * (SINT32)s16X[ChOffset + 4]; \ - s32Temp2 = (SINT32)WIND_8_SUBBANDS_4_0 * (SINT32)s16X[ChOffset + 64 + 12]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_4_1 * (SINT32)s16X[ChOffset + 16 + 4]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_4_1 * (SINT32)s16X[ChOffset + 48 + 12]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_4_2 * (SINT32)s16X[ChOffset + 32 + 4]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_4_2 * (SINT32)s16X[ChOffset + 32 + 12]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_4_3 * (SINT32)s16X[ChOffset + 48 + 4]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_4_3 * (SINT32)s16X[ChOffset + 16 + 12]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_4_4 * (SINT32)s16X[ChOffset + 64 + 4]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_4_4 * (SINT32)s16X[ChOffset + 12]; \ - s32DCTY[4] = (SINT32)s32Temp; \ - s32DCTY[12] = (SINT32)s32Temp2; \ - } -#define WINDOW_ACCU_8_5_11 \ - { \ - s32Temp = (SINT32)WIND_8_SUBBANDS_5_0 * (SINT32)s16X[ChOffset + 5]; \ - s32Temp2 = (SINT32)WIND_8_SUBBANDS_5_0 * (SINT32)s16X[ChOffset + 64 + 11]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_5_1 * (SINT32)s16X[ChOffset + 16 + 5]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_5_1 * (SINT32)s16X[ChOffset + 48 + 11]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_5_2 * (SINT32)s16X[ChOffset + 32 + 5]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_5_2 * (SINT32)s16X[ChOffset + 32 + 11]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_5_3 * (SINT32)s16X[ChOffset + 48 + 5]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_5_3 * (SINT32)s16X[ChOffset + 16 + 11]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_5_4 * (SINT32)s16X[ChOffset + 64 + 5]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_5_4 * (SINT32)s16X[ChOffset + 11]; \ - s32DCTY[5] = (SINT32)s32Temp; \ - s32DCTY[11] = (SINT32)s32Temp2; \ - } -#define WINDOW_ACCU_8_6_10 \ - { \ - s32Temp = (SINT32)WIND_8_SUBBANDS_6_0 * (SINT32)s16X[ChOffset + 6]; \ - s32Temp2 = (SINT32)WIND_8_SUBBANDS_6_0 * (SINT32)s16X[ChOffset + 64 + 10]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_6_1 * (SINT32)s16X[ChOffset + 16 + 6]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_6_1 * (SINT32)s16X[ChOffset + 48 + 10]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_6_2 * (SINT32)s16X[ChOffset + 32 + 6]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_6_2 * (SINT32)s16X[ChOffset + 32 + 10]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_6_3 * (SINT32)s16X[ChOffset + 48 + 6]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_6_3 * (SINT32)s16X[ChOffset + 16 + 10]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_6_4 * (SINT32)s16X[ChOffset + 64 + 6]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_6_4 * (SINT32)s16X[ChOffset + 10]; \ - s32DCTY[6] = (SINT32)s32Temp; \ - s32DCTY[10] = (SINT32)s32Temp2; \ - } -#define WINDOW_ACCU_8_7_9 \ - { \ - s32Temp = (SINT32)WIND_8_SUBBANDS_7_0 * (SINT32)s16X[ChOffset + 7]; \ - s32Temp2 = (SINT32)WIND_8_SUBBANDS_7_0 * (SINT32)s16X[ChOffset + 64 + 9]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_7_1 * (SINT32)s16X[ChOffset + 16 + 7]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_7_1 * (SINT32)s16X[ChOffset + 48 + 9]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_7_2 * (SINT32)s16X[ChOffset + 32 + 7]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_7_2 * (SINT32)s16X[ChOffset + 32 + 9]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_7_3 * (SINT32)s16X[ChOffset + 48 + 7]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_7_3 * (SINT32)s16X[ChOffset + 16 + 9]; \ - s32Temp += (SINT32)WIND_8_SUBBANDS_7_4 * (SINT32)s16X[ChOffset + 64 + 7]; \ - s32Temp2 += (SINT32)WIND_8_SUBBANDS_7_4 * (SINT32)s16X[ChOffset + 9]; \ - s32DCTY[7] = (SINT32)s32Temp; \ - s32DCTY[9] = (SINT32)s32Temp2; \ - } -#define WINDOW_ACCU_8_8 \ - { \ - s32Temp = (SINT32)WIND_8_SUBBANDS_8_0 * (SINT32)(s16X[ChOffset + 8] + s16X[ChOffset + 64 + 8]); \ - s32Temp += (SINT32)WIND_8_SUBBANDS_8_1 * (SINT32)(s16X[ChOffset + 16 + 8] + s16X[ChOffset + 48 + 8]); \ - s32Temp += (SINT32)WIND_8_SUBBANDS_8_2 * (SINT32)s16X[ChOffset + 32 + 8]; \ - s32DCTY[8] = (SINT32)s32Temp; \ - } -#define WINDOW_ACCU_4_0 \ - { \ - s32Temp = (SINT32)WIND_4_SUBBANDS_0_1 * (SINT32)(s16X[ChOffset + 8] - s16X[ChOffset + 32]); \ - s32Temp += (SINT32)WIND_4_SUBBANDS_0_2 * (SINT32)(s16X[ChOffset + 16] - s16X[ChOffset + 24]); \ - s32DCTY[0] = (SINT32)(s32Temp); \ - } -#define WINDOW_ACCU_4_1_7 \ - { \ - s32Temp = (SINT32)WIND_4_SUBBANDS_1_0 * (SINT32)s16X[ChOffset + 1]; \ - s32Temp2 = (SINT32)WIND_4_SUBBANDS_1_0 * (SINT32)s16X[ChOffset + 32 + 7]; \ - s32Temp += (SINT32)WIND_4_SUBBANDS_1_1 * (SINT32)s16X[ChOffset + 8 + 1]; \ - s32Temp2 += (SINT32)WIND_4_SUBBANDS_1_1 * (SINT32)s16X[ChOffset + 24 + 7]; \ - s32Temp += (SINT32)WIND_4_SUBBANDS_1_2 * (SINT32)s16X[ChOffset + 16 + 1]; \ - s32Temp2 += (SINT32)WIND_4_SUBBANDS_1_2 * (SINT32)s16X[ChOffset + 16 + 7]; \ - s32Temp += (SINT32)WIND_4_SUBBANDS_1_3 * (SINT32)s16X[ChOffset + 24 + 1]; \ - s32Temp2 += (SINT32)WIND_4_SUBBANDS_1_3 * (SINT32)s16X[ChOffset + 8 + 7]; \ - s32Temp += (SINT32)WIND_4_SUBBANDS_1_4 * (SINT32)s16X[ChOffset + 32 + 1]; \ - s32Temp2 += (SINT32)WIND_4_SUBBANDS_1_4 * (SINT32)s16X[ChOffset + 7]; \ - s32DCTY[1] = (SINT32)(s32Temp); \ - s32DCTY[7] = (SINT32)(s32Temp2); \ - } -#define WINDOW_ACCU_4_2_6 \ - { \ - s32Temp = (SINT32)WIND_4_SUBBANDS_2_0 * (SINT32)s16X[ChOffset + 2]; \ - s32Temp2 = (SINT32)WIND_4_SUBBANDS_2_0 * (SINT32)s16X[ChOffset + 32 + 6]; \ - s32Temp += (SINT32)WIND_4_SUBBANDS_2_1 * (SINT32)s16X[ChOffset + 8 + 2]; \ - s32Temp2 += (SINT32)WIND_4_SUBBANDS_2_1 * (SINT32)s16X[ChOffset + 24 + 6]; \ - s32Temp += (SINT32)WIND_4_SUBBANDS_2_2 * (SINT32)s16X[ChOffset + 16 + 2]; \ - s32Temp2 += (SINT32)WIND_4_SUBBANDS_2_2 * (SINT32)s16X[ChOffset + 16 + 6]; \ - s32Temp += (SINT32)WIND_4_SUBBANDS_2_3 * (SINT32)s16X[ChOffset + 24 + 2]; \ - s32Temp2 += (SINT32)WIND_4_SUBBANDS_2_3 * (SINT32)s16X[ChOffset + 8 + 6]; \ - s32Temp += (SINT32)WIND_4_SUBBANDS_2_4 * (SINT32)s16X[ChOffset + 32 + 2]; \ - s32Temp2 += (SINT32)WIND_4_SUBBANDS_2_4 * (SINT32)s16X[ChOffset + 6]; \ - s32DCTY[2] = (SINT32)(s32Temp); \ - s32DCTY[6] = (SINT32)(s32Temp2); \ - } -#define WINDOW_ACCU_4_3_5 \ - { \ - s32Temp = (SINT32)WIND_4_SUBBANDS_3_0 * (SINT32)s16X[ChOffset + 3]; \ - s32Temp2 = (SINT32)WIND_4_SUBBANDS_3_0 * (SINT32)s16X[ChOffset + 32 + 5]; \ - s32Temp += (SINT32)WIND_4_SUBBANDS_3_1 * (SINT32)s16X[ChOffset + 8 + 3]; \ - s32Temp2 += (SINT32)WIND_4_SUBBANDS_3_1 * (SINT32)s16X[ChOffset + 24 + 5]; \ - s32Temp += (SINT32)WIND_4_SUBBANDS_3_2 * (SINT32)s16X[ChOffset + 16 + 3]; \ - s32Temp2 += (SINT32)WIND_4_SUBBANDS_3_2 * (SINT32)s16X[ChOffset + 16 + 5]; \ - s32Temp += (SINT32)WIND_4_SUBBANDS_3_3 * (SINT32)s16X[ChOffset + 24 + 3]; \ - s32Temp2 += (SINT32)WIND_4_SUBBANDS_3_3 * (SINT32)s16X[ChOffset + 8 + 5]; \ - s32Temp += (SINT32)WIND_4_SUBBANDS_3_4 * (SINT32)s16X[ChOffset + 32 + 3]; \ - s32Temp2 += (SINT32)WIND_4_SUBBANDS_3_4 * (SINT32)s16X[ChOffset + 5]; \ - s32DCTY[3] = (SINT32)(s32Temp); \ - s32DCTY[5] = (SINT32)(s32Temp2); \ - } - -#define WINDOW_ACCU_4_4 \ - { \ - s32Temp = (SINT32)WIND_4_SUBBANDS_4_0 * (SINT32)(s16X[ChOffset + 4] + s16X[ChOffset + 4 + 32]); \ - s32Temp += (SINT32)WIND_4_SUBBANDS_4_1 * (SINT32)(s16X[ChOffset + 4 + 8] + s16X[ChOffset + 4 + 24]); \ - s32Temp += (SINT32)WIND_4_SUBBANDS_4_2 * (SINT32)s16X[ChOffset + 4 + 16]; \ - s32DCTY[4] = (SINT32)(s32Temp); \ - } -#endif -#define WINDOW_PARTIAL_4 \ - { \ - WINDOW_ACCU_4_0; \ - WINDOW_ACCU_4_1_7; \ - WINDOW_ACCU_4_2_6; \ - WINDOW_ACCU_4_3_5; \ - WINDOW_ACCU_4_4; \ - } - -#define WINDOW_PARTIAL_8 \ - { \ - WINDOW_ACCU_8_0; \ - WINDOW_ACCU_8_1_15; \ - WINDOW_ACCU_8_2_14; \ - WINDOW_ACCU_8_3_13; \ - WINDOW_ACCU_8_4_12; \ - WINDOW_ACCU_8_5_11; \ - WINDOW_ACCU_8_6_10; \ - WINDOW_ACCU_8_7_9; \ - WINDOW_ACCU_8_8; \ - } -#else -#if (SBC_IS_64_MULT_IN_WINDOW_ACCU == TRUE) -#define WINDOW_ACCU_4(i) \ - { \ - s64Temp = ((SINT64)gas32CoeffFor4SBs[i] * (SINT64)s16X[ChOffset + i]); \ - s64Temp += ((SINT64)gas32CoeffFor4SBs[(i + 8)] * (SINT64)s16X[ChOffset + i + 8]); \ - s64Temp += ((SINT64)gas32CoeffFor4SBs[(i + 16)] * (SINT64)s16X[ChOffset + i + 16]); \ - s64Temp += ((SINT64)gas32CoeffFor4SBs[(i + 24)] * (SINT64)s16X[ChOffset + i + 24]); \ - s64Temp += ((SINT64)gas32CoeffFor4SBs[(i + 32)] * (SINT64)s16X[ChOffset + i + 32]); \ - s32DCTY[i] = (SINT32)(s64Temp >> 16); \ - /*BT_WARN("s32DCTY4: 0x%x \n", s32DCTY[i]);*/ \ - } -#else -#define WINDOW_ACCU_4(i) \ - { \ - s32DCTY[i] = (gas32CoeffFor4SBs[i * 2] * s16X[ChOffset + i]) + (((SINT32)(UINT16)(gas32CoeffFor4SBs[(i * 2) + 1]) * s16X[ChOffset + i]) >> 16); \ - s32DCTY[i] += (gas32CoeffFor4SBs[(i + 8) * 2] * s16X[ChOffset + i + 8]) + (((SINT32)(UINT16)(gas32CoeffFor4SBs[((i + 8) * 2) + 1]) * s16X[ChOffset + i + 8]) >> 16); \ - s32DCTY[i] += (gas32CoeffFor4SBs[(i + 16) * 2] * s16X[ChOffset + i + 16]) + (((SINT32)(UINT16)(gas32CoeffFor4SBs[((i + 16) * 2) + 1]) * s16X[ChOffset + i + 16]) >> 16); \ - s32DCTY[i] += (gas32CoeffFor4SBs[(i + 24) * 2] * s16X[ChOffset + i + 24]) + (((SINT32)(UINT16)(gas32CoeffFor4SBs[((i + 24) * 2) + 1]) * s16X[ChOffset + i + 24]) >> 16); \ - s32DCTY[i] += (gas32CoeffFor4SBs[(i + 32) * 2] * s16X[ChOffset + i + 32]) + (((SINT32)(UINT16)(gas32CoeffFor4SBs[((i + 32) * 2) + 1]) * s16X[ChOffset + i + 32]) >> 16); \ - } -#endif -#define WINDOW_PARTIAL_4 \ - { \ - WINDOW_ACCU_4(0); \ - WINDOW_ACCU_4(1); \ - WINDOW_ACCU_4(2); \ - WINDOW_ACCU_4(3); \ - WINDOW_ACCU_4(4); \ - WINDOW_ACCU_4(5); \ - WINDOW_ACCU_4(6); \ - WINDOW_ACCU_4(7); \ - } - -#if (SBC_IS_64_MULT_IN_WINDOW_ACCU == TRUE) -#define WINDOW_ACCU_8(i) \ - { \ - s64Temp = ((((SINT64)gas32CoeffFor8SBs[i] * (SINT64)s16X[ChOffset + i]))); \ - s64Temp += ((((SINT64)gas32CoeffFor8SBs[(i + 16)] * (SINT64)s16X[ChOffset + i + 16]))); \ - s64Temp += ((((SINT64)gas32CoeffFor8SBs[(i + 32)] * (SINT64)s16X[ChOffset + i + 32]))); \ - s64Temp += ((((SINT64)gas32CoeffFor8SBs[(i + 48)] * (SINT64)s16X[ChOffset + i + 48]))); \ - s64Temp += ((((SINT64)gas32CoeffFor8SBs[(i + 64)] * (SINT64)s16X[ChOffset + i + 64]))); \ - /*BT_WARN("s32DCTY8: %d= 0x%x * %d\n", s32DCTY[i], gas32CoeffFor8SBs[i], s16X[ChOffset+i]);*/ \ - s32DCTY[i] = (SINT32)(s64Temp >> 16); \ - } -#else -#define WINDOW_ACCU_8(i) \ - { \ - s32DCTY[i] = (gas32CoeffFor8SBs[i * 2] * s16X[ChOffset + i]) + (((SINT32)(UINT16)(gas32CoeffFor8SBs[(i * 2) + 1]) * s16X[ChOffset + i]) >> 16); \ - s32DCTY[i] += (gas32CoeffFor8SBs[(i + 16) * 2] * s16X[ChOffset + i + 16]) + (((SINT32)(UINT16)(gas32CoeffFor8SBs[((i + 16) * 2) + 1]) * s16X[ChOffset + i + 16]) >> 16); \ - s32DCTY[i] += (gas32CoeffFor8SBs[(i + 32) * 2] * s16X[ChOffset + i + 32]) + (((SINT32)(UINT16)(gas32CoeffFor8SBs[((i + 32) * 2) + 1]) * s16X[ChOffset + i + 32]) >> 16); \ - s32DCTY[i] += (gas32CoeffFor8SBs[(i + 48) * 2] * s16X[ChOffset + i + 48]) + (((SINT32)(UINT16)(gas32CoeffFor8SBs[((i + 48) * 2) + 1]) * s16X[ChOffset + i + 48]) >> 16); \ - s32DCTY[i] += (gas32CoeffFor8SBs[(i + 64) * 2] * s16X[ChOffset + i + 64]) + (((SINT32)(UINT16)(gas32CoeffFor8SBs[((i + 64) * 2) + 1]) * s16X[ChOffset + i + 64]) >> 16); \ - /*BT_WARN("s32DCTY8: %d = 0x%4x%4x * %d\n", s32DCTY[i], gas32CoeffFor8SBs[i * 2], (gas32CoeffFor8SBs[(i * 2) + 1]), s16X[ChOffset+i]);*/ \ - /*s32DCTY[i]=(SINT32)(s64Temp>>16);*/ \ - } -#endif -#define WINDOW_PARTIAL_8 \ - { \ - WINDOW_ACCU_8(0); \ - WINDOW_ACCU_8(1); \ - WINDOW_ACCU_8(2); \ - WINDOW_ACCU_8(3); \ - WINDOW_ACCU_8(4); \ - WINDOW_ACCU_8(5); \ - WINDOW_ACCU_8(6); \ - WINDOW_ACCU_8(7); \ - WINDOW_ACCU_8(8); \ - WINDOW_ACCU_8(9); \ - WINDOW_ACCU_8(10); \ - WINDOW_ACCU_8(11); \ - WINDOW_ACCU_8(12); \ - WINDOW_ACCU_8(13); \ - WINDOW_ACCU_8(14); \ - WINDOW_ACCU_8(15); \ - } -#endif -#endif - -static SINT16 ShiftCounter = 0; -extern SINT16 EncMaxShiftCounter; -/**************************************************************************** - * SbcAnalysisFilter - performs Analysis of the input audio stream - * - * RETURNS : N/A - */ -void SbcAnalysisFilter4(SBC_ENC_PARAMS *pstrEncParams) { - SINT16 *ps16PcmBuf; - SINT32 *ps32SbBuf; - SINT32 s32Blk, s32Ch; - SINT32 s32NumOfChannels, s32NumOfBlocks; - SINT32 i, *ps32X, *ps32X2; - SINT32 Offset, Offset2, ChOffset; -#if (SBC_ARM_ASM_OPT == TRUE) - register SINT32 s32Hi, s32Hi2; -#else -#if (SBC_IPAQ_OPT == TRUE) -#if (SBC_IS_64_MULT_IN_WINDOW_ACCU == TRUE) - register SINT64 s64Temp, s64Temp2; -#else - register SINT32 s32Temp, s32Temp2; -#endif -#else - -#if (SBC_IS_64_MULT_IN_WINDOW_ACCU == TRUE) - SINT64 s64Temp; -#endif - -#endif -#endif - - s32NumOfChannels = pstrEncParams->s16NumOfChannels; - s32NumOfBlocks = pstrEncParams->s16NumOfBlocks; - - ps16PcmBuf = pstrEncParams->ps16NextPcmBuffer; - - ps32SbBuf = pstrEncParams->s32SbBuffer; - Offset2 = (SINT32)(EncMaxShiftCounter + 40); - for (s32Blk = 0; s32Blk < s32NumOfBlocks; s32Blk++) { - Offset = (SINT32)(EncMaxShiftCounter - ShiftCounter); - /* Store new samples */ - if (s32NumOfChannels == 1) { - s16X[3 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[2 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[1 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[0 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - } else { - s16X[3 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[Offset2 + 3 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[2 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[Offset2 + 2 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[1 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[Offset2 + 1 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[0 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[Offset2 + 0 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - } - for (s32Ch = 0; s32Ch < s32NumOfChannels; s32Ch++) { - ChOffset = s32Ch * Offset2 + Offset; - - WINDOW_PARTIAL_4 - - SBC_FastIDCT4(s32DCTY, ps32SbBuf); - - ps32SbBuf += SUB_BANDS_4; - } - if (s32NumOfChannels == 1) { - if (ShiftCounter >= EncMaxShiftCounter) { - SHIFTUP_X4; - ShiftCounter = 0; - } else { - ShiftCounter += SUB_BANDS_4; - } - } else { - if (ShiftCounter >= EncMaxShiftCounter) { - SHIFTUP_X4_2; - ShiftCounter = 0; - } else { - ShiftCounter += SUB_BANDS_4; - } - } - } -} - -/* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// */ -void SbcAnalysisFilter8(SBC_ENC_PARAMS *pstrEncParams) { - SINT16 *ps16PcmBuf; - SINT32 *ps32SbBuf; - SINT32 s32Blk, s32Ch; /* counter for block*/ - SINT32 Offset, Offset2; - SINT32 s32NumOfChannels, s32NumOfBlocks; - SINT32 i, *ps32X, *ps32X2; - SINT32 ChOffset; -#if (SBC_ARM_ASM_OPT == TRUE) - register SINT32 s32Hi, s32Hi2; -#else -#if (SBC_IPAQ_OPT == TRUE) -#if (SBC_IS_64_MULT_IN_WINDOW_ACCU == TRUE) - register SINT64 s64Temp, s64Temp2; -#else - register SINT32 s32Temp, s32Temp2; -#endif -#else -#if (SBC_IS_64_MULT_IN_WINDOW_ACCU == TRUE) - SINT64 s64Temp; -#endif -#endif -#endif - - s32NumOfChannels = pstrEncParams->s16NumOfChannels; - s32NumOfBlocks = pstrEncParams->s16NumOfBlocks; - - ps16PcmBuf = pstrEncParams->ps16NextPcmBuffer; - - ps32SbBuf = pstrEncParams->s32SbBuffer; - Offset2 = (SINT32)(EncMaxShiftCounter + 80); - for (s32Blk = 0; s32Blk < s32NumOfBlocks; s32Blk++) { - Offset = (SINT32)(EncMaxShiftCounter - ShiftCounter); - /* Store new samples */ - if (s32NumOfChannels == 1) { - s16X[7 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[6 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[5 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[4 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[3 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[2 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[1 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[0 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - } else { - s16X[7 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[Offset2 + 7 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[6 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[Offset2 + 6 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[5 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[Offset2 + 5 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[4 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[Offset2 + 4 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[3 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[Offset2 + 3 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[2 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[Offset2 + 2 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[1 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[Offset2 + 1 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[0 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - s16X[Offset2 + 0 + Offset] = *ps16PcmBuf; - ps16PcmBuf++; - } - for (s32Ch = 0; s32Ch < s32NumOfChannels; s32Ch++) { - ChOffset = s32Ch * Offset2 + Offset; - - WINDOW_PARTIAL_8 - - SBC_FastIDCT8(s32DCTY, ps32SbBuf); - - ps32SbBuf += SUB_BANDS_8; - } - if (s32NumOfChannels == 1) { - if (ShiftCounter >= EncMaxShiftCounter) { - SHIFTUP_X8; - ShiftCounter = 0; - } else { - ShiftCounter += SUB_BANDS_8; - } - } else { - if (ShiftCounter >= EncMaxShiftCounter) { - SHIFTUP_X8_2; - ShiftCounter = 0; - } else { - ShiftCounter += SUB_BANDS_8; - } - } - } -} - -void SbcAnalysisInit(void) { - static bool loaded = false; - if (!loaded) { - loaded = true; -#if BT_BLE_DYNAMIC_ENV_MEMORY == TRUE - s32X = (SINT32 *)osi_malloc(sizeof(SINT32) * (ENC_VX_BUFFER_SIZE / 2)); - s32DCTY = (SINT32 *)osi_malloc(sizeof(SINT32) * 16); - assert(s32X); - assert(s32DCTY); - memset(s32X, 0, sizeof(SINT16) * ENC_VX_BUFFER_SIZE); - memset(s32DCTY, 0, sizeof(SINT32) * 16); - s16X = (SINT16 *)s32X; -#endif - } - memset(s16X, 0, ENC_VX_BUFFER_SIZE * sizeof(SINT16)); - ShiftCounter = 0; -} - -#endif /* #if defined(SBC_ENC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_dct.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_dct.c deleted file mode 100644 index 22011a84..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_dct.c +++ /dev/null @@ -1,239 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1999-2012 Broadcom Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/****************************************************************************** - * - * source file for fast dct operations - * - ******************************************************************************/ -#include "sbc_dct.h" -#include "sbc_enc_func_declare.h" -#include "sbc_encoder.h" - -#if defined(SBC_ENC_INCLUDED) - -/******************************************************************************* -** -** Function SBC_FastIDCT8 -** -** Description implementation of fast DCT algorithm by Feig and Winograd -** -** -** Returns y = dct(pInVect) -** -** -*******************************************************************************/ - -#if (SBC_IS_64_MULT_IN_IDCT == FALSE) -#define SBC_COS_PI_SUR_4 (0x00005a82) /* ((0x8000) * 0.7071) = cos(pi/4) */ -#define SBC_COS_PI_SUR_8 (0x00007641) /* ((0x8000) * 0.9239) = (cos(pi/8)) */ -#define SBC_COS_3PI_SUR_8 (0x000030fb) /* ((0x8000) * 0.3827) = (cos(3*pi/8)) */ -#define SBC_COS_PI_SUR_16 (0x00007d8a) /* ((0x8000) * 0.9808)) = (cos(pi/16)) */ -#define SBC_COS_3PI_SUR_16 (0x00006a6d) /* ((0x8000) * 0.8315)) = (cos(3*pi/16)) */ -#define SBC_COS_5PI_SUR_16 (0x0000471c) /* ((0x8000) * 0.5556)) = (cos(5*pi/16)) */ -#define SBC_COS_7PI_SUR_16 (0x000018f8) /* ((0x8000) * 0.1951)) = (cos(7*pi/16)) */ -#define SBC_IDCT_MULT(a, b, c) SBC_MULT_32_16_SIMPLIFIED(a, b, c) -#else -#define SBC_COS_PI_SUR_4 (0x5A827999) /* ((0x80000000) * 0.707106781) = (cos(pi/4) ) */ -#define SBC_COS_PI_SUR_8 (0x7641AF3C) /* ((0x80000000) * 0.923879533) = (cos(pi/8) ) */ -#define SBC_COS_3PI_SUR_8 (0x30FBC54D) /* ((0x80000000) * 0.382683432) = (cos(3*pi/8) ) */ -#define SBC_COS_PI_SUR_16 (0x7D8A5F3F) /* ((0x80000000) * 0.98078528 )) = (cos(pi/16) ) */ -#define SBC_COS_3PI_SUR_16 (0x6A6D98A4) /* ((0x80000000) * 0.831469612)) = (cos(3*pi/16)) */ -#define SBC_COS_5PI_SUR_16 (0x471CECE6) /* ((0x80000000) * 0.555570233)) = (cos(5*pi/16)) */ -#define SBC_COS_7PI_SUR_16 (0x18F8B83C) /* ((0x80000000) * 0.195090322)) = (cos(7*pi/16)) */ -#define SBC_IDCT_MULT(a, b, c) SBC_MULT_32_32(a, b, c) -#endif /* SBC_IS_64_MULT_IN_IDCT */ - -#if (SBC_FAST_DCT == FALSE) -extern const SINT16 gas16AnalDCTcoeff8[]; -extern const SINT16 gas16AnalDCTcoeff4[]; -#endif - -void SBC_FastIDCT8(SINT32 *pInVect, SINT32 *pOutVect) { -#if (SBC_FAST_DCT == TRUE) -#if (SBC_ARM_ASM_OPT == TRUE) -#else -#if (SBC_IPAQ_OPT == TRUE) -#if (SBC_IS_64_MULT_IN_IDCT == TRUE) - SINT64 s64Temp; -#endif -#else -#if (SBC_IS_64_MULT_IN_IDCT == TRUE) - SINT32 s32HiTemp; -#else - SINT32 s32In2Temp; - register SINT32 s32In1Temp; -#endif -#endif -#endif - - register SINT32 x0, x1, x2, x3, x4, x5, x6, x7, temp; - SINT32 res_even[4], res_odd[4]; - /*x0= (pInVect[4])/2 ;*/ - SBC_IDCT_MULT(SBC_COS_PI_SUR_4, pInVect[4], x0); - /*BT_WARN("x0 0x%x = %d = %d * %d\n", x0, x0, SBC_COS_PI_SUR_4, pInVect[4]);*/ - - x1 = (pInVect[3] + pInVect[5]) >> 1; - x2 = (pInVect[2] + pInVect[6]) >> 1; - x3 = (pInVect[1] + pInVect[7]) >> 1; - x4 = (pInVect[0] + pInVect[8]) >> 1; - x5 = (pInVect[9] - pInVect[15]) >> 1; - x6 = (pInVect[10] - pInVect[14]) >> 1; - x7 = (pInVect[11] - pInVect[13]) >> 1; - - /* 2-point IDCT of x0 and x4 as in (11) */ - temp = x0; - SBC_IDCT_MULT(SBC_COS_PI_SUR_4, (x0 + x4), x0); /*x0 = ( x0 + x4 ) * cos(1*pi/4) ; */ - SBC_IDCT_MULT(SBC_COS_PI_SUR_4, (temp - x4), x4); /*x4 = ( temp - x4 ) * cos(1*pi/4) ; */ - - /* rearrangement of x2 and x6 as in (15) */ - x2 -= x6; - x6 <<= 1; - - /* 2-point IDCT of x2 and x6 and post-multiplication as in (15) */ - SBC_IDCT_MULT(SBC_COS_PI_SUR_4, x6, x6); /*x6 = x6 * cos(1*pi/4) ; */ - temp = x2; - SBC_IDCT_MULT(SBC_COS_PI_SUR_8, (x2 + x6), x2); /*x2 = ( x2 + x6 ) * cos(1*pi/8) ; */ - SBC_IDCT_MULT(SBC_COS_3PI_SUR_8, (temp - x6), x6); /*x6 = ( temp - x6 ) * cos(3*pi/8) ;*/ - - /* 4-point IDCT of x0,x2,x4 and x6 as in (11) */ - res_even[0] = x0 + x2; - res_even[1] = x4 + x6; - res_even[2] = x4 - x6; - res_even[3] = x0 - x2; - - /* rearrangement of x1,x3,x5,x7 as in (15) */ - x7 <<= 1; - x5 = (x5 << 1) - x7; - x3 = (x3 << 1) - x5; - x1 -= x3 >> 1; - - /* two-dimensional IDCT of x1 and x5 */ - SBC_IDCT_MULT(SBC_COS_PI_SUR_4, x5, x5); /*x5 = x5 * cos(1*pi/4) ; */ - temp = x1; - x1 = x1 + x5; - x5 = temp - x5; - - /* rearrangement of x3 and x7 as in (15) */ - x3 -= x7; - x7 <<= 1; - SBC_IDCT_MULT(SBC_COS_PI_SUR_4, x7, x7); /*x7 = x7 * cos(1*pi/4) ; */ - - /* 2-point IDCT of x3 and x7 and post-multiplication as in (15) */ - temp = x3; - SBC_IDCT_MULT(SBC_COS_PI_SUR_8, (x3 + x7), x3); /*x3 = ( x3 + x7 ) * cos(1*pi/8) ; */ - SBC_IDCT_MULT(SBC_COS_3PI_SUR_8, (temp - x7), x7); /*x7 = ( temp - x7 ) * cos(3*pi/8) ;*/ - - /* 4-point IDCT of x1,x3,x5 and x7 and post multiplication by diagonal matrix as in (14) */ - SBC_IDCT_MULT((SBC_COS_PI_SUR_16), (x1 + x3), res_odd[0]); /*res_odd[ 0 ] = ( x1 + x3 ) * cos(1*pi/16) ; */ - SBC_IDCT_MULT((SBC_COS_3PI_SUR_16), (x5 + x7), res_odd[1]); /*res_odd[ 1 ] = ( x5 + x7 ) * cos(3*pi/16) ; */ - SBC_IDCT_MULT((SBC_COS_5PI_SUR_16), (x5 - x7), res_odd[2]); /*res_odd[ 2 ] = ( x5 - x7 ) * cos(5*pi/16) ; */ - SBC_IDCT_MULT((SBC_COS_7PI_SUR_16), (x1 - x3), res_odd[3]); /*res_odd[ 3 ] = ( x1 - x3 ) * cos(7*pi/16) ; */ - - /* additions and subtractions as in (9) */ - pOutVect[0] = (res_even[0] + res_odd[0]); - pOutVect[1] = (res_even[1] + res_odd[1]); - pOutVect[2] = (res_even[2] + res_odd[2]); - pOutVect[3] = (res_even[3] + res_odd[3]); - pOutVect[7] = (res_even[0] - res_odd[0]); - pOutVect[6] = (res_even[1] - res_odd[1]); - pOutVect[5] = (res_even[2] - res_odd[2]); - pOutVect[4] = (res_even[3] - res_odd[3]); -#else - UINT8 Index, k; - SINT32 temp; - /*Calculate 4 subband samples by matrixing*/ - for (Index = 0; Index < 8; Index++) { - temp = 0; - for (k = 0; k < 16; k++) { - /*temp += (SINT32)(((SINT64)M[(Index*strEncParams->numOfSubBands*2)+k] * Y[k]) >> 16 );*/ - temp += (gas16AnalDCTcoeff8[(Index * 8 * 2) + k] * (pInVect[k] >> 16)); - temp += ((gas16AnalDCTcoeff8[(Index * 8 * 2) + k] * (pInVect[k] & 0xFFFF)) >> 16); - } - pOutVect[Index] = temp; - } -#endif - /* BT_WARN("pOutVect: 0x%x;0x%x;0x%x;0x%x;0x%x;0x%x;0x%x;0x%x\n",\ - pOutVect[0],pOutVect[1],pOutVect[2],pOutVect[3],pOutVect[4],pOutVect[5],pOutVect[6],pOutVect[7]);*/ -} - -/******************************************************************************* -** -** Function SBC_FastIDCT4 -** -** Description implementation of fast DCT algorithm by Feig and Winograd -** -** -** Returns y = dct(x0) -** -** -*******************************************************************************/ -void SBC_FastIDCT4(SINT32 *pInVect, SINT32 *pOutVect) { -#if (SBC_FAST_DCT == TRUE) -#if (SBC_ARM_ASM_OPT == TRUE) -#else -#if (SBC_IPAQ_OPT == TRUE) -#if (SBC_IS_64_MULT_IN_IDCT == TRUE) - SINT64 s64Temp; -#endif -#else -#if (SBC_IS_64_MULT_IN_IDCT == TRUE) - SINT32 s32HiTemp; -#else - UINT16 s32In2Temp; - SINT32 s32In1Temp; -#endif -#endif -#endif - SINT32 temp, x2; - SINT32 tmp[8]; - - x2 = pInVect[2] >> 1; - temp = (pInVect[0] + pInVect[4]); - SBC_IDCT_MULT((SBC_COS_PI_SUR_4 >> 1), temp, tmp[0]); - tmp[1] = x2 - tmp[0]; - tmp[0] += x2; - temp = (pInVect[1] + pInVect[3]); - SBC_IDCT_MULT((SBC_COS_3PI_SUR_8 >> 1), temp, tmp[3]); - SBC_IDCT_MULT((SBC_COS_PI_SUR_8 >> 1), temp, tmp[2]); - temp = (pInVect[5] - pInVect[7]); - SBC_IDCT_MULT((SBC_COS_3PI_SUR_8 >> 1), temp, tmp[5]); - SBC_IDCT_MULT((SBC_COS_PI_SUR_8 >> 1), temp, tmp[4]); - tmp[6] = tmp[2] + tmp[5]; - tmp[7] = tmp[3] - tmp[4]; - pOutVect[0] = (tmp[0] + tmp[6]); - pOutVect[1] = (tmp[1] + tmp[7]); - pOutVect[2] = (tmp[1] - tmp[7]); - pOutVect[3] = (tmp[0] - tmp[6]); -#else - UINT8 Index, k; - SINT32 temp; - /*Calculate 4 subband samples by matrixing*/ - for (Index = 0; Index < 4; Index++) { - temp = 0; - for (k = 0; k < 8; k++) { - /*temp += (SINT32)(((SINT64)M[(Index*strEncParams->numOfSubBands*2)+k] * Y[k]) >> 16 ); */ - temp += (gas16AnalDCTcoeff4[(Index * 4 * 2) + k] * (pInVect[k] >> 16)); - temp += ((gas16AnalDCTcoeff4[(Index * 4 * 2) + k] * (pInVect[k] & 0xFFFF)) >> 16); - } - pOutVect[Index] = temp; - } -#endif -} - -#endif /* #if defined(SBC_ENC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_dct.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_dct.h deleted file mode 100644 index 78671b35..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_dct.h +++ /dev/null @@ -1,87 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1999-2012 Broadcom Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/****************************************************************************** - * - * Definitions for the fast DCT. - * - ******************************************************************************/ - -#ifndef SBC_DCT_H -#define SBC_DCT_H - -#if (SBC_ARM_ASM_OPT == TRUE) -#define SBC_MULT_32_16_SIMPLIFIED(s16In2, s32In1, s32OutLow) \ - { \ - __asm { \ - MUL s32OutLow,(SINT32)s16In2, (s32In1>>15) \ - } \ - } -#else -#if (SBC_DSP_OPT == TRUE) -#define SBC_MULT_32_16_SIMPLIFIED(s16In2, s32In1, s32OutLow) s32OutLow = SBC_Multiply_32_16_Simplified((SINT32)s16In2, s32In1); -#else -#if (SBC_IPAQ_OPT == TRUE) -/*#define SBC_MULT_32_16_SIMPLIFIED(s16In2, s32In1 , s32OutLow) s32OutLow=(SINT32)((SINT32)(s16In2)*(SINT32)(s32In1>>15)); */ -#define SBC_MULT_32_16_SIMPLIFIED(s16In2, s32In1, s32OutLow) s32OutLow = (SINT32)(((SINT64)s16In2 * (SINT64)s32In1) >> 15); -#if (SBC_IS_64_MULT_IN_IDCT == TRUE) -#define SBC_MULT_32_32(s32In2, s32In1, s32OutLow) \ - { \ - s64Temp = ((SINT64)s32In2) * ((SINT64)s32In1) >> 31; \ - s32OutLow = (SINT32)s64Temp; \ - } -#endif -#else -#define SBC_MULT_32_16_SIMPLIFIED(s16In2, s32In1, s32OutLow) \ - { \ - s32In1Temp = s32In1; \ - s32In2Temp = (SINT32)s16In2; \ - \ - /* Multiply one +ve and the other -ve number */ \ - if (s32In1Temp < 0) { \ - s32In1Temp ^= 0xFFFFFFFF; \ - s32In1Temp++; \ - s32OutLow = (s32In2Temp * (s32In1Temp >> 16)); \ - s32OutLow += ((s32In2Temp * (s32In1Temp & 0xFFFF)) >> 16); \ - s32OutLow ^= 0xFFFFFFFF; \ - s32OutLow++; \ - } else { \ - s32OutLow = (s32In2Temp * (s32In1Temp >> 16)); \ - s32OutLow += ((s32In2Temp * (s32In1Temp & 0xFFFF)) >> 16); \ - } \ - s32OutLow <<= 1; \ - } -#if (SBC_IS_64_MULT_IN_IDCT == TRUE) -#define SBC_MULT_64(s32In1, s32In2, s32OutLow, s32OutHi) \ - { \ - s32OutLow = (SINT32)(((SINT64)s32In1 * (SINT64)s32In2) & 0x00000000FFFFFFFF); \ - s32OutHi = (SINT32)(((SINT64)s32In1 * (SINT64)s32In2) >> 32); \ - } -#define SBC_MULT_32_32(s32In2, s32In1, s32OutLow) \ - { \ - s32HiTemp = 0; \ - SBC_MULT_64(s32In2, s32In1, s32OutLow, s32HiTemp); \ - s32OutLow = (((s32OutLow >> 15) & 0x1FFFF) | (s32HiTemp << 17)); \ - } -#endif - -#endif -#endif -#endif - -#endif diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_dct_coeffs.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_dct_coeffs.c deleted file mode 100644 index 2cec78cf..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_dct_coeffs.c +++ /dev/null @@ -1,67 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1999-2012 Broadcom Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/****************************************************************************** - * - * This file contains the coefficient table used for DCT computation in - * analysis. - * - ******************************************************************************/ - -#include "sbc_encoder.h" - -#if defined(SBC_ENC_INCLUDED) - -/*DCT coeff for 4 sub-band case.*/ -#if (SBC_FAST_DCT == FALSE) -const SINT16 gas16AnalDCTcoeff4[] = {(SINT16)(0.7071 * 32768), (SINT16)(0.9239 * 32768), (SINT16)(1.0000 * 32767), (SINT16)(0.9239 * 32768), - (SINT16)(0.7071 * 32768), (SINT16)(0.3827 * 32768), (SINT16)(0.0000 * 32768), (SINT16)(-0.3827 * 32768), - - (SINT16)(-0.7071 * 32768), (SINT16)(0.3827 * 32768), (SINT16)(1.0000 * 32767), (SINT16)(0.3827 * 32768), - (SINT16)(-0.7071 * 32768), (SINT16)(-0.9239 * 32768), (SINT16)(-0.0000 * 32768), (SINT16)(0.9239 * 32768), - - (SINT16)(-0.7071 * 32768), (SINT16)(-0.3827 * 32768), (SINT16)(1.0000 * 32767), (SINT16)(-0.3827 * 32768), - (SINT16)(-0.7071 * 32768), (SINT16)(0.9239 * 32768), (SINT16)(0.0000 * 32768), (SINT16)(-0.9239 * 32768), - - (SINT16)(0.7071 * 32768), (SINT16)(-0.9239 * 32768), (SINT16)(1.0000 * 32767), (SINT16)(-0.9239 * 32768), - (SINT16)(0.7071 * 32768), (SINT16)(-0.3827 * 32768), (SINT16)(-0.0000 * 32768), (SINT16)(0.3827 * 32768)}; - -/*DCT coeff for 8 sub-band case.*/ -const SINT16 gas16AnalDCTcoeff8[] = { - (SINT16)(0.7071 * 32768), (SINT16)(0.8315 * 32768), (SINT16)(0.9239 * 32768), (SINT16)(0.9808 * 32768), (SINT16)(1.0000 * 32767), (SINT16)(0.9808 * 32768), (SINT16)(0.9239 * 32768), - (SINT16)(0.8315 * 32768), (SINT16)(0.7071 * 32768), (SINT16)(0.5556 * 32768), (SINT16)(0.3827 * 32768), (SINT16)(0.1951 * 32768), (SINT16)(0.0000 * 32768), (SINT16)(-0.1951 * 32768), - (SINT16)(-0.3827 * 32768), (SINT16)(-0.5556 * 32768), (SINT16)(-0.7071 * 32768), (SINT16)(-0.1951 * 32768), (SINT16)(0.3827 * 32768), (SINT16)(0.8315 * 32768), (SINT16)(1.0000 * 32767), - (SINT16)(0.8315 * 32768), (SINT16)(0.3827 * 32768), (SINT16)(-0.1951 * 32768), (SINT16)(-0.7071 * 32768), (SINT16)(-0.9808 * 32768), (SINT16)(-0.9239 * 32768), (SINT16)(-0.5556 * 32768), - (SINT16)(-0.0000 * 32768), (SINT16)(0.5556 * 32768), (SINT16)(0.9239 * 32768), (SINT16)(0.9808 * 32768), (SINT16)(-0.7071 * 32768), (SINT16)(-0.9808 * 32768), (SINT16)(-0.3827 * 32768), - (SINT16)(0.5556 * 32768), (SINT16)(1.0000 * 32767), (SINT16)(0.5556 * 32768), (SINT16)(-0.3827 * 32768), (SINT16)(-0.9808 * 32768), (SINT16)(-0.7071 * 32768), (SINT16)(0.1951 * 32768), - (SINT16)(0.9239 * 32768), (SINT16)(0.8315 * 32768), (SINT16)(0.0000 * 32768), (SINT16)(-0.8315 * 32768), (SINT16)(-0.9239 * 32768), (SINT16)(-0.1951 * 32768), (SINT16)(0.7071 * 32768), - (SINT16)(-0.5556 * 32768), (SINT16)(-0.9239 * 32768), (SINT16)(0.1951 * 32768), (SINT16)(1.0000 * 32767), (SINT16)(0.1951 * 32768), (SINT16)(-0.9239 * 32768), (SINT16)(-0.5556 * 32768), - (SINT16)(0.7071 * 32768), (SINT16)(0.8315 * 32768), (SINT16)(-0.3827 * 32768), (SINT16)(-0.9808 * 32768), (SINT16)(-0.0000 * 32768), (SINT16)(0.9808 * 32768), (SINT16)(0.3827 * 32768), - (SINT16)(-0.8315 * 32768), (SINT16)(0.7071 * 32768), (SINT16)(0.5556 * 32768), (SINT16)(-0.9239 * 32768), (SINT16)(-0.1951 * 32768), (SINT16)(1.0000 * 32767), (SINT16)(-0.1951 * 32768), - (SINT16)(-0.9239 * 32768), (SINT16)(0.5556 * 32768), (SINT16)(0.7071 * 32768), (SINT16)(-0.8315 * 32768), (SINT16)(-0.3827 * 32768), (SINT16)(0.9808 * 32768), (SINT16)(0.0000 * 32768), - (SINT16)(-0.9808 * 32768), (SINT16)(0.3827 * 32768), (SINT16)(0.8315 * 32768), (SINT16)(-0.7071 * 32768), (SINT16)(0.9808 * 32768), (SINT16)(-0.3827 * 32768), (SINT16)(-0.5556 * 32768), - (SINT16)(1.0000 * 32767), (SINT16)(-0.5556 * 32768), (SINT16)(-0.3827 * 32768), (SINT16)(0.9808 * 32768), (SINT16)(-0.7071 * 32768), (SINT16)(-0.1951 * 32768), (SINT16)(0.9239 * 32768), - (SINT16)(-0.8315 * 32768), (SINT16)(-0.0000 * 32768), (SINT16)(0.8315 * 32768), (SINT16)(-0.9239 * 32768), (SINT16)(0.1951 * 32768), (SINT16)(-0.7071 * 32768), (SINT16)(0.1951 * 32768), - (SINT16)(0.3827 * 32768), (SINT16)(-0.8315 * 32768), (SINT16)(1.0000 * 32767), (SINT16)(-0.8315 * 32768), (SINT16)(0.3827 * 32768), (SINT16)(0.1951 * 32768), (SINT16)(-0.7071 * 32768), - (SINT16)(0.9808 * 32768), (SINT16)(-0.9239 * 32768), (SINT16)(0.5556 * 32768), (SINT16)(-0.0000 * 32768), (SINT16)(-0.5556 * 32768), (SINT16)(0.9239 * 32768), (SINT16)(-0.9808 * 32768), - (SINT16)(0.7071 * 32768), (SINT16)(-0.8315 * 32768), (SINT16)(0.9239 * 32768), (SINT16)(-0.9808 * 32768), (SINT16)(1.0000 * 32767), (SINT16)(-0.9808 * 32768), (SINT16)(0.9239 * 32768), - (SINT16)(-0.8315 * 32768), (SINT16)(0.7071 * 32768), (SINT16)(-0.5556 * 32768), (SINT16)(0.3827 * 32768), (SINT16)(-0.1951 * 32768), (SINT16)(-0.0000 * 32768), (SINT16)(0.1951 * 32768), - (SINT16)(-0.3827 * 32768), (SINT16)(0.5556 * 32768)}; -#endif - -#endif /* #if defined(SBC_ENC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_enc_bit_alloc_mono.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_enc_bit_alloc_mono.c deleted file mode 100644 index 6d42695d..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_enc_bit_alloc_mono.c +++ /dev/null @@ -1,183 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1999-2012 Broadcom Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/****************************************************************************** - * - * This file contains the code for bit allocation algorithm. It calculates - * the number of bits required for the encoded stream of data. - * - ******************************************************************************/ - -/*Includes*/ -#include "sbc_enc_func_declare.h" -#include "sbc_encoder.h" - -#if defined(SBC_ENC_INCLUDED) - -/*global arrays*/ -const SINT16 sbc_enc_as16Offset4[4][4] = { - {-1, 0, 0, 0}, - {-2, 0, 0, 1}, - {-2, 0, 0, 1}, - {-2, 0, 0, 1} -}; -const SINT16 sbc_enc_as16Offset8[4][8] = { - {-2, 0, 0, 0, 0, 0, 0, 1}, - {-3, 0, 0, 0, 0, 0, 1, 2}, - {-4, 0, 0, 0, 0, 0, 1, 2}, - {-4, 0, 0, 0, 0, 0, 1, 2} -}; - -/**************************************************************************** - * BitAlloc - Calculates the required number of bits for the given scale factor - * and the number of subbands. - * - * RETURNS : N/A - */ - -void sbc_enc_bit_alloc_mono(SBC_ENC_PARAMS *pstrCodecParams) { - SINT32 s32MaxBitNeed; /*to store the max bits needed per sb*/ - SINT32 s32BitCount; /*the used number of bits*/ - SINT32 s32SliceCount; /*to store hwo many slices can be put in bitpool*/ - SINT32 s32BitSlice; /*number of bitslices in bitpool*/ - SINT32 s32Sb; /*counter for sub-band*/ - SINT32 s32Ch; /*counter for channel*/ - SINT16 *ps16BitNeed; /*temp memory to store required number of bits*/ - SINT32 s32Loudness; /*used in Loudness calculation*/ - SINT16 *ps16GenBufPtr; - SINT16 *ps16GenArrPtr; - SINT16 *ps16GenTabPtr; - SINT32 s32NumOfSubBands = pstrCodecParams->s16NumOfSubBands; - - ps16BitNeed = pstrCodecParams->s16ScartchMemForBitAlloc; - - for (s32Ch = 0; s32Ch < pstrCodecParams->s16NumOfChannels; s32Ch++) { - ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands; - ps16GenArrPtr = pstrCodecParams->as16Bits + s32Ch * SBC_MAX_NUM_OF_SUBBANDS; - - /* bitneed values are derived from scale factor */ - if (pstrCodecParams->s16AllocationMethod == SBC_SNR) { - ps16BitNeed = pstrCodecParams->as16ScaleFactor; - ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands; - } else { - ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands; - if (s32NumOfSubBands == 4) { - ps16GenTabPtr = (SINT16 *)sbc_enc_as16Offset4[pstrCodecParams->s16SamplingFreq]; - } else { - ps16GenTabPtr = (SINT16 *)sbc_enc_as16Offset8[pstrCodecParams->s16SamplingFreq]; - } - for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++) { - if (pstrCodecParams->as16ScaleFactor[s32Ch * s32NumOfSubBands + s32Sb] == 0) { - *(ps16GenBufPtr) = -5; - } else { - s32Loudness = (SINT32)(pstrCodecParams->as16ScaleFactor[s32Ch * s32NumOfSubBands + s32Sb] - *ps16GenTabPtr); - if (s32Loudness > 0) { - *(ps16GenBufPtr) = (SINT16)(s32Loudness >> 1); - } else { - *(ps16GenBufPtr) = (SINT16)s32Loudness; - } - } - ps16GenBufPtr++; - ps16GenTabPtr++; - } - } - - /* max bitneed index is searched*/ - s32MaxBitNeed = 0; - ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands; - for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++) { - if (*(ps16GenBufPtr) > s32MaxBitNeed) { - s32MaxBitNeed = *(ps16GenBufPtr); - } - - ps16GenBufPtr++; - } - ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands; - /*iterative process to find hwo many bitslices fit into the bitpool*/ - s32BitSlice = s32MaxBitNeed + 1; - s32BitCount = pstrCodecParams->s16BitPool; - s32SliceCount = 0; - do { - s32BitSlice--; - s32BitCount -= s32SliceCount; - s32SliceCount = 0; - - for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++) { - if ((((*ps16GenBufPtr - s32BitSlice) < 16) && (*ps16GenBufPtr - s32BitSlice) >= 1)) { - if ((*ps16GenBufPtr - s32BitSlice) == 1) { - s32SliceCount += 2; - } else { - s32SliceCount++; - } - } - ps16GenBufPtr++; - - } /*end of for*/ - ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands; - } while (s32BitCount - s32SliceCount > 0); - - if (s32BitCount == 0) { - s32BitCount -= s32SliceCount; - s32BitSlice--; - } - - /*Bits are distributed until the last bitslice is reached*/ - ps16GenArrPtr = pstrCodecParams->as16Bits + s32Ch * s32NumOfSubBands; - ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands; - for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++) { - if (*(ps16GenBufPtr) < s32BitSlice + 2) { - *(ps16GenArrPtr) = 0; - } else { - *(ps16GenArrPtr) = ((*(ps16GenBufPtr)-s32BitSlice) < 16) ? (SINT16)(*(ps16GenBufPtr)-s32BitSlice) : 16; - } - - ps16GenBufPtr++; - ps16GenArrPtr++; - } - ps16GenArrPtr = pstrCodecParams->as16Bits + s32Ch * s32NumOfSubBands; - ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands; - /*the remaining bits are allocated starting at subband 0*/ - s32Sb = 0; - while ((s32BitCount > 0) && (s32Sb < s32NumOfSubBands)) { - if ((*(ps16GenArrPtr) >= 2) && (*(ps16GenArrPtr) < 16)) { - (*(ps16GenArrPtr))++; - s32BitCount--; - } else if ((*(ps16GenBufPtr) == s32BitSlice + 1) && (s32BitCount > 1)) { - *(ps16GenArrPtr) = 2; - s32BitCount -= 2; - } - s32Sb++; - ps16GenArrPtr++; - ps16GenBufPtr++; - } - ps16GenArrPtr = pstrCodecParams->as16Bits + s32Ch * s32NumOfSubBands; - - s32Sb = 0; - while ((s32BitCount > 0) && (s32Sb < s32NumOfSubBands)) { - if (*(ps16GenArrPtr) < 16) { - (*(ps16GenArrPtr))++; - s32BitCount--; - } - s32Sb++; - ps16GenArrPtr++; - } - } -} -/*End of BitAlloc() function*/ - -#endif /* #if defined(SBC_ENC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_enc_bit_alloc_ste.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_enc_bit_alloc_ste.c deleted file mode 100644 index a5997923..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_enc_bit_alloc_ste.c +++ /dev/null @@ -1,190 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1999-2012 Broadcom Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/****************************************************************************** - * - * This file contains the code for bit allocation algorithm. It calculates - * the number of bits required for the encoded stream of data. - * - ******************************************************************************/ - -/*Includes*/ -#include "sbc_enc_func_declare.h" -#include "sbc_encoder.h" - -#if defined(SBC_ENC_INCLUDED) - -/*global arrays*/ -extern const SINT16 sbc_enc_as16Offset4[4][4]; -extern const SINT16 sbc_enc_as16Offset8[4][8]; - -/**************************************************************************** - * BitAlloc - Calculates the required number of bits for the given scale factor - * and the number of subbands. - * - * RETURNS : N/A - */ - -void sbc_enc_bit_alloc_ste(SBC_ENC_PARAMS *pstrCodecParams) { - /* CAUTIOM -> mips optim for arm 32 require to use SINT32 instead of SINT16 */ - /* Do not change variable type or name */ - SINT32 s32MaxBitNeed; /*to store the max bits needed per sb*/ - SINT32 s32BitCount; /*the used number of bits*/ - SINT32 s32SliceCount; /*to store hwo many slices can be put in bitpool*/ - SINT32 s32BitSlice; /*number of bitslices in bitpool*/ - SINT32 s32Sb; /*counter for sub-band*/ - SINT32 s32Ch; /*counter for channel*/ - SINT16 *ps16BitNeed; /*temp memory to store required number of bits*/ - SINT32 s32Loudness; /*used in Loudness calculation*/ - SINT16 *ps16GenBufPtr, *pas16ScaleFactor; - SINT16 *ps16GenArrPtr; - SINT16 *ps16GenTabPtr; - SINT32 s32NumOfSubBands = pstrCodecParams->s16NumOfSubBands; - SINT32 s32BitPool = pstrCodecParams->s16BitPool; - - /* bitneed values are derived from scale factor */ - if (pstrCodecParams->s16AllocationMethod == SBC_SNR) { - ps16BitNeed = pstrCodecParams->as16ScaleFactor; - s32MaxBitNeed = pstrCodecParams->s16MaxBitNeed; - } else { - ps16BitNeed = pstrCodecParams->s16ScartchMemForBitAlloc; - pas16ScaleFactor = pstrCodecParams->as16ScaleFactor; - s32MaxBitNeed = 0; - ps16GenBufPtr = ps16BitNeed; - for (s32Ch = 0; s32Ch < 2; s32Ch++) { - if (s32NumOfSubBands == 4) { - ps16GenTabPtr = (SINT16 *)sbc_enc_as16Offset4[pstrCodecParams->s16SamplingFreq]; - } else { - ps16GenTabPtr = (SINT16 *)sbc_enc_as16Offset8[pstrCodecParams->s16SamplingFreq]; - } - - for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++) { - if (*pas16ScaleFactor == 0) { - *ps16GenBufPtr = -5; - } else { - s32Loudness = (SINT32)(*pas16ScaleFactor - *ps16GenTabPtr); - - if (s32Loudness > 0) { - *ps16GenBufPtr = (SINT16)(s32Loudness >> 1); - } else { - *ps16GenBufPtr = (SINT16)s32Loudness; - } - } - - if (*ps16GenBufPtr > s32MaxBitNeed) { - s32MaxBitNeed = *ps16GenBufPtr; - } - pas16ScaleFactor++; - ps16GenBufPtr++; - ps16GenTabPtr++; - } - } - } - - /* iterative process to find out hwo many bitslices fit into the bitpool */ - s32BitSlice = s32MaxBitNeed + 1; - s32BitCount = s32BitPool; - s32SliceCount = 0; - do { - s32BitSlice--; - s32BitCount -= s32SliceCount; - s32SliceCount = 0; - ps16GenBufPtr = ps16BitNeed; - - for (s32Sb = 0; s32Sb < 2 * s32NumOfSubBands; s32Sb++) { - if ((*ps16GenBufPtr >= s32BitSlice + 1) && (*ps16GenBufPtr < s32BitSlice + 16)) { - if (*(ps16GenBufPtr) == s32BitSlice + 1) { - s32SliceCount += 2; - } else { - s32SliceCount++; - } - } - ps16GenBufPtr++; - } - } while (s32BitCount - s32SliceCount > 0); - - if (s32BitCount - s32SliceCount == 0) { - s32BitCount -= s32SliceCount; - s32BitSlice--; - } - - /* Bits are distributed until the last bitslice is reached */ - ps16GenBufPtr = ps16BitNeed; - ps16GenArrPtr = pstrCodecParams->as16Bits; - for (s32Ch = 0; s32Ch < 2; s32Ch++) { - for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++) { - if (*ps16GenBufPtr < s32BitSlice + 2) { - *ps16GenArrPtr = 0; - } else { - *ps16GenArrPtr = ((*(ps16GenBufPtr)-s32BitSlice) < 16) ? (SINT16)(*(ps16GenBufPtr)-s32BitSlice) : 16; - } - ps16GenBufPtr++; - ps16GenArrPtr++; - } - } - - /* the remaining bits are allocated starting at subband 0 */ - s32Ch = 0; - s32Sb = 0; - ps16GenBufPtr = ps16BitNeed; - ps16GenArrPtr -= 2 * s32NumOfSubBands; - - while ((s32BitCount > 0) && (s32Sb < s32NumOfSubBands)) { - if ((*(ps16GenArrPtr) >= 2) && (*(ps16GenArrPtr) < 16)) { - (*(ps16GenArrPtr))++; - s32BitCount--; - } else if ((*ps16GenBufPtr == s32BitSlice + 1) && (s32BitCount > 1)) { - *(ps16GenArrPtr) = 2; - s32BitCount -= 2; - } - if (s32Ch == 1) { - s32Ch = 0; - s32Sb++; - ps16GenBufPtr = ps16BitNeed + s32Sb; - ps16GenArrPtr = pstrCodecParams->as16Bits + s32Sb; - - } else { - s32Ch = 1; - ps16GenBufPtr = ps16BitNeed + s32NumOfSubBands + s32Sb; - ps16GenArrPtr = pstrCodecParams->as16Bits + s32NumOfSubBands + s32Sb; - } - } - - s32Ch = 0; - s32Sb = 0; - ps16GenArrPtr = pstrCodecParams->as16Bits; - - while ((s32BitCount > 0) && (s32Sb < s32NumOfSubBands)) { - if (*(ps16GenArrPtr) < 16) { - (*(ps16GenArrPtr))++; - s32BitCount--; - } - if (s32Ch == 1) { - s32Ch = 0; - s32Sb++; - ps16GenArrPtr = pstrCodecParams->as16Bits + s32Sb; - } else { - s32Ch = 1; - ps16GenArrPtr = pstrCodecParams->as16Bits + s32NumOfSubBands + s32Sb; - } - } -} - -/*End of BitAlloc() function*/ - -#endif /* #if defined(SBC_ENC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_enc_coeffs.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_enc_coeffs.c deleted file mode 100644 index 77f75384..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_enc_coeffs.c +++ /dev/null @@ -1,150 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1999-2012 Broadcom Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/****************************************************************************** - * - * This file contains the Windowing coeffs for synthesis filter - * - ******************************************************************************/ - -#include "sbc_encoder.h" - -#if defined(SBC_ENC_INCLUDED) - -#if (SBC_ARM_ASM_OPT == FALSE && SBC_IPAQ_OPT == FALSE) -#if (SBC_IS_64_MULT_IN_WINDOW_ACCU == FALSE) -/*Window coeff for 4 sub band case*/ -const SINT16 gas32CoeffFor4SBs[] = { - (SINT16)((SINT32)0x00000000 >> 16), (SINT16)0x00000000, (SINT16)((SINT32)0x001194E6 >> 16), (SINT16)0x001194E6, (SINT16)((SINT32)0x0030E2D3 >> 16), (SINT16)0x0030E2D3, - (SINT16)((SINT32)0x00599403 >> 16), (SINT16)0x00599403, (SINT16)((SINT32)0x007DBCC8 >> 16), (SINT16)0x007DBCC8, (SINT16)((SINT32)0x007F88E4 >> 16), (SINT16)0x007F88E4, - (SINT16)((SINT32)0x003D239B >> 16), (SINT16)0x003D239B, (SINT16)((SINT32)0xFF9BB9D5 >> 16), (SINT16)0xFF9BB9D5, - - (SINT16)((SINT32)0x01659F45 >> 16), (SINT16)0x01659F45, (SINT16)((SINT32)0x029DBAA3 >> 16), (SINT16)0x029DBAA3, (SINT16)((SINT32)0x03B23341 >> 16), (SINT16)0x03B23341, - (SINT16)((SINT32)0x041EEE40 >> 16), (SINT16)0x041EEE40, (SINT16)((SINT32)0x034FEE2C >> 16), (SINT16)0x034FEE2C, (SINT16)((SINT32)0x00C8F2BC >> 16), (SINT16)0x00C8F2BC, - (SINT16)((SINT32)0xFC4F91D4 >> 16), (SINT16)0xFC4F91D4, (SINT16)((SINT32)0xF60FAF37 >> 16), (SINT16)0xF60FAF37, - - (SINT16)((SINT32)0x115B1ED2 >> 16), (SINT16)0x115B1ED2, (SINT16)((SINT32)0x18F55C90 >> 16), (SINT16)0x18F55C90, (SINT16)((SINT32)0x1F91CA46 >> 16), (SINT16)0x1F91CA46, - (SINT16)((SINT32)0x2412F251 >> 16), (SINT16)0x2412F251, (SINT16)((SINT32)0x25AC1FF2 >> 16), (SINT16)0x25AC1FF2, (SINT16)((SINT32)0x2412F251 >> 16), (SINT16)0x2412F251, - (SINT16)((SINT32)0x1F91CA46 >> 16), (SINT16)0x1F91CA46, (SINT16)((SINT32)0x18F55C90 >> 16), (SINT16)0x18F55C90, - - (SINT16)((SINT32)0xEEA4E12E >> 16), (SINT16)0xEEA4E12E, (SINT16)((SINT32)0xF60FAF37 >> 16), (SINT16)0xF60FAF37, (SINT16)((SINT32)0xFC4F91D4 >> 16), (SINT16)0xFC4F91D4, - (SINT16)((SINT32)0x00C8F2BC >> 16), (SINT16)0x00C8F2BC, (SINT16)((SINT32)0x034FEE2C >> 16), (SINT16)0x034FEE2C, (SINT16)((SINT32)0x041EEE40 >> 16), (SINT16)0x041EEE40, - (SINT16)((SINT32)0x03B23341 >> 16), (SINT16)0x03B23341, (SINT16)((SINT32)0x029DBAA3 >> 16), (SINT16)0x029DBAA3, - - (SINT16)((SINT32)0xFE9A60BB >> 16), (SINT16)0xFE9A60BB, (SINT16)((SINT32)0xFF9BB9D5 >> 16), (SINT16)0xFF9BB9D5, (SINT16)((SINT32)0x003D239B >> 16), (SINT16)0x003D239B, - (SINT16)((SINT32)0x007F88E4 >> 16), (SINT16)0x007F88E4, (SINT16)((SINT32)0x007DBCC8 >> 16), (SINT16)0x007DBCC8, (SINT16)((SINT32)0x00599403 >> 16), (SINT16)0x00599403, - (SINT16)((SINT32)0x0030E2D3 >> 16), (SINT16)0x0030E2D3, (SINT16)((SINT32)0x001194E6 >> 16), (SINT16)0x001194E6}; - -/*Window coeff for 8 sub band case*/ -const SINT16 gas32CoeffFor8SBs[] = { - (SINT16)((SINT32)0x00000000 >> 16), (SINT16)0x00000000, (SINT16)((SINT32)0x00052173 >> 16), (SINT16)0x00052173, (SINT16)((SINT32)0x000B3F71 >> 16), (SINT16)0x000B3F71, - (SINT16)((SINT32)0x00122C7D >> 16), (SINT16)0x00122C7D, (SINT16)((SINT32)0x001AFF89 >> 16), (SINT16)0x001AFF89, (SINT16)((SINT32)0x00255A62 >> 16), (SINT16)0x00255A62, - (SINT16)((SINT32)0x003060F4 >> 16), (SINT16)0x003060F4, (SINT16)((SINT32)0x003A72E7 >> 16), (SINT16)0x003A72E7, - - (SINT16)((SINT32)0x0041EC6A >> 16), (SINT16)0x0041EC6A, /* 8 */ - (SINT16)((SINT32)0x0044EF48 >> 16), (SINT16)0x0044EF48, (SINT16)((SINT32)0x00415B75 >> 16), (SINT16)0x00415B75, (SINT16)((SINT32)0x0034F8B6 >> 16), (SINT16)0x0034F8B6, - (SINT16)((SINT32)0x001D8FD2 >> 16), (SINT16)0x001D8FD2, (SINT16)((SINT32)0xFFFA2413 >> 16), (SINT16)0xFFFA2413, (SINT16)((SINT32)0xFFC9F10E >> 16), (SINT16)0xFFC9F10E, - (SINT16)((SINT32)0xFF8D6793 >> 16), (SINT16)0xFF8D6793, - - (SINT16)((SINT32)0x00B97348 >> 16), (SINT16)0x00B97348, /* 16 */ - (SINT16)((SINT32)0x01071B96 >> 16), (SINT16)0x01071B96, (SINT16)((SINT32)0x0156B3CA >> 16), (SINT16)0x0156B3CA, (SINT16)((SINT32)0x01A1B38B >> 16), (SINT16)0x01A1B38B, - (SINT16)((SINT32)0x01E0224C >> 16), (SINT16)0x01E0224C, (SINT16)((SINT32)0x0209291F >> 16), (SINT16)0x0209291F, (SINT16)((SINT32)0x02138653 >> 16), (SINT16)0x02138653, - (SINT16)((SINT32)0x01F5F424 >> 16), (SINT16)0x01F5F424, - - (SINT16)((SINT32)0x01A7ECEF >> 16), (SINT16)0x01A7ECEF, /* 24 */ - (SINT16)((SINT32)0x01223EBA >> 16), (SINT16)0x01223EBA, (SINT16)((SINT32)0x005FD0FF >> 16), (SINT16)0x005FD0FF, (SINT16)((SINT32)0xFF5EEB73 >> 16), (SINT16)0xFF5EEB73, - (SINT16)((SINT32)0xFE20435D >> 16), (SINT16)0xFE20435D, (SINT16)((SINT32)0xFCA86E7E >> 16), (SINT16)0xFCA86E7E, (SINT16)((SINT32)0xFAFF95FC >> 16), (SINT16)0xFAFF95FC, - (SINT16)((SINT32)0xF9312891 >> 16), (SINT16)0xF9312891, - - (SINT16)((SINT32)0x08B4307A >> 16), (SINT16)0x08B4307A, /* 32 */ - (SINT16)((SINT32)0x0A9F3E9A >> 16), (SINT16)0x0A9F3E9A, (SINT16)((SINT32)0x0C7D59B6 >> 16), (SINT16)0x0C7D59B6, (SINT16)((SINT32)0x0E3BB16F >> 16), (SINT16)0x0E3BB16F, - (SINT16)((SINT32)0x0FC721F9 >> 16), (SINT16)0x0FC721F9, (SINT16)((SINT32)0x110ECEF0 >> 16), (SINT16)0x110ECEF0, (SINT16)((SINT32)0x120435FA >> 16), (SINT16)0x120435FA, - (SINT16)((SINT32)0x129C226F >> 16), (SINT16)0x129C226F, - - (SINT16)((SINT32)0x12CF6C75 >> 16), (SINT16)0x12CF6C75, /* 40 */ - (SINT16)((SINT32)0x129C226F >> 16), (SINT16)0x129C226F, (SINT16)((SINT32)0x120435FA >> 16), (SINT16)0x120435FA, (SINT16)((SINT32)0x110ECEF0 >> 16), (SINT16)0x110ECEF0, - (SINT16)((SINT32)0x0FC721F9 >> 16), (SINT16)0x0FC721F9, (SINT16)((SINT32)0x0E3BB16F >> 16), (SINT16)0x0E3BB16F, (SINT16)((SINT32)0x0C7D59B6 >> 16), (SINT16)0x0C7D59B6, - (SINT16)((SINT32)0x0A9F3E9A >> 16), (SINT16)0x0A9F3E9A, - - (SINT16)((SINT32)0xF74BCF86 >> 16), (SINT16)0xF74BCF86, /* 48 */ - (SINT16)((SINT32)0xF9312891 >> 16), (SINT16)0xF9312891, (SINT16)((SINT32)0xFAFF95FC >> 16), (SINT16)0xFAFF95FC, (SINT16)((SINT32)0xFCA86E7E >> 16), (SINT16)0xFCA86E7E, - (SINT16)((SINT32)0xFE20435D >> 16), (SINT16)0xFE20435D, (SINT16)((SINT32)0xFF5EEB73 >> 16), (SINT16)0xFF5EEB73, (SINT16)((SINT32)0x005FD0FF >> 16), (SINT16)0x005FD0FF, - (SINT16)((SINT32)0x01223EBA >> 16), (SINT16)0x01223EBA, - - (SINT16)((SINT32)0x01A7ECEF >> 16), (SINT16)0x01A7ECEF, /* 56 */ - (SINT16)((SINT32)0x01F5F424 >> 16), (SINT16)0x01F5F424, (SINT16)((SINT32)0x02138653 >> 16), (SINT16)0x02138653, (SINT16)((SINT32)0x0209291F >> 16), (SINT16)0x0209291F, - (SINT16)((SINT32)0x01E0224C >> 16), (SINT16)0x01E0224C, (SINT16)((SINT32)0x01A1B38B >> 16), (SINT16)0x01A1B38B, (SINT16)((SINT32)0x0156B3CA >> 16), (SINT16)0x0156B3CA, - (SINT16)((SINT32)0x01071B96 >> 16), (SINT16)0x01071B96, - - (SINT16)((SINT32)0xFF468CB8 >> 16), (SINT16)0xFF468CB8, /* 64 */ - (SINT16)((SINT32)0xFF8D6793 >> 16), (SINT16)0xFF8D6793, (SINT16)((SINT32)0xFFC9F10E >> 16), (SINT16)0xFFC9F10E, (SINT16)((SINT32)0xFFFA2413 >> 16), (SINT16)0xFFFA2413, - (SINT16)((SINT32)0x001D8FD2 >> 16), (SINT16)0x001D8FD2, (SINT16)((SINT32)0x0034F8B6 >> 16), (SINT16)0x0034F8B6, (SINT16)((SINT32)0x00415B75 >> 16), (SINT16)0x00415B75, - (SINT16)((SINT32)0x0044EF48 >> 16), (SINT16)0x0044EF48, - - (SINT16)((SINT32)0x0041EC6A >> 16), (SINT16)0x0041EC6A, /* 72 */ - (SINT16)((SINT32)0x003A72E7 >> 16), (SINT16)0x003A72E7, (SINT16)((SINT32)0x003060F4 >> 16), (SINT16)0x003060F4, (SINT16)((SINT32)0x00255A62 >> 16), (SINT16)0x00255A62, - (SINT16)((SINT32)0x001AFF89 >> 16), (SINT16)0x001AFF89, (SINT16)((SINT32)0x00122C7D >> 16), (SINT16)0x00122C7D, (SINT16)((SINT32)0x000B3F71 >> 16), (SINT16)0x000B3F71, - (SINT16)((SINT32)0x00052173 >> 16), (SINT16)0x00052173}; - -#else - -/*Window coeff for 4 sub band case*/ -const SINT32 gas32CoeffFor4SBs[] = {(SINT32)0x00000000, (SINT32)0x001194E6, (SINT32)0x0030E2D3, (SINT32)0x00599403, (SINT32)0x007DBCC8, (SINT32)0x007F88E4, (SINT32)0x003D239B, (SINT32)0xFF9BB9D5, - - (SINT32)0x01659F45, (SINT32)0x029DBAA3, (SINT32)0x03B23341, (SINT32)0x041EEE40, (SINT32)0x034FEE2C, (SINT32)0x00C8F2BC, (SINT32)0xFC4F91D4, (SINT32)0xF60FAF37, - - (SINT32)0x115B1ED2, (SINT32)0x18F55C90, (SINT32)0x1F91CA46, (SINT32)0x2412F251, (SINT32)0x25AC1FF2, (SINT32)0x2412F251, (SINT32)0x1F91CA46, (SINT32)0x18F55C90, - - (SINT32)0xEEA4E12E, (SINT32)0xF60FAF37, (SINT32)0xFC4F91D4, (SINT32)0x00C8F2BC, (SINT32)0x034FEE2C, (SINT32)0x041EEE40, (SINT32)0x03B23341, (SINT32)0x029DBAA3, - - (SINT32)0xFE9A60BB, (SINT32)0xFF9BB9D5, (SINT32)0x003D239B, (SINT32)0x007F88E4, (SINT32)0x007DBCC8, (SINT32)0x00599403, (SINT32)0x0030E2D3, (SINT32)0x001194E6}; - -/*Window coeff for 8 sub band case*/ -const SINT32 gas32CoeffFor8SBs[] = {(SINT32)0x00000000, (SINT32)0x00052173, (SINT32)0x000B3F71, (SINT32)0x00122C7D, (SINT32)0x001AFF89, (SINT32)0x00255A62, (SINT32)0x003060F4, (SINT32)0x003A72E7, - - (SINT32)0x0041EC6A, /* 8 */ - (SINT32)0x0044EF48, (SINT32)0x00415B75, (SINT32)0x0034F8B6, (SINT32)0x001D8FD2, (SINT32)0xFFFA2413, (SINT32)0xFFC9F10E, (SINT32)0xFF8D6793, - - (SINT32)0x00B97348, /* 16 */ - (SINT32)0x01071B96, (SINT32)0x0156B3CA, (SINT32)0x01A1B38B, (SINT32)0x01E0224C, (SINT32)0x0209291F, (SINT32)0x02138653, (SINT32)0x01F5F424, - - (SINT32)0x01A7ECEF, /* 24 */ - (SINT32)0x01223EBA, (SINT32)0x005FD0FF, (SINT32)0xFF5EEB73, (SINT32)0xFE20435D, (SINT32)0xFCA86E7E, (SINT32)0xFAFF95FC, (SINT32)0xF9312891, - - (SINT32)0x08B4307A, /* 32 */ - (SINT32)0x0A9F3E9A, (SINT32)0x0C7D59B6, (SINT32)0x0E3BB16F, (SINT32)0x0FC721F9, (SINT32)0x110ECEF0, (SINT32)0x120435FA, (SINT32)0x129C226F, - - (SINT32)0x12CF6C75, /* 40 */ - (SINT32)0x129C226F, (SINT32)0x120435FA, (SINT32)0x110ECEF0, (SINT32)0x0FC721F9, (SINT32)0x0E3BB16F, (SINT32)0x0C7D59B6, (SINT32)0x0A9F3E9A, - - (SINT32)0xF74BCF86, /* 48 */ - (SINT32)0xF9312891, (SINT32)0xFAFF95FC, (SINT32)0xFCA86E7E, (SINT32)0xFE20435D, (SINT32)0xFF5EEB73, (SINT32)0x005FD0FF, (SINT32)0x01223EBA, - - (SINT32)0x01A7ECEF, /* 56 */ - (SINT32)0x01F5F424, (SINT32)0x02138653, (SINT32)0x0209291F, (SINT32)0x01E0224C, (SINT32)0x01A1B38B, (SINT32)0x0156B3CA, (SINT32)0x01071B96, - - (SINT32)0xFF468CB8, /* 64 */ - (SINT32)0xFF8D6793, (SINT32)0xFFC9F10E, (SINT32)0xFFFA2413, (SINT32)0x001D8FD2, (SINT32)0x0034F8B6, (SINT32)0x00415B75, (SINT32)0x0044EF48, - - (SINT32)0x0041EC6A, /* 72 */ - (SINT32)0x003A72E7, (SINT32)0x003060F4, (SINT32)0x00255A62, (SINT32)0x001AFF89, (SINT32)0x00122C7D, (SINT32)0x000B3F71, (SINT32)0x00052173}; - -#endif -#endif - -#endif /* #if defined(SBC_ENC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_enc_func_declare.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_enc_func_declare.h deleted file mode 100644 index feb9d4b2..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_enc_func_declare.h +++ /dev/null @@ -1,58 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1999-2012 Broadcom Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/****************************************************************************** - * - * Function declarations. - * - ******************************************************************************/ - -#ifndef SBC_FUNCDECLARE_H -#define SBC_FUNCDECLARE_H -#include "sbc_types.h" - -#include "sbc_encoder.h" - -/* Global data */ -#if (SBC_IS_64_MULT_IN_WINDOW_ACCU == FALSE) -extern const SINT16 gas32CoeffFor4SBs[]; -extern const SINT16 gas32CoeffFor8SBs[]; -#else -extern const SINT32 gas32CoeffFor4SBs[]; -extern const SINT32 gas32CoeffFor8SBs[]; -#endif - -/* Global functions*/ - -extern void sbc_enc_bit_alloc_mono(SBC_ENC_PARAMS *CodecParams); -extern void sbc_enc_bit_alloc_ste(SBC_ENC_PARAMS *CodecParams); - -extern void SbcAnalysisInit(void); - -extern void SbcAnalysisFilter4(SBC_ENC_PARAMS *strEncParams); -extern void SbcAnalysisFilter8(SBC_ENC_PARAMS *strEncParams); - -extern void SBC_FastIDCT8(SINT32 *pInVect, SINT32 *pOutVect); -extern void SBC_FastIDCT4(SINT32 *x0, SINT32 *pOutVect); - -extern void EncPacking(SBC_ENC_PARAMS *strEncParams); -extern void EncQuantizer(SBC_ENC_PARAMS *); -#if (SBC_DSP_OPT == TRUE) -SINT32 SBC_Multiply_32_16_Simplified(SINT32 s32In2Temp, SINT32 s32In1Temp); -#endif -#endif diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_encoder.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_encoder.c deleted file mode 100644 index 9db957ff..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_encoder.c +++ /dev/null @@ -1,312 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1999-2012 Broadcom Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/****************************************************************************** - * - * contains code for encoder flow and initalization of encoder - * - ******************************************************************************/ - -#include "sbc_encoder.h" -#include "sbc_enc_func_declare.h" -#include -#include - -#if defined(SBC_ENC_INCLUDED) - -SINT16 EncMaxShiftCounter; - -#if (SBC_JOINT_STE_INCLUDED == TRUE) -SINT32 s32LRDiff[SBC_MAX_NUM_OF_BLOCKS] = {0}; -SINT32 s32LRSum[SBC_MAX_NUM_OF_BLOCKS] = {0}; -#endif - -void SBC_Encoder(SBC_ENC_PARAMS *pstrEncParams) { - SINT32 s32Ch; /* counter for ch*/ - SINT32 s32Sb; /* counter for sub-band*/ - UINT32 u32Count, maxBit = 0; /* loop count*/ - SINT32 s32MaxValue; /* temp variable to store max value */ - - SINT16 *ps16ScfL; - SINT32 *SbBuffer; - SINT32 s32Blk; /* counter for block*/ - SINT32 s32NumOfBlocks = pstrEncParams->s16NumOfBlocks; -#if (SBC_JOINT_STE_INCLUDED == TRUE) - SINT32 s32MaxValue2; - UINT32 u32CountSum, u32CountDiff; - SINT32 *pSum, *pDiff; -#endif - register SINT32 s32NumOfSubBands = pstrEncParams->s16NumOfSubBands; - - pstrEncParams->pu8NextPacket = pstrEncParams->pu8Packet; - -#if (SBC_NO_PCM_CPY_OPTION == TRUE) - pstrEncParams->ps16NextPcmBuffer = pstrEncParams->ps16PcmBuffer; -#else - pstrEncParams->ps16NextPcmBuffer = pstrEncParams->as16PcmBuffer; -#endif - do { - /* SBC ananlysis filter*/ - if (s32NumOfSubBands == 4) { - SbcAnalysisFilter4(pstrEncParams); - } else { - SbcAnalysisFilter8(pstrEncParams); - } - - /* compute the scale factor, and save the max */ - ps16ScfL = pstrEncParams->as16ScaleFactor; - s32Ch = pstrEncParams->s16NumOfChannels * s32NumOfSubBands; - - pstrEncParams->ps16NextPcmBuffer += s32Ch * s32NumOfBlocks; /* in case of multible sbc frame to encode update the pcm pointer */ - - for (s32Sb = 0; s32Sb < s32Ch; s32Sb++) { - SbBuffer = pstrEncParams->s32SbBuffer + s32Sb; - s32MaxValue = 0; - for (s32Blk = s32NumOfBlocks; s32Blk > 0; s32Blk--) { - if (s32MaxValue < abs32(*SbBuffer)) { - s32MaxValue = abs32(*SbBuffer); - } - SbBuffer += s32Ch; - } - - u32Count = (s32MaxValue > 0x800000) ? 9 : 0; - - for (; u32Count < 15; u32Count++) { - if (s32MaxValue <= (SINT32)(0x8000 << u32Count)) { - break; - } - } - *ps16ScfL++ = (SINT16)u32Count; - - if (u32Count > maxBit) { - maxBit = u32Count; - } - } - /* In case of JS processing,check whether to use JS */ -#if (SBC_JOINT_STE_INCLUDED == TRUE) - if (pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO) { - /* Calculate sum and differance scale factors for making JS decision */ - ps16ScfL = pstrEncParams->as16ScaleFactor; - /* calculate the scale factor of Joint stereo max sum and diff */ - for (s32Sb = 0; s32Sb < s32NumOfSubBands - 1; s32Sb++) { - SbBuffer = pstrEncParams->s32SbBuffer + s32Sb; - s32MaxValue2 = 0; - s32MaxValue = 0; - pSum = s32LRSum; - pDiff = s32LRDiff; - for (s32Blk = 0; s32Blk < s32NumOfBlocks; s32Blk++) { - *pSum = (*SbBuffer + *(SbBuffer + s32NumOfSubBands)) >> 1; - if (abs32(*pSum) > s32MaxValue) { - s32MaxValue = abs32(*pSum); - } - pSum++; - *pDiff = (*SbBuffer - *(SbBuffer + s32NumOfSubBands)) >> 1; - if (abs32(*pDiff) > s32MaxValue2) { - s32MaxValue2 = abs32(*pDiff); - } - pDiff++; - SbBuffer += s32Ch; - } - u32Count = (s32MaxValue > 0x800000) ? 9 : 0; - for (; u32Count < 15; u32Count++) { - if (s32MaxValue <= (SINT32)(0x8000 << u32Count)) { - break; - } - } - u32CountSum = u32Count; - u32Count = (s32MaxValue2 > 0x800000) ? 9 : 0; - for (; u32Count < 15; u32Count++) { - if (s32MaxValue2 <= (SINT32)(0x8000 << u32Count)) { - break; - } - } - u32CountDiff = u32Count; - if ((*ps16ScfL + *(ps16ScfL + s32NumOfSubBands)) > (SINT16)(u32CountSum + u32CountDiff)) { - if (u32CountSum > maxBit) { - maxBit = u32CountSum; - } - - if (u32CountDiff > maxBit) { - maxBit = u32CountDiff; - } - - *ps16ScfL = (SINT16)u32CountSum; - *(ps16ScfL + s32NumOfSubBands) = (SINT16)u32CountDiff; - - SbBuffer = pstrEncParams->s32SbBuffer + s32Sb; - pSum = s32LRSum; - pDiff = s32LRDiff; - - for (s32Blk = 0; s32Blk < s32NumOfBlocks; s32Blk++) { - *SbBuffer = *pSum; - *(SbBuffer + s32NumOfSubBands) = *pDiff; - - SbBuffer += s32NumOfSubBands << 1; - pSum++; - pDiff++; - } - - pstrEncParams->as16Join[s32Sb] = 1; - } else { - pstrEncParams->as16Join[s32Sb] = 0; - } - ps16ScfL++; - } - pstrEncParams->as16Join[s32Sb] = 0; - } -#endif - - pstrEncParams->s16MaxBitNeed = (SINT16)maxBit; - - /* bit allocation */ - if ((pstrEncParams->s16ChannelMode == SBC_STEREO) || (pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO)) { - sbc_enc_bit_alloc_ste(pstrEncParams); - } else { - sbc_enc_bit_alloc_mono(pstrEncParams); - } - - /* Quantize the encoded audio */ - EncPacking(pstrEncParams); - } while (--(pstrEncParams->u8NumPacketToEncode)); - - pstrEncParams->u8NumPacketToEncode = 1; /* default is one for retrocompatibility purpose */ -} - -/**************************************************************************** - * InitSbcAnalysisFilt - Initalizes the input data to 0 - * - * RETURNS : N/A - */ -void SBC_Encoder_Init(SBC_ENC_PARAMS *pstrEncParams) { - UINT16 s16SamplingFreq; /*temp variable to store smpling freq*/ - SINT16 s16Bitpool; /*to store bit pool value*/ - SINT16 s16BitRate; /*to store bitrate*/ - SINT16 s16FrameLen; /*to store frame length*/ - UINT16 HeaderParams; - - pstrEncParams->u8NumPacketToEncode = 1; /* default is one for retrocompatibility purpose */ - - if (pstrEncParams->sbc_mode != SBC_MODE_MSBC) { - /* Required number of channels */ - if (pstrEncParams->s16ChannelMode == SBC_MONO) { - pstrEncParams->s16NumOfChannels = 1; - } else { - pstrEncParams->s16NumOfChannels = 2; - } - - /* Bit pool calculation */ - if (pstrEncParams->s16SamplingFreq == SBC_sf16000) { - s16SamplingFreq = 16000; - } else if (pstrEncParams->s16SamplingFreq == SBC_sf32000) { - s16SamplingFreq = 32000; - } else if (pstrEncParams->s16SamplingFreq == SBC_sf44100) { - s16SamplingFreq = 44100; - } else { - s16SamplingFreq = 48000; - } - - if ((pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO) || (pstrEncParams->s16ChannelMode == SBC_STEREO)) { - s16Bitpool = (SINT16)((pstrEncParams->u16BitRate * pstrEncParams->s16NumOfSubBands * 1000 / s16SamplingFreq) - - ((32 + (4 * pstrEncParams->s16NumOfSubBands * pstrEncParams->s16NumOfChannels) + ((pstrEncParams->s16ChannelMode - 2) * pstrEncParams->s16NumOfSubBands)) / - pstrEncParams->s16NumOfBlocks)); - - s16FrameLen = 4 + (4 * pstrEncParams->s16NumOfSubBands * pstrEncParams->s16NumOfChannels) / 8 + - (((pstrEncParams->s16ChannelMode - 2) * pstrEncParams->s16NumOfSubBands) + (pstrEncParams->s16NumOfBlocks * s16Bitpool)) / 8; - - s16BitRate = (8 * s16FrameLen * s16SamplingFreq) / (pstrEncParams->s16NumOfSubBands * pstrEncParams->s16NumOfBlocks * 1000); - - if (s16BitRate > pstrEncParams->u16BitRate) { - s16Bitpool--; - } - - if (pstrEncParams->s16NumOfSubBands == 8) { - pstrEncParams->s16BitPool = (s16Bitpool > 255) ? 255 : s16Bitpool; - } else { - pstrEncParams->s16BitPool = (s16Bitpool > 128) ? 128 : s16Bitpool; - } - } else { - s16Bitpool = (SINT16)(((pstrEncParams->s16NumOfSubBands * pstrEncParams->u16BitRate * 1000) / (s16SamplingFreq * pstrEncParams->s16NumOfChannels)) - - (((32 / pstrEncParams->s16NumOfChannels) + (4 * pstrEncParams->s16NumOfSubBands)) / pstrEncParams->s16NumOfBlocks)); - - pstrEncParams->s16BitPool = (s16Bitpool > (16 * pstrEncParams->s16NumOfSubBands)) ? (16 * pstrEncParams->s16NumOfSubBands) : s16Bitpool; - } - - if (pstrEncParams->s16BitPool < 0) { - pstrEncParams->s16BitPool = 0; - } - /* sampling freq */ - HeaderParams = ((pstrEncParams->s16SamplingFreq & 3) << 6); - - /* number of blocks*/ - HeaderParams |= (((pstrEncParams->s16NumOfBlocks - 4) & 12) << 2); - - /* channel mode: mono, dual...*/ - HeaderParams |= ((pstrEncParams->s16ChannelMode & 3) << 2); - - /* Loudness or SNR */ - HeaderParams |= ((pstrEncParams->s16AllocationMethod & 1) << 1); - HeaderParams |= ((pstrEncParams->s16NumOfSubBands >> 3) & 1); /*4 or 8*/ - - pstrEncParams->FrameHeader = HeaderParams; - } else { - // mSBC - - // Use mSBC encoding parameters to reset the control field - /* Required number of channels: 1 */ - pstrEncParams->s16ChannelMode = SBC_MONO; - pstrEncParams->s16NumOfChannels = 1; - - /* Required Sampling frequency : 16KHz */ - pstrEncParams->s16SamplingFreq = SBC_sf16000; - - /* Bit pool value: 26 */ - pstrEncParams->s16BitPool = 26; - - /* number of subbands: 8 */ - pstrEncParams->s16NumOfSubBands = 8; - - /* number of blocks: 15 */ - pstrEncParams->s16NumOfBlocks = 15; - - /* allocation method: loudness */ - pstrEncParams->s16AllocationMethod = SBC_LOUDNESS; - - /* set the header paramers, unused for mSBC */ - pstrEncParams->FrameHeader = 0; - } - - if (pstrEncParams->s16NumOfSubBands == 4) { - if (pstrEncParams->s16NumOfChannels == 1) { - EncMaxShiftCounter = ((ENC_VX_BUFFER_SIZE - 4 * 10) >> 2) << 2; - } else { - EncMaxShiftCounter = ((ENC_VX_BUFFER_SIZE - 4 * 10 * 2) >> 3) << 2; - } - } else { - if (pstrEncParams->s16NumOfChannels == 1) { - EncMaxShiftCounter = ((ENC_VX_BUFFER_SIZE - 8 * 10) >> 3) << 3; - } else { - EncMaxShiftCounter = ((ENC_VX_BUFFER_SIZE - 8 * 10 * 2) >> 4) << 3; - } - } - - BT_WARN("SBC_Encoder_Init : bitrate %d, bitpool %d\n", pstrEncParams->u16BitRate, pstrEncParams->s16BitPool); - - SbcAnalysisInit(); -} - -#endif /* #if defined(SBC_ENC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_encoder.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_encoder.h deleted file mode 100644 index d706c349..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_encoder.h +++ /dev/null @@ -1,207 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1999-2012 Broadcom Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/****************************************************************************** - * - * This file contains constants and structures used by Encoder. - * - ******************************************************************************/ - -#ifndef SBC_ENCODER_H -#define SBC_ENCODER_H - -#define ENCODER_VERSION "0025" - -#ifdef BUILDCFG -#include "common/bt_target.h" -#endif - -/*DEFINES*/ -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE (!FALSE) -#endif - -#define SBC_MAX_NUM_OF_SUBBANDS 8 -#define SBC_MAX_NUM_OF_CHANNELS 2 -#define SBC_MAX_NUM_OF_BLOCKS 16 - -#define SBC_LOUDNESS 0 -#define SBC_SNR 1 - -#define SUB_BANDS_8 8 -#define SUB_BANDS_4 4 - -#define SBC_sf16000 0 -#define SBC_sf32000 1 -#define SBC_sf44100 2 -#define SBC_sf48000 3 - -#define SBC_MONO 0 -#define SBC_DUAL 1 -#define SBC_STEREO 2 -#define SBC_JOINT_STEREO 3 - -#define SBC_BLOCK_0 4 -#define SBC_BLOCK_1 8 -#define SBC_BLOCK_2 12 -#define SBC_BLOCK_3 16 - -#define SBC_NULL 0 - -#define SBC_MODE_STD 0 -#define SBC_MODE_MSBC 1 - -#define SBC_SYNC_WORD_STD (0x9C) -#define SBC_SYNC_WORD_MSBC (0xAD) - -#ifndef SBC_MAX_NUM_FRAME -#define SBC_MAX_NUM_FRAME 1 -#endif - -#ifndef SBC_DSP_OPT -#define SBC_DSP_OPT FALSE -#endif - -/* Set SBC_USE_ARM_PRAGMA to TRUE to use "#pragma arm section zidata" */ -#ifndef SBC_USE_ARM_PRAGMA -#define SBC_USE_ARM_PRAGMA FALSE -#endif - -/* Set SBC_ARM_ASM_OPT to TRUE in case the target is an ARM */ -/* this will replace all the 32 and 64 bit mult by in line assembly code */ -#ifndef SBC_ARM_ASM_OPT -#define SBC_ARM_ASM_OPT FALSE -#endif - -/* green hill compiler option -> Used to distinguish the syntax for inline assembly code*/ -#ifndef SBC_GHS_COMPILER -#define SBC_GHS_COMPILER FALSE -#endif - -/* ARM compiler option -> Used to distinguish the syntax for inline assembly code */ -#ifndef SBC_ARM_COMPILER -#define SBC_ARM_COMPILER TRUE -#endif - -/* Set SBC_IPAQ_OPT to TRUE in case the target is an ARM */ -/* 32 and 64 bit mult will be performed using SINT64 ( usualy __int64 ) cast that usualy give optimal performance if supported */ -#ifndef SBC_IPAQ_OPT -#define SBC_IPAQ_OPT TRUE -#endif - -/* Debug only: set SBC_IS_64_MULT_IN_WINDOW_ACCU to TRUE to use 64 bit multiplication in the windowing */ -/* -> not recomended, more MIPS for the same restitution. */ -#ifndef SBC_IS_64_MULT_IN_WINDOW_ACCU -#define SBC_IS_64_MULT_IN_WINDOW_ACCU FALSE -#endif /*SBC_IS_64_MULT_IN_WINDOW_ACCU */ - -/* Set SBC_IS_64_MULT_IN_IDCT to TRUE to use 64 bits multiplication in the DCT of Matrixing */ -/* -> more MIPS required for a better audio quality. comparasion with the SIG utilities shows a division by 10 of the RMS */ -/* CAUTION: It only apply in the if SBC_FAST_DCT is set to TRUE */ -#ifndef SBC_IS_64_MULT_IN_IDCT -#define SBC_IS_64_MULT_IN_IDCT FALSE -#endif /*SBC_IS_64_MULT_IN_IDCT */ - -/* set SBC_IS_64_MULT_IN_QUANTIZER to TRUE to use 64 bits multiplication in the quantizer */ -/* setting this flag to FALSE add whistling noise at 5.5 and 11 KHz usualy not perceptible by human's hears. */ -#ifndef SBC_IS_64_MULT_IN_QUANTIZER -#define SBC_IS_64_MULT_IN_QUANTIZER TRUE -#endif /*SBC_IS_64_MULT_IN_IDCT */ - -/* Debug only: set this flag to FALSE to disable fast DCT algorithm */ -#ifndef SBC_FAST_DCT -#define SBC_FAST_DCT TRUE -#endif /*SBC_FAST_DCT */ - -/* In case we do not use joint stereo mode the flag save some RAM and ROM in case it is set to FALSE */ -#ifndef SBC_JOINT_STE_INCLUDED -#define SBC_JOINT_STE_INCLUDED TRUE -#endif - -/* TRUE -> application should provide PCM buffer, FALSE PCM buffer reside in SBC_ENC_PARAMS */ -#ifndef SBC_NO_PCM_CPY_OPTION -#define SBC_NO_PCM_CPY_OPTION FALSE -#endif - -#define MINIMUM_ENC_VX_BUFFER_SIZE (8 * 10 * 2) -#ifndef ENC_VX_BUFFER_SIZE -#define ENC_VX_BUFFER_SIZE (MINIMUM_ENC_VX_BUFFER_SIZE + 64) -/*#define ENC_VX_BUFFER_SIZE MINIMUM_ENC_VX_BUFFER_SIZE + 1024*/ -#endif - -#ifndef SBC_FOR_EMBEDDED_LINUX -#define SBC_FOR_EMBEDDED_LINUX FALSE -#endif - -/*constants used for index calculation*/ -#define SBC_BLK (SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS) - -#include "sbc_types.h" - -typedef struct SBC_ENC_PARAMS_TAG { - SINT16 s16SamplingFreq; /* 16k, 32k, 44.1k or 48k*/ - SINT16 s16ChannelMode; /* mono, dual, streo or joint streo*/ - SINT16 s16NumOfSubBands; /* 4 or 8 */ - SINT16 s16NumOfChannels; - SINT16 s16NumOfBlocks; /* 4, 8, 12 or 16*/ - SINT16 s16AllocationMethod; /* loudness or SNR*/ - SINT16 s16BitPool; /* 16*numOfSb for mono & dual; - 32*numOfSb for stereo & joint stereo */ - UINT16 u16BitRate; - UINT8 sbc_mode; /* SBC_MODE_STD or SBC_MODE_MSBC */ - UINT8 u8NumPacketToEncode; /* number of sbc frame to encode. Default is 1 */ -#if (SBC_JOINT_STE_INCLUDED == TRUE) - SINT16 as16Join[SBC_MAX_NUM_OF_SUBBANDS]; /*1 if JS, 0 otherwise*/ -#endif - - SINT16 s16MaxBitNeed; - SINT16 as16ScaleFactor[SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS]; - - SINT16 *ps16NextPcmBuffer; -#if (SBC_NO_PCM_CPY_OPTION == TRUE) - SINT16 *ps16PcmBuffer; -#else - SINT16 as16PcmBuffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS]; -#endif - - SINT16 s16ScartchMemForBitAlloc[16]; - - SINT32 s32SbBuffer[SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS * SBC_MAX_NUM_OF_BLOCKS]; - - SINT16 as16Bits[SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS]; - - UINT8 *pu8Packet; - UINT8 *pu8NextPacket; - UINT16 FrameHeader; - UINT16 u16PacketLength; - -} SBC_ENC_PARAMS; - -#ifdef __cplusplus -extern "C" { -#endif -extern void SBC_Encoder(SBC_ENC_PARAMS *strEncParams); -extern void SBC_Encoder_Init(SBC_ENC_PARAMS *strEncParams); -#ifdef __cplusplus -} -#endif -#endif diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_packing.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_packing.c deleted file mode 100644 index 1a24388b..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_packing.c +++ /dev/null @@ -1,257 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1999-2012 Broadcom Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/****************************************************************************** - * - * This file contains code for packing the Encoded data into bit streams. - * - ******************************************************************************/ - -#include "sbc_enc_func_declare.h" -#include "sbc_encoder.h" - -#if defined(SBC_ENC_INCLUDED) - -#if (SBC_ARM_ASM_OPT == TRUE) -#define Mult32(s32In1, s32In2, s32OutLow) \ - { \ - __asm { \ - MUL s32OutLow,s32In1,s32In2; } \ - } -#define Mult64(s32In1, s32In2, s32OutLow, s32OutHi) \ - { \ - __asm { \ - SMULL s32OutLow,s32OutHi,s32In1,s32In2 } \ - } -#else -#define Mult32(s32In1, s32In2, s32OutLow) s32OutLow = (SINT32)s32In1 * (SINT32)s32In2; -#define Mult64(s32In1, s32In2, s32OutLow, s32OutHi) \ - { \ - s32OutLow = ((SINT32)(UINT16)s32In1 * (UINT16)s32In2); \ - s32TempVal2 = (SINT32)((s32In1 >> 16) * (UINT16)s32In2); \ - s32Carry = ((((UINT32)(s32OutLow) >> 16) & 0xFFFF) + +(s32TempVal2 & 0xFFFF)) >> 16; \ - s32OutLow += (s32TempVal2 << 16); \ - s32OutHi = (s32TempVal2 >> 16) + s32Carry; \ - } -#endif - -void EncPacking(SBC_ENC_PARAMS *pstrEncParams) { - UINT8 *pu8PacketPtr; /* packet ptr*/ - UINT8 Temp; - SINT32 s32Blk; /* counter for block*/ - SINT32 s32Ch; /* counter for channel*/ - SINT32 s32Sb; /* counter for sub-band*/ - SINT32 s32PresentBit; /* represents bit to be stored*/ - /*SINT32 s32LoopCountI; loop counter*/ - SINT32 s32LoopCountJ; /* loop counter*/ - UINT32 u32QuantizedSbValue, u32QuantizedSbValue0; /* temp variable to store quantized sb val*/ - SINT32 s32LoopCount; /* loop counter*/ - UINT8 u8XoredVal; /* to store XORed value in CRC calculation*/ - UINT8 u8CRC; /* to store CRC value*/ - SINT16 *ps16GenPtr; - SINT32 s32NumOfBlocks; - SINT32 s32NumOfSubBands = pstrEncParams->s16NumOfSubBands; - SINT32 s32NumOfChannels = pstrEncParams->s16NumOfChannels; - UINT32 u32SfRaisedToPow2; /*scale factor raised to power 2*/ - SINT16 *ps16ScfPtr; - SINT32 *ps32SbPtr; - UINT16 u16Levels; /*to store levels*/ - SINT32 s32Temp1; /*used in 64-bit multiplication*/ - SINT32 s32Low; /*used in 64-bit multiplication*/ -#if (SBC_IS_64_MULT_IN_QUANTIZER == TRUE) - SINT32 s32Hi1, s32Low1, s32Carry, s32TempVal2, s32Hi, s32Temp2; -#endif - - pu8PacketPtr = pstrEncParams->pu8NextPacket; /*Initialize the ptr*/ - if (pstrEncParams->sbc_mode != SBC_MODE_MSBC) { - *pu8PacketPtr++ = (UINT8)SBC_SYNC_WORD_STD; /*Sync word*/ - *pu8PacketPtr++ = (UINT8)(pstrEncParams->FrameHeader); - - *pu8PacketPtr = (UINT8)(pstrEncParams->s16BitPool & 0x00FF); - } else { - *pu8PacketPtr++ = (UINT8)SBC_SYNC_WORD_MSBC; /*Sync word*/ - // two reserved bytes - *pu8PacketPtr++ = 0; - *pu8PacketPtr = 0; - } - pu8PacketPtr += 2; /*skip for CRC*/ - - /*here it indicate if it is byte boundary or nibble boundary*/ - s32PresentBit = 8; - Temp = 0; -#if (SBC_JOINT_STE_INCLUDED == TRUE) - if (pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO) { - /* pack join stero parameters */ - for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++) { - Temp <<= 1; - Temp |= pstrEncParams->as16Join[s32Sb]; - } - - /* pack RFA */ - if (s32NumOfSubBands == SUB_BANDS_4) { - s32PresentBit = 4; - } else { - *(pu8PacketPtr++) = Temp; - Temp = 0; - } - } -#endif - - /* Pack Scale factor */ - ps16GenPtr = pstrEncParams->as16ScaleFactor; - s32Sb = s32NumOfChannels * s32NumOfSubBands; - /*Temp=*pu8PacketPtr;*/ - for (s32Ch = s32Sb; s32Ch > 0; s32Ch--) { - Temp <<= 4; - Temp |= *ps16GenPtr++; - - if (s32PresentBit == 4) { - s32PresentBit = 8; - *(pu8PacketPtr++) = Temp; - Temp = 0; - } else { - s32PresentBit = 4; - } - } - - /* Pack samples */ - ps32SbPtr = pstrEncParams->s32SbBuffer; - /*Temp=*pu8PacketPtr;*/ - s32NumOfBlocks = pstrEncParams->s16NumOfBlocks; - for (s32Blk = s32NumOfBlocks - 1; s32Blk >= 0; s32Blk--) { - ps16GenPtr = pstrEncParams->as16Bits; - ps16ScfPtr = pstrEncParams->as16ScaleFactor; - for (s32Ch = s32Sb - 1; s32Ch >= 0; s32Ch--) { - s32LoopCount = *ps16GenPtr++; - if (s32LoopCount != 0) { -#if (SBC_IS_64_MULT_IN_QUANTIZER == TRUE) - /* finding level from reconstruction part of decoder */ - u32SfRaisedToPow2 = ((UINT32)1 << ((*ps16ScfPtr) + 1)); - u16Levels = (UINT16)(((UINT32)1 << s32LoopCount) - 1); - - /* quantizer */ - s32Temp1 = (*ps32SbPtr >> 2) + (u32SfRaisedToPow2 << 12); - s32Temp2 = u16Levels; - - Mult64(s32Temp1, s32Temp2, s32Low, s32Hi); - - s32Low1 = s32Low >> ((*ps16ScfPtr) + 2); - s32Low1 &= ((UINT32)1 << (32 - ((*ps16ScfPtr) + 2))) - 1; - s32Hi1 = s32Hi << (32 - ((*ps16ScfPtr) + 2)); - - u32QuantizedSbValue0 = (UINT16)((s32Low1 | s32Hi1) >> 12); -#else - /* finding level from reconstruction part of decoder */ - u32SfRaisedToPow2 = ((UINT32)1 << *ps16ScfPtr); - u16Levels = (UINT16)(((UINT32)1 << s32LoopCount) - 1); - - /* quantizer */ - s32Temp1 = (*ps32SbPtr >> 15) + u32SfRaisedToPow2; - Mult32(s32Temp1, u16Levels, s32Low); - s32Low >>= (*ps16ScfPtr + 1); - u32QuantizedSbValue0 = (UINT16)s32Low; -#endif - /*store the number of bits required and the quantized s32Sb - sample to ease the coding*/ - u32QuantizedSbValue = u32QuantizedSbValue0; - - if (s32PresentBit >= s32LoopCount) { - Temp <<= s32LoopCount; - Temp |= u32QuantizedSbValue; - s32PresentBit -= s32LoopCount; - } else { - while (s32PresentBit < s32LoopCount) { - s32LoopCount -= s32PresentBit; - u32QuantizedSbValue >>= s32LoopCount; - - /*remove the unwanted msbs*/ - /*u32QuantizedSbValue <<= 16 - s32PresentBit; - u32QuantizedSbValue >>= 16 - s32PresentBit;*/ - - Temp <<= s32PresentBit; - - Temp |= u32QuantizedSbValue; - /*restore the original*/ - u32QuantizedSbValue = u32QuantizedSbValue0; - - *(pu8PacketPtr++) = Temp; - Temp = 0; - s32PresentBit = 8; - } - Temp <<= s32LoopCount; - - /* remove the unwanted msbs */ - /*u32QuantizedSbValue <<= 16 - s32LoopCount; - u32QuantizedSbValue >>= 16 - s32LoopCount;*/ - - Temp |= u32QuantizedSbValue; - - s32PresentBit -= s32LoopCount; - } - } - ps16ScfPtr++; - ps32SbPtr++; - } - } - - Temp <<= s32PresentBit; - *pu8PacketPtr = Temp; - pstrEncParams->u16PacketLength = pu8PacketPtr - pstrEncParams->pu8NextPacket + 1; - /*find CRC*/ - pu8PacketPtr = pstrEncParams->pu8NextPacket + 1; /*Initialize the ptr*/ - u8CRC = 0x0F; - s32LoopCount = s32Sb >> 1; - - /* - The loops is run from the start of the packet till the scale factor - parameters. In case of JS, 'join' parameter is included in the packet - so that many more bytes are included in CRC calculation. - */ - Temp = *pu8PacketPtr; - for (s32Ch = 1; s32Ch < (s32LoopCount + 4); s32Ch++) { - /* skip sync word and CRC bytes */ - if (s32Ch != 3) { - for (s32LoopCountJ = 7; s32LoopCountJ >= 0; s32LoopCountJ--) { - u8XoredVal = ((u8CRC >> 7) & 0x01) ^ ((Temp >> s32LoopCountJ) & 0x01); - u8CRC <<= 1; - u8CRC ^= (u8XoredVal * 0x1D); - u8CRC &= 0xFF; - } - } - Temp = *(++pu8PacketPtr); - } - - if (pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO) { - for (s32LoopCountJ = 7; s32LoopCountJ >= (8 - s32NumOfSubBands); s32LoopCountJ--) { - u8XoredVal = ((u8CRC >> 7) & 0x01) ^ ((Temp >> s32LoopCountJ) & 0x01); - u8CRC <<= 1; - u8CRC ^= (u8XoredVal * 0x1D); - u8CRC &= 0xFF; - } - } - - /* CRC calculation ends here */ - - /* store CRC in packet */ - pu8PacketPtr = pstrEncParams->pu8NextPacket; /*Initialize the ptr*/ - pu8PacketPtr += 3; - *pu8PacketPtr = u8CRC; - pstrEncParams->pu8NextPacket += pstrEncParams->u16PacketLength; /* move the pointer to the end in case there is more than one frame to encode */ -} - -#endif /* #if defined(SBC_ENC_INCLUDED) */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_types.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_types.h deleted file mode 100644 index 82eed436..00000000 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/sbc/enc/sbc_types.h +++ /dev/null @@ -1,57 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1999-2012 Broadcom Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -/****************************************************************************** - * - * Data type declarations. - * - ******************************************************************************/ - -#ifndef SBC_TYPES_H -#define SBC_TYPES_H - -#include - -typedef uint8_t UINT8; -typedef uint16_t UINT16; -typedef uint32_t UINT32; -typedef uint64_t UINT64; -typedef short SINT16; -typedef long SINT32; - -#if (SBC_IPAQ_OPT == TRUE) - -#if (SBC_FOR_EMBEDDED_LINUX == TRUE) -typedef long long SINT64; -#else -typedef int64_t SINT64; -#endif - -#elif (SBC_IS_64_MULT_IN_WINDOW_ACCU == TRUE) || (SBC_IS_64_MULT_IN_IDCT == TRUE) - -#if (SBC_FOR_EMBEDDED_LINUX == TRUE) -typedef long long SINT64; -#else -typedef int64_t SINT64; -#endif - -#endif - -#define abs32(x) ((x >= 0) ? x : (-x)) - -#endif diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/services/hog.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/services/hog.c index cc2935ac..98e00f24 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/services/hog.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/services/hog.c @@ -8,20 +8,22 @@ * SPDX-License-Identifier: Apache-2.0 */ +#include + #include #include #include #include #include -#include -#include "hog.h" #include "log.h" #include #include #include #include +#include "hog.h" + enum { HIDS_REMOTE_WAKE = BIT(0), HIDS_NORMALLY_CONNECTABLE = BIT(1), @@ -144,23 +146,21 @@ int hog_notify(struct bt_conn *conn, uint16_t hid_usage, uint8_t press) { struct hids_remote_key *remote_key = NULL; u8_t len = 4, data[4]; - for (size_t i = 0; i < (sizeof(remote_kbd_map_tab) / sizeof(remote_kbd_map_tab[0])); i++) { + for (int i = 0; i < (sizeof(remote_kbd_map_tab) / sizeof(remote_kbd_map_tab[0])); i++) { if (remote_kbd_map_tab[i].hid_usage == hid_usage) { remote_key = &remote_kbd_map_tab[i]; break; } } - if (!remote_key) { + if (!remote_key) return EINVAL; - } if (remote_key->hid_page == HID_PAGE_KBD) { attr = &attrs[BT_CHAR_BLE_HID_REPORT_ATTR_VAL_INDEX]; len = 3; - } else { + } else return EINVAL; - } sys_put_le16(hid_usage, data); data[2] = 0; diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/services/hog.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/services/hog.h index 3855fe64..c3746aae 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/services/hog.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/ble_stack/services/hog.h @@ -15,9 +15,6 @@ extern "C" { #endif #include -#include "conn.h" -#include "conn_internal.h" - #define HID_PAGE_KBD 0x07 #define HID_PAGE_CONS 0x0C diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/blecontroller/ble_inc/ble_lib_api.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/blecontroller/ble_inc/ble_lib_api.h index 2cf94f98..0135b36a 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/blecontroller/ble_inc/ble_lib_api.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/blecontroller/ble_inc/ble_lib_api.h @@ -6,6 +6,9 @@ void ble_controller_init(uint8_t task_priority); void ble_controller_deinit(void); +#if !defined(CFG_FREERTOS) && !defined(CFG_AOS) +void blecontroller_main(void); +#endif #if defined(CFG_BT_RESET) void ble_controller_reset(void); #endif @@ -69,6 +72,7 @@ int le_rx_test_cmd_handler(uint16_t src_id, void *param, bool from_hci); int le_tx_test_cmd_handler(uint16_t src_id, void *param, bool from_hci); int le_test_end_cmd_handler(bool from_hci); uint8_t le_get_direct_test_type(void); +void le_test_mode_custom_aa(uint32_t access_code); #if defined(CONFIG_BLE_MFG_HCI_CMD) int reset_cmd_handler(void); diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/blecontroller/lib/README.md b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/blecontroller/lib/README.md new file mode 100644 index 00000000..8abbe6ad --- /dev/null +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/blecontroller/lib/README.md @@ -0,0 +1,10 @@ +# blecontroller lib information + +## BL702 + +1. `libblecontroller_702_m0s0sp` BL702 support BLE scan feature and BLE PDS(power down sleep) feature. +1. `libblecontroller_702_m0s1` 1 BLE connection is supported, BL702 can only be slave in this connection. +1. `libblecontroller_702_m0s1p` Based on libblecontroller_702_m0s1, add BLE PDS(power down sleep) feature. +1. `libblecontroller_702_m0s1s` Based on libblecontroller_702_m0s1, add BLE scan feature. +1. `libblecontroller_702_m1s1` 1 BLE connection is supported, BL702 can be master or slave in this connection. +1. `libblecontroller_702_m16s1` 16 BLE connections are suppprted, BL702 can be master or slave in each connection. diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/blecontroller/lib/libblecontroller_702_std.a b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/blecontroller/lib/libblecontroller_702_std.a new file mode 100644 index 00000000..3902fdcb Binary files /dev/null and b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/components/ble/blecontroller/lib/libblecontroller_702_std.a differ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/bl702_flash.ld b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/bl702_flash.ld index 2ae61c59..3349c544 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/bl702_flash.ld +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/bl702_flash.ld @@ -175,7 +175,7 @@ SECTIONS . = ALIGN(4); __tcm_code_end__ = .; - } > itcm_memory + } > dtcm_memory __hbn_load_addr = __itcm_load_addr + SIZEOF(.itcm_region); @@ -203,25 +203,7 @@ SECTIONS . = ALIGN(4); __tcm_data_end__ = .; } > dtcm_memory - /*************************************************************************/ - /* .stack_dummy section doesn't contains any symbols. It is only - * used for linker to calculate size of stack sections, and assign - * values to stack symbols later */ - .stack_dummy (NOLOAD): - { - . = ALIGN(0x4); - . = . + StackSize; - . = ALIGN(0x4); - } > dtcm_memory - - /* Set stack top to end of RAM, and stack limit move down by - * size of stack_dummy section */ - __StackTop = ORIGIN(dtcm_memory) + LENGTH(dtcm_memory); - PROVIDE( __freertos_irq_stack_top = __StackTop); - __StackLimit = __StackTop - SIZEOF(.stack_dummy); - /* Check if data + heap + stack exceeds RAM limit */ - ASSERT(__StackLimit >= __tcm_data_end__, "region RAM overflowed with stack") - /*************************************************************************/ + /*************************************************************************/ /* .stack_dummy section doesn't contains any symbols. It is only diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/inc/hal_dma.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/inc/hal_dma.h index dda00291..9d51c162 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/inc/hal_dma.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/inc/hal_dma.h @@ -81,10 +81,10 @@ enum dma_index_type { #define DMA_TRANSFER_WIDTH_16BIT 1 #define DMA_TRANSFER_WIDTH_32BIT 2 -#define DMA_BURST_1BYTE 0 -#define DMA_BURST_4BYTE 1 -#define DMA_BURST_8BYTE 2 -#define DMA_BURST_16BYTE 3 +#define DMA_BURST_INCR1 0 +#define DMA_BURST_INCR4 1 +#define DMA_BURST_INCR8 2 +#define DMA_BURST_INCR16 3 #define DMA_ADDR_UART0_TDR (0x4000A000 + 0x88) #define DMA_ADDR_UART0_RDR (0x4000A000 + 0x8C) @@ -174,13 +174,13 @@ typedef struct dma_device { uint8_t dst_burst_size; uint8_t src_width; uint8_t dst_width; - dma_lli_ctrl_t *lli_cfg; + uint8_t intr; /* private param */ + dma_lli_ctrl_t *lli_cfg;/* private param*/ } dma_device_t; #define DMA_DEV(dev) ((dma_device_t *)dev) int dma_register(enum dma_index_type index, const char *name); -int dma_allocate_register(const char *name); int dma_reload(struct device *dev, uint32_t src_addr, uint32_t dst_addr, uint32_t transfer_size); #ifdef __cplusplus diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/src/hal_clock.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/src/hal_clock.c index 595784a6..f2581e01 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/src/hal_clock.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/src/hal_clock.c @@ -56,9 +56,8 @@ static void internal_rc32m_init(void) { tmpVal = BL_RD_REG(AON_BASE, AON_XTAL_CFG); tmpVal = BL_CLR_REG_BIT(tmpVal, AON_XTAL_EXT_SEL_AON); BL_WR_REG(AON_BASE, AON_XTAL_CFG, tmpVal); - if (BL_IS_REG_BIT_SET(BL_RD_REG(GLB_BASE, GLB_CLK_CFG0), GLB_CHIP_RDY)) { + if (BL_IS_REG_BIT_SET(BL_RD_REG(GLB_BASE, GLB_CLK_CFG0), GLB_CHIP_RDY)) break; - } } } #endif @@ -457,6 +456,11 @@ void peripheral_clock_init(void) { tmpVal |= (1 << BL_AHB_SLAVE1_USB); GLB_Set_USB_CLK(1); #endif + +#if defined(BSP_USING_DMA) + tmpVal |= (1 << BL_AHB_SLAVE1_DMA); +#endif + BL_WR_REG(GLB_BASE, GLB_CGEN_CFG1, tmpVal); } @@ -465,9 +469,9 @@ uint32_t system_clock_get(enum system_clock_type type) { case SYSTEM_CLOCK_ROOT_CLOCK: if (GLB_Get_Root_CLK_Sel() == 0) { return 32 * 1000 * 1000; - } else if (GLB_Get_Root_CLK_Sel() == 1) { + } else if (GLB_Get_Root_CLK_Sel() == 1) return 32 * 1000 * 1000; - } else { + else { uint32_t tmpVal = BL_RD_REG(GLB_BASE, GLB_CLK_CFG0); tmpVal = BL_GET_REG_BITS_VAL(tmpVal, GLB_REG_PLL_SEL); if (tmpVal == 0) { diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/src/hal_dma.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/src/hal_dma.c index 1bd85630..2eaea527 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/src/hal_dma.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/src/hal_dma.c @@ -79,13 +79,13 @@ int dma_open(struct device *dev, uint16_t oflag) { /* Disable all interrupt */ DMA_IntMask(dma_device->ch, DMA_INT_ALL, MASK); - /* Enable uart interrupt*/ CPU_Interrupt_Disable(DMA_ALL_IRQn); DMA_Disable(); DMA_Channel_Disable(dma_device->ch); + dma_device->intr = 0; chCfg.ch = dma_device->ch; chCfg.dir = dma_device->direction; chCfg.srcPeriph = dma_device->src_req; @@ -101,7 +101,7 @@ int dma_open(struct device *dev, uint16_t oflag) { DMA_Enable(); Interrupt_Handler_Register(DMA_ALL_IRQn, DMA0_IRQ); - /* Enable uart interrupt*/ + /* Enable dma interrupt*/ CPU_Interrupt_Enable(DMA_ALL_IRQn); return 0; } @@ -121,14 +121,14 @@ int dma_control(struct device *dev, int cmd, void *args) { /* Dma interrupt configuration */ DMA_IntMask(dma_device->ch, DMA_INT_TCOMPLETED, UNMASK); DMA_IntMask(dma_device->ch, DMA_INT_ERR, UNMASK); - + dma_device->intr = 1; break; case DEVICE_CTRL_CLR_INT: /* Dma interrupt configuration */ DMA_IntMask(dma_device->ch, DMA_INT_TCOMPLETED, MASK); DMA_IntMask(dma_device->ch, DMA_INT_ERR, MASK); - + dma_device->intr = 0; break; case DEVICE_CTRL_GET_INT: @@ -181,6 +181,7 @@ int dma_close(struct device *dev) { DMA_Channel_Disable(dma_device->ch); DMA_Channel_Init(&chCfg); + dma_device->intr = 0; return 0; } @@ -205,62 +206,6 @@ int dma_register(enum dma_index_type index, const char *name) { return device_register(dev, name); } -static BL_Err_Type dma_scan_unregister_device(uint8_t *allocate_index) { - struct device *dev; - dlist_t *node; - uint8_t dma_index = 0; - uint32_t dma_handle[DMA_MAX_INDEX]; - - for (dma_index = 0; dma_index < DMA_MAX_INDEX; dma_index++) { - dma_handle[dma_index] = 0xff; - } - - /* get registered dma handle list*/ - dlist_for_each(node, device_get_list_header()) { - dev = dlist_entry(node, struct device, list); - - if (dev->type == DEVICE_CLASS_DMA) { - dma_handle[(((uint32_t)dev - (uint32_t)dmax_device) / sizeof(dma_device_t)) % DMA_MAX_INDEX] = SET; - } - } - - for (dma_index = 0; dma_index < DMA_MAX_INDEX; dma_index++) { - if (dma_handle[dma_index] == 0xff) { - *allocate_index = dma_index; - return SUCCESS; - } - } - - return ERROR; -} - -int dma_allocate_register(const char *name) { - struct device *dev; - uint8_t index; - - if (DMA_MAX_INDEX == 0) { - return -DEVICE_EINVAL; - } - - if (dma_scan_unregister_device(&index) == ERROR) { - return -DEVICE_ENOSPACE; - } - - dev = &(dmax_device[index].parent); - - dev->open = dma_open; - dev->close = dma_close; - dev->control = dma_control; - // dev->write = dma_write; - // dev->read = dma_read; - - dev->status = DEVICE_UNREGISTER; - dev->type = DEVICE_CLASS_DMA; - dev->handle = NULL; - - return device_register(dev, name); -} - /** * @brief * @@ -271,14 +216,13 @@ int dma_allocate_register(const char *name) { * @return int */ int dma_reload(struct device *dev, uint32_t src_addr, uint32_t dst_addr, uint32_t transfer_size) { -#if defined(BSP_USING_DMA0_CH0) || defined(BSP_USING_DMA0_CH1) || defined(BSP_USING_DMA0_CH2) || defined(BSP_USING_DMA0_CH3) || defined(BSP_USING_DMA0_CH4) || defined(BSP_USING_DMA0_CH5) || \ - defined(BSP_USING_DMA0_CH6) || defined(BSP_USING_DMA0_CH7) - +#ifdef BSP_USING_DMA uint32_t malloc_count; uint32_t remain_len; uint32_t actual_transfer_len = 0; uint32_t actual_transfer_offset = 0; dma_control_data_t dma_ctrl_cfg; + bool intr = false; dma_device_t *dma_device = (dma_device_t *)dev; @@ -315,6 +259,7 @@ int dma_reload(struct device *dev, uint32_t src_addr, uint32_t dst_addr, uint32_ } dma_ctrl_cfg = (dma_control_data_t)(BL_RD_REG(dma_channel_base[dma_device->id][dma_device->ch], DMA_CONTROL)); + intr = dma_device->intr; malloc_count = actual_transfer_len / 4095; remain_len = actual_transfer_len % 4095; @@ -326,15 +271,14 @@ int dma_reload(struct device *dev, uint32_t src_addr, uint32_t dst_addr, uint32_ dma_device->lli_cfg = (dma_lli_ctrl_t *)realloc(dma_device->lli_cfg, sizeof(dma_lli_ctrl_t) * malloc_count); if (dma_device->lli_cfg) { + dma_ctrl_cfg.bits.TransferSize = 4095; + dma_ctrl_cfg.bits.I = 0; /*transfer_size will be integer multiple of 4095*n or 4095*2*n or 4095*4*n,(n>0) */ for (uint32_t i = 0; i < malloc_count; i++) { dma_device->lli_cfg[i].src_addr = src_addr; dma_device->lli_cfg[i].dst_addr = dst_addr; dma_device->lli_cfg[i].nextlli = 0; - dma_ctrl_cfg.bits.TransferSize = 4095; - dma_ctrl_cfg.bits.I = 0; - if (dma_ctrl_cfg.bits.SI) { src_addr += actual_transfer_offset; } @@ -347,7 +291,7 @@ int dma_reload(struct device *dev, uint32_t src_addr, uint32_t dst_addr, uint32_ if (remain_len) { dma_ctrl_cfg.bits.TransferSize = remain_len; } - dma_ctrl_cfg.bits.I = 1; + dma_ctrl_cfg.bits.I = intr; if (dma_device->transfer_mode == DMA_LLI_CYCLE_MODE) { dma_device->lli_cfg[i].nextlli = (uint32_t)&dma_device->lli_cfg[0]; diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/src/hal_usb.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/src/hal_usb.c index 0491bc71..7c744b1a 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/src/hal_usb.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/hal_drv/src/hal_usb.c @@ -21,6 +21,7 @@ * */ #include "hal_usb.h" +#include "bl702_dma.h" #include "bl702_glb.h" #include "bl702_usb.h" #include "hal_dma.h" @@ -396,8 +397,8 @@ int usb_write(struct device *dev, uint32_t pos, const void *buffer, uint32_t siz usb_lli_list.cfg.bits.TransferSize = size; usb_lli_list.cfg.bits.DI = 0; usb_lli_list.cfg.bits.SI = 1; - usb_lli_list.cfg.bits.SBSize = DMA_BURST_16BYTE; - usb_lli_list.cfg.bits.DBSize = DMA_BURST_1BYTE; + usb_lli_list.cfg.bits.SBSize = DMA_BURST_SIZE_16; + usb_lli_list.cfg.bits.DBSize = DMA_BURST_SIZE_1; dma_channel_update(usb_device->tx_dma, (void *)((uint32_t)&usb_lli_list)); dma_channel_start(usb_device->tx_dma); return 0; @@ -420,8 +421,8 @@ int usb_read(struct device *dev, uint32_t pos, void *buffer, uint32_t size) { usb_lli_list.cfg.bits.TransferSize = size; usb_lli_list.cfg.bits.DI = 1; usb_lli_list.cfg.bits.SI = 0; - usb_lli_list.cfg.bits.SBSize = DMA_BURST_1BYTE; - usb_lli_list.cfg.bits.DBSize = DMA_BURST_16BYTE; + usb_lli_list.cfg.bits.SBSize = DMA_BURST_SIZE_1; + usb_lli_list.cfg.bits.DBSize = DMA_BURST_SIZE_16; dma_channel_update(usb_device->rx_dma, (void *)((uint32_t)&usb_lli_list)); dma_channel_start(usb_device->rx_dma); return 0; @@ -817,9 +818,8 @@ int usb_dc_ep_write(struct device *dev, const uint8_t ep, const uint8_t *data, u memcopy_to_fifo((void *)ep_tx_fifo_addr, (uint8_t *)data, data_len); /* Clear NAK and enable ep */ - if (USB_EP_GET_IDX(ep) != 0) { + if (USB_EP_GET_IDX(ep) != 0) USB_Set_EPx_Rdy(USB_EP_GET_IDX(ep)); - } USB_DC_LOG_DBG("EP%d write %u bytes\r\n", ep_idx, data_len); if (ret_bytes) { diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/startup/system_bl702.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/startup/system_bl702.c index c030a559..19c7d072 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/startup/system_bl702.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/startup/system_bl702.c @@ -41,6 +41,9 @@ void USB_DoNothing_IRQHandler(void) { /*---------------------------------------------------------------------------- Vector Table *----------------------------------------------------------------------------*/ +#define VECT_TAB_OFFSET \ + 0x00 /*!< Vector Table base offset field. \ + This value must be a multiple of 0x200. */ /*---------------------------------------------------------------------------- System initialization function @@ -124,7 +127,7 @@ void SystemInit(void) { #ifdef BFLB_EFLASH_LOADER Interrupt_Handler_Register(USB_IRQn, USB_DoNothing_IRQHandler); #endif - /* init for for all platform */ + /* init bor for all platform */ system_bor_init(); /* global IRQ enable */ __enable_irq(); diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/std_drv/inc/bl702_adc.h b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/std_drv/inc/bl702_adc.h index 8619541f..b14eb472 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/std_drv/inc/bl702_adc.h +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/std_drv/inc/bl702_adc.h @@ -40,7 +40,6 @@ #include "bl702_common.h" #include "gpip_reg.h" - /** @addtogroup BL702_Peripheral_Driver * @{ */ @@ -272,8 +271,8 @@ typedef struct { typedef struct { int8_t posChan; /*!< Positive channel */ int8_t negChan; /*!< Negative channel */ - uint16_t value; /*!< ADC value */ - float volt; /*!< ADC voltage result */ + uint32_t value; /*!< ADC value */ + // float volt; /*!< ADC voltage result */ } ADC_Result_Type; /** @@ -325,11 +324,11 @@ typedef struct { /** @defgroup ADC_CHAN_TYPE * @{ */ -#define IS_ADC_CHAN_TYPE(type) \ - (((type) == ADC_CHAN0) || ((type) == ADC_CHAN1) || ((type) == ADC_CHAN2) || ((type) == ADC_CHAN3) || ((type) == ADC_CHAN4) || ((type) == ADC_CHAN5) || ((type) == ADC_CHAN6) \ - || ((type) == ADC_CHAN7) || ((type) == ADC_CHAN8) || ((type) == ADC_CHAN9) || ((type) == ADC_CHAN10) || ((type) == ADC_CHAN11) || ((type) == ADC_CHAN_DAC_OUTA) || ((type) == ADC_CHAN_DAC_OUTB) \ - || ((type) == ADC_CHAN_TSEN_P) || ((type) == ADC_CHAN_TSEN_N) || ((type) == ADC_CHAN_VREF) || ((type) == ADC_CHAN_DCTEST) || ((type) == ADC_CHAN_VABT_HALF) || ((type) == ADC_CHAN_SENP3) \ - || ((type) == ADC_CHAN_SENP2) || ((type) == ADC_CHAN_SENP1) || ((type) == ADC_CHAN_SENP0) || ((type) == ADC_CHAN_GND)) +#define IS_ADC_CHAN_TYPE(type) \ + (((type) == ADC_CHAN0) || ((type) == ADC_CHAN1) || ((type) == ADC_CHAN2) || ((type) == ADC_CHAN3) || ((type) == ADC_CHAN4) || ((type) == ADC_CHAN5) || ((type) == ADC_CHAN6) || \ + ((type) == ADC_CHAN7) || ((type) == ADC_CHAN8) || ((type) == ADC_CHAN9) || ((type) == ADC_CHAN10) || ((type) == ADC_CHAN11) || ((type) == ADC_CHAN_DAC_OUTA) || ((type) == ADC_CHAN_DAC_OUTB) || \ + ((type) == ADC_CHAN_TSEN_P) || ((type) == ADC_CHAN_TSEN_N) || ((type) == ADC_CHAN_VREF) || ((type) == ADC_CHAN_DCTEST) || ((type) == ADC_CHAN_VABT_HALF) || ((type) == ADC_CHAN_SENP3) || \ + ((type) == ADC_CHAN_SENP2) || ((type) == ADC_CHAN_SENP1) || ((type) == ADC_CHAN_SENP0) || ((type) == ADC_CHAN_GND)) /** @defgroup ADC_V18_SEL_TYPE * @{ @@ -344,23 +343,23 @@ typedef struct { /** @defgroup ADC_CLK_TYPE * @{ */ -#define IS_ADC_CLK_TYPE(type) \ - (((type) == ADC_CLK_DIV_1) || ((type) == ADC_CLK_DIV_4) || ((type) == ADC_CLK_DIV_8) || ((type) == ADC_CLK_DIV_12) || ((type) == ADC_CLK_DIV_16) || ((type) == ADC_CLK_DIV_20) \ - || ((type) == ADC_CLK_DIV_24) || ((type) == ADC_CLK_DIV_32)) +#define IS_ADC_CLK_TYPE(type) \ + (((type) == ADC_CLK_DIV_1) || ((type) == ADC_CLK_DIV_4) || ((type) == ADC_CLK_DIV_8) || ((type) == ADC_CLK_DIV_12) || ((type) == ADC_CLK_DIV_16) || ((type) == ADC_CLK_DIV_20) || \ + ((type) == ADC_CLK_DIV_24) || ((type) == ADC_CLK_DIV_32)) /** @defgroup ADC_DELAY_SEL_TYPE * @{ */ -#define IS_ADC_DELAY_SEL_TYPE(type) \ - (((type) == ADC_DELAY_SEL_0) || ((type) == ADC_DELAY_SEL_1) || ((type) == ADC_DELAY_SEL_2) || ((type) == ADC_DELAY_SEL_3) || ((type) == ADC_DELAY_SEL_4) || ((type) == ADC_DELAY_SEL_5) \ - || ((type) == ADC_DELAY_SEL_6) || ((type) == ADC_DELAY_SEL_7)) +#define IS_ADC_DELAY_SEL_TYPE(type) \ + (((type) == ADC_DELAY_SEL_0) || ((type) == ADC_DELAY_SEL_1) || ((type) == ADC_DELAY_SEL_2) || ((type) == ADC_DELAY_SEL_3) || ((type) == ADC_DELAY_SEL_4) || ((type) == ADC_DELAY_SEL_5) || \ + ((type) == ADC_DELAY_SEL_6) || ((type) == ADC_DELAY_SEL_7)) /** @defgroup ADC_PGA_GAIN_TYPE * @{ */ -#define IS_ADC_PGA_GAIN_TYPE(type) \ - (((type) == ADC_PGA_GAIN_NONE) || ((type) == ADC_PGA_GAIN_1) || ((type) == ADC_PGA_GAIN_2) || ((type) == ADC_PGA_GAIN_4) || ((type) == ADC_PGA_GAIN_8) || ((type) == ADC_PGA_GAIN_16) \ - || ((type) == ADC_PGA_GAIN_32)) +#define IS_ADC_PGA_GAIN_TYPE(type) \ + (((type) == ADC_PGA_GAIN_NONE) || ((type) == ADC_PGA_GAIN_1) || ((type) == ADC_PGA_GAIN_2) || ((type) == ADC_PGA_GAIN_4) || ((type) == ADC_PGA_GAIN_8) || ((type) == ADC_PGA_GAIN_16) || \ + ((type) == ADC_PGA_GAIN_32)) /** @defgroup ADC_BIAS_SEL_TYPE * @{ @@ -395,9 +394,9 @@ typedef struct { /** @defgroup ADC_DATA_WIDTH_TYPE * @{ */ -#define IS_ADC_DATA_WIDTH_TYPE(type) \ - (((type) == ADC_DATA_WIDTH_12) || ((type) == ADC_DATA_WIDTH_14_WITH_16_AVERAGE) || ((type) == ADC_DATA_WIDTH_14_WITH_64_AVERAGE) || ((type) == ADC_DATA_WIDTH_16_WITH_128_AVERAGE) \ - || ((type) == ADC_DATA_WIDTH_16_WITH_256_AVERAGE)) +#define IS_ADC_DATA_WIDTH_TYPE(type) \ + (((type) == ADC_DATA_WIDTH_12) || ((type) == ADC_DATA_WIDTH_14_WITH_16_AVERAGE) || ((type) == ADC_DATA_WIDTH_14_WITH_64_AVERAGE) || ((type) == ADC_DATA_WIDTH_16_WITH_128_AVERAGE) || \ + ((type) == ADC_DATA_WIDTH_16_WITH_256_AVERAGE)) /** @defgroup ADC_MICBOOST_DB_TYPE * @{ @@ -422,9 +421,9 @@ typedef struct { /** @defgroup ADC_INT_TYPE * @{ */ -#define IS_ADC_INT_TYPE(type) \ - (((type) == ADC_INT_POS_SATURATION) || ((type) == ADC_INT_NEG_SATURATION) || ((type) == ADC_INT_FIFO_UNDERRUN) || ((type) == ADC_INT_FIFO_OVERRUN) || ((type) == ADC_INT_ADC_READY) \ - || ((type) == ADC_INT_FIFO_READY) || ((type) == ADC_INT_ALL)) +#define IS_ADC_INT_TYPE(type) \ + (((type) == ADC_INT_POS_SATURATION) || ((type) == ADC_INT_NEG_SATURATION) || ((type) == ADC_INT_FIFO_UNDERRUN) || ((type) == ADC_INT_FIFO_OVERRUN) || ((type) == ADC_INT_ADC_READY) || \ + ((type) == ADC_INT_FIFO_READY) || ((type) == ADC_INT_ALL)) /*@} end of group ADC_Public_Constants */ diff --git a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/std_drv/src/bl702_adc.c b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/std_drv/src/bl702_adc.c index ce425225..59028321 100644 --- a/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/std_drv/src/bl702_adc.c +++ b/source/Core/BSP/Pinecilv2/bl_mcu_sdk/drivers/bl702_driver/std_drv/src/bl702_adc.c @@ -74,11 +74,11 @@ /** @defgroup ADC_Private_Variables * @{ */ -static intCallback_Type *adcIntCbfArra[ADC_INT_ALL] = {NULL}; -static ADC_Gain_Coeff_Type adcGainCoeffCal = { - .adcGainCoeffEnable = DISABLE, - .adcgainCoeffVal = 0, - .coe = 1, +static intCallback_Type *adcIntCbfArra[ADC_INT_ALL] = {NULL}; +ADC_Gain_Coeff_Type adcGainCoeffCal = { + .adcGainCoeffEnable = DISABLE, + .adcgainCoeffVal = 0, + .coe = 1, }; /*@} end of group ADC_Private_Variables */ @@ -185,7 +185,7 @@ void ADC_Init(ADC_CFG_Type *cfg) { CHECK_PARAM(IS_ADC_DATA_WIDTH_TYPE(cfg->resWidth)); /* config 1 */ - regCfg1 = 0; // BL_RD_REG(AON_BASE, AON_GPADC_REG_CONFIG1); + regCfg1 = BL_RD_REG(AON_BASE, AON_GPADC_REG_CONFIG1); regCfg1 = BL_SET_REG_BITS_VAL(regCfg1, AON_GPADC_V18_SEL, cfg->v18Sel); regCfg1 = BL_SET_REG_BITS_VAL(regCfg1, AON_GPADC_V11_SEL, cfg->v11Sel); regCfg1 = BL_CLR_REG_BIT(regCfg1, AON_GPADC_DITHER_EN); @@ -200,13 +200,11 @@ void ADC_Init(ADC_CFG_Type *cfg) { /* config 2 */ regCfg2 = BL_RD_REG(AON_BASE, AON_GPADC_REG_CONFIG2); - regCfg2 = BL_SET_REG_BITS_VAL(regCfg2, AON_GPADC_DLY_SEL, 0x00); + regCfg2 = BL_SET_REG_BITS_VAL(regCfg2, AON_GPADC_DLY_SEL, 0x02); regCfg2 = BL_SET_REG_BITS_VAL(regCfg2, AON_GPADC_PGA1_GAIN, cfg->gain1); regCfg2 = BL_SET_REG_BITS_VAL(regCfg2, AON_GPADC_PGA2_GAIN, cfg->gain2); regCfg2 = BL_SET_REG_BITS_VAL(regCfg2, AON_GPADC_BIAS_SEL, cfg->biasSel); regCfg2 = BL_SET_REG_BITS_VAL(regCfg2, AON_GPADC_CHOP_MODE, cfg->chopMode); - regCfg2 = BL_CLR_REG_BIT(regCfg2, AON_GPADC_VBAT_EN); // vbat enabled (off) - regCfg2 = BL_CLR_REG_BIT(regCfg2, AON_GPADC_TSVBE_LOW); // tsen didoe current /* pga_vcmi_en is for mic */ regCfg2 = BL_CLR_REG_BIT(regCfg2, AON_GPADC_PGA_VCMI_EN); @@ -233,7 +231,7 @@ void ADC_Init(ADC_CFG_Type *cfg) { Interrupt_Handler_Register(GPADC_DMA_IRQn, GPADC_DMA_IRQHandler); #endif - // ADC_Gain_Trim(); + ADC_Gain_Trim(); } /****************************************************************************/ @@ -510,8 +508,7 @@ void ADC_Parse_Result(uint32_t *orgVal, uint32_t len, ADC_Result_Type *result) { uint32_t tmpVal1 = 0, tmpVal2 = 0; ADC_Data_Width_Type dataType; ADC_SIG_INPUT_Type sigType; - float ref = 2.0; - uint32_t i = 0; + uint32_t i = 0; float coe = 1.0; @@ -524,54 +521,52 @@ void ADC_Parse_Result(uint32_t *orgVal, uint32_t len, ADC_Result_Type *result) { dataType = BL_GET_REG_BITS_VAL(tmpVal1, AON_GPADC_RES_SEL); sigType = BL_GET_REG_BITS_VAL(tmpVal2, AON_GPADC_DIFF_MODE); - if (BL_GET_REG_BITS_VAL(tmpVal2, AON_GPADC_VREF_SEL) == ADC_VREF_3P2V) { - ref = 3.2; - } - if (sigType == ADC_INPUT_SINGLE_END) { for (i = 0; i < len; i++) { result[i].posChan = orgVal[i] >> 21; result[i].negChan = -1; - + uint32_t sample = 0; if (dataType == ADC_DATA_WIDTH_12) { - result[i].value = (unsigned int)(((orgVal[i] & 0xffff) >> 4) / coe); - result[i].volt = result[i].value / 4096.0 * ref; + sample = ((orgVal[i] & 0xffff) >> 4); } else if ((dataType == ADC_DATA_WIDTH_14_WITH_16_AVERAGE) || (dataType == ADC_DATA_WIDTH_14_WITH_64_AVERAGE)) { - result[i].value = (unsigned int)(((orgVal[i] & 0xffff) >> 2) / coe); - result[i].volt = result[i].value / 16384.0 * ref; + sample = ((orgVal[i] & 0xffff) >> 2); } else if ((dataType == ADC_DATA_WIDTH_16_WITH_128_AVERAGE) || (dataType == ADC_DATA_WIDTH_16_WITH_256_AVERAGE)) { - result[i].value = (unsigned int)((orgVal[i] & 0xffff) / coe); - result[i].volt = result[i].value / 65536.0 * ref; - } - } - } else { - for (i = 0; i < len; i++) { - neg = 0; - result[i].posChan = orgVal[i] >> 21; - result[i].negChan = (orgVal[i] >> 16) & 0x1F; - - if (orgVal[i] & 0x8000) { - orgVal[i] = ~orgVal[i]; - orgVal[i] += 1; - neg = 1; + sample = (orgVal[i] & 0xffff); } - if (dataType == ADC_DATA_WIDTH_12) { - result[i].value = (unsigned int)(((orgVal[i] & 0xffff) >> 4) / coe); - result[i].volt = result[i].value / 2048.0 * ref; - } else if ((dataType == ADC_DATA_WIDTH_14_WITH_16_AVERAGE) || (dataType == ADC_DATA_WIDTH_14_WITH_64_AVERAGE)) { - result[i].value = (unsigned int)(((orgVal[i] & 0xffff) >> 2) / coe); - result[i].volt = result[i].value / 8192.0 * ref; - } else if ((dataType == ADC_DATA_WIDTH_16_WITH_128_AVERAGE) || (dataType == ADC_DATA_WIDTH_16_WITH_256_AVERAGE)) { - result[i].value = (unsigned int)((orgVal[i] & 0xffff) / coe); - result[i].volt = result[i].value / 32768.0 * ref; - } + result[i].value = (unsigned int)(sample / coe); - if (neg) { - result[i].volt = -result[i].volt; + // Saturate at 16 bits + if (result[i].value > 0xFFFF) { + result[i].value = 0xFFFF; } } } + // else { + // for (i = 0; i < len; i++) { + // neg = 0; + // result[i].posChan = orgVal[i] >> 21; + // result[i].negChan = (orgVal[i] >> 16) & 0x1F; + + // if (orgVal[i] & 0x8000) { + // orgVal[i] = ~orgVal[i]; + // orgVal[i] += 1; + // neg = 1; + // } + + // if (dataType == ADC_DATA_WIDTH_12) { + // result[i].value = (unsigned int)(((orgVal[i] & 0xffff) >> 4) / coe); + // } else if ((dataType == ADC_DATA_WIDTH_14_WITH_16_AVERAGE) || (dataType == ADC_DATA_WIDTH_14_WITH_64_AVERAGE)) { + // result[i].value = (unsigned int)(((orgVal[i] & 0xffff) >> 2) / coe); + // } else if ((dataType == ADC_DATA_WIDTH_16_WITH_128_AVERAGE) || (dataType == ADC_DATA_WIDTH_16_WITH_256_AVERAGE)) { + // result[i].value = (unsigned int)((orgVal[i] & 0xffff) / coe); + // } + // // Saturate at 16 bits + // if (result[i].value > 0xFFFF) { + // result[i].value = 0xFFFF; + // } + // } + // } } /****************************************************************************/ diff --git a/source/Core/BSP/Pinecilv2/ble.c b/source/Core/BSP/Pinecilv2/ble.c index 5206d6af..dd99b83c 100644 --- a/source/Core/BSP/Pinecilv2/ble.c +++ b/source/Core/BSP/Pinecilv2/ble.c @@ -59,3 +59,12 @@ void vApplicationMallocFailedHook(void) { ; } } + +void user_vAssertCalled(void) { + + MSG("user_vAssertCalled\r\n"); + + while (1) { + ; + } +} diff --git a/source/Core/BSP/Pinecilv2/board.c b/source/Core/BSP/Pinecilv2/board.c index 7c56fdde..84ae831f 100644 --- a/source/Core/BSP/Pinecilv2/board.c +++ b/source/Core/BSP/Pinecilv2/board.c @@ -133,7 +133,7 @@ static const struct pin_mux_cfg af_pin_table[] = { static void board_pin_mux_init(void) { GLB_GPIO_Cfg_Type gpio_cfg; uint32_t tmpVal; - gpio_cfg.drive = 3; + gpio_cfg.drive = 2; gpio_cfg.smtCtrl = 1; uint8_t hbn_gpio_mask = 0x1f; uint8_t hbn_aon_ie = 0; diff --git a/source/Core/BSP/Pinecilv2/configuration.h b/source/Core/BSP/Pinecilv2/configuration.h index 09472719..e00839be 100644 --- a/source/Core/BSP/Pinecilv2/configuration.h +++ b/source/Core/BSP/Pinecilv2/configuration.h @@ -83,7 +83,7 @@ #define POWER_PULSE_WAIT_MAX 9 // 9*2.5s = 22.5 seconds #define POWER_PULSE_DURATION_MAX 9 // 9*250ms = 2.25 seconds -#ifdef MODEL_Pinecil +#ifdef MODEL_Pinecilv2 #define POWER_PULSE_DEFAULT 0 #else #define POWER_PULSE_DEFAULT 5 @@ -114,7 +114,7 @@ #define ANIMATION_LOOP 1 // 0: off 1: on #define ANIMATION_SPEED settingOffSpeed_t::MEDIUM -#define OP_AMP_Rf_Pinecil 680 * 1000 // 700 Kilo-ohms -> From schematic, R1 +#define OP_AMP_Rf_Pinecil 680 * 1000 // 680 Kilo-ohms -> From schematic, R1 #define OP_AMP_Rin_Pinecil 2370 // 2.37 Kilo-ohms -> From schematic, R2 #define OP_AMP_GAIN_STAGE_PINECIL (1 + (OP_AMP_Rf_Pinecil / OP_AMP_Rin_Pinecil)) @@ -124,10 +124,10 @@ #endif #ifdef MODEL_Pinecilv2 -#define ADC_VDD_MV 3300 // ADC max reading millivolts -#define ADC_MAX_READING (62000 >> 1) // Maximum reading of the adc +#define ADC_VDD_MV 3200 // ADC max reading millivolts +#define ADC_MAX_READING ((1 << 16) >> 1) // Maximum reading of the adc #define SOLDERING_TEMP 320 // Default soldering temp is 320.0 °C -#define VOLTAGE_DIV 600 // 600 - Default divider from schematic +#define VOLTAGE_DIV 630 // 600 - Default divider from schematic #define CALIBRATION_OFFSET 900 // 900 - Default adc offset in uV #define MIN_CALIBRATION_OFFSET 100 // Min value for calibration #define PID_POWER_LIMIT 120 // Sets the max pwm power limit @@ -157,6 +157,7 @@ #define DEVICE_HAS_VALIDATION_SUPPORT #define TEMP_NTC #define ACCEL_BMA +#define CUSTOM_MAX_TEMP_C 1 // Uses custom max temp lookup #define ACCEL_SC7 #define HALL_SENSOR #define HALL_SI7210 diff --git a/source/Core/BSP/Pinecilv2/peripheral_config.h b/source/Core/BSP/Pinecilv2/peripheral_config.h index 21b56915..375de426 100644 --- a/source/Core/BSP/Pinecilv2/peripheral_config.h +++ b/source/Core/BSP/Pinecilv2/peripheral_config.h @@ -123,7 +123,7 @@ #define DMA0_CH0_CONFIG \ { \ .id = 0, .ch = 0, .direction = DMA_MEMORY_TO_MEMORY, .transfer_mode = DMA_LLI_ONCE_MODE, .src_req = DMA_REQUEST_NONE, .dst_req = DMA_REQUEST_NONE, .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ - .dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE, .src_burst_size = DMA_BURST_4BYTE, .dst_burst_size = DMA_BURST_4BYTE, .src_width = DMA_TRANSFER_WIDTH_32BIT, .dst_width = DMA_TRANSFER_WIDTH_32BIT, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE, .src_burst_size = DMA_BURST_SIZE_4, .dst_burst_size = DMA_BURST_SIZE_4, .src_width = DMA_TRANSFER_WIDTH_32BIT, .dst_width = DMA_TRANSFER_WIDTH_32BIT, \ } #endif #endif @@ -133,7 +133,7 @@ #define DMA0_CH1_CONFIG \ { \ .id = 0, .ch = 1, .direction = DMA_MEMORY_TO_MEMORY, .transfer_mode = DMA_LLI_ONCE_MODE, .src_req = DMA_REQUEST_NONE, .dst_req = DMA_REQUEST_NONE, .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ - .dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE, .src_burst_size = DMA_BURST_4BYTE, .dst_burst_size = DMA_BURST_4BYTE, .src_width = DMA_TRANSFER_WIDTH_16BIT, .dst_width = DMA_TRANSFER_WIDTH_16BIT, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE, .src_burst_size = DMA_BURST_SIZE_4, .dst_burst_size = DMA_BURST_SIZE_4, .src_width = DMA_TRANSFER_WIDTH_16BIT, .dst_width = DMA_TRANSFER_WIDTH_16BIT, \ } #endif #endif @@ -143,7 +143,7 @@ #define DMA0_CH2_CONFIG \ { \ .id = 0, .ch = 2, .direction = DMA_MEMORY_TO_PERIPH, .transfer_mode = DMA_LLI_ONCE_MODE, .src_req = DMA_REQUEST_NONE, .dst_req = DMA_REQUEST_UART1_TX, .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ - .dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE, .src_burst_size = DMA_BURST_1BYTE, .dst_burst_size = DMA_BURST_1BYTE, .src_width = DMA_TRANSFER_WIDTH_8BIT, .dst_width = DMA_TRANSFER_WIDTH_8BIT, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE, .src_burst_size = DMA_BURST_SIZE_1, .dst_burst_size = DMA_BURST_SIZE_1, .src_width = DMA_TRANSFER_WIDTH_8BIT, .dst_width = DMA_TRANSFER_WIDTH_8BIT, \ } #endif #endif @@ -153,7 +153,7 @@ #define DMA0_CH3_CONFIG \ { \ .id = 0, .ch = 3, .direction = DMA_MEMORY_TO_PERIPH, .transfer_mode = DMA_LLI_ONCE_MODE, .src_req = DMA_REQUEST_NONE, .dst_req = DMA_REQUEST_SPI0_TX, .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ - .dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE, .src_burst_size = DMA_BURST_1BYTE, .dst_burst_size = DMA_BURST_1BYTE, .src_width = DMA_TRANSFER_WIDTH_8BIT, .dst_width = DMA_TRANSFER_WIDTH_8BIT, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE, .src_burst_size = DMA_BURST_SIZE_1, .dst_burst_size = DMA_BURST_SIZE_1, .src_width = DMA_TRANSFER_WIDTH_8BIT, .dst_width = DMA_TRANSFER_WIDTH_8BIT, \ } #endif #endif @@ -163,7 +163,7 @@ #define DMA0_CH4_CONFIG \ { \ .id = 0, .ch = 4, .direction = DMA_PERIPH_TO_MEMORY, .transfer_mode = DMA_LLI_ONCE_MODE, .src_req = DMA_REQUEST_SPI0_RX, .dst_req = DMA_REQUEST_NONE, .src_addr_inc = DMA_ADDR_INCREMENT_DISABLE, \ - .dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE, .src_burst_size = DMA_BURST_1BYTE, .dst_burst_size = DMA_BURST_1BYTE, .src_width = DMA_TRANSFER_WIDTH_8BIT, .dst_width = DMA_TRANSFER_WIDTH_8BIT, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE, .src_burst_size = DMA_BURST_SIZE_1, .dst_burst_size = DMA_BURST_SIZE_1, .src_width = DMA_TRANSFER_WIDTH_8BIT, .dst_width = DMA_TRANSFER_WIDTH_8BIT, \ } #endif #endif @@ -173,7 +173,7 @@ #define DMA0_CH5_CONFIG \ { \ .id = 0, .ch = 5, .direction = DMA_MEMORY_TO_PERIPH, .transfer_mode = DMA_LLI_CYCLE_MODE, .src_req = DMA_REQUEST_NONE, .dst_req = DMA_REQUEST_I2S_TX, .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ - .dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE, .src_burst_size = DMA_BURST_1BYTE, .dst_burst_size = DMA_BURST_1BYTE, .src_width = DMA_TRANSFER_WIDTH_16BIT, .dst_width = DMA_TRANSFER_WIDTH_16BIT, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE, .src_burst_size = DMA_BURST_SIZE_1, .dst_burst_size = DMA_BURST_SIZE_1, .src_width = DMA_TRANSFER_WIDTH_16BIT, .dst_width = DMA_TRANSFER_WIDTH_16BIT, \ } #endif #endif @@ -183,7 +183,7 @@ #define DMA0_CH6_CONFIG \ { \ .id = 0, .ch = 6, .direction = DMA_MEMORY_TO_PERIPH, .transfer_mode = DMA_LLI_CYCLE_MODE, .src_req = DMA_REQUEST_NONE, .dst_req = DMA_REQUEST_I2S_TX, .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ - .dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE, .src_burst_size = DMA_BURST_1BYTE, .dst_burst_size = DMA_BURST_1BYTE, .src_width = DMA_TRANSFER_WIDTH_16BIT, .dst_width = DMA_TRANSFER_WIDTH_16BIT, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE, .src_burst_size = DMA_BURST_SIZE_1, .dst_burst_size = DMA_BURST_SIZE_1, .src_width = DMA_TRANSFER_WIDTH_16BIT, .dst_width = DMA_TRANSFER_WIDTH_16BIT, \ } #endif #endif @@ -193,7 +193,7 @@ #define DMA0_CH7_CONFIG \ { \ .id = 0, .ch = 7, .direction = DMA_MEMORY_TO_MEMORY, .transfer_mode = DMA_LLI_ONCE_MODE, .src_req = DMA_REQUEST_NONE, .dst_req = DMA_REQUEST_NONE, .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ - .dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE, .src_burst_size = DMA_BURST_1BYTE, .dst_burst_size = DMA_BURST_1BYTE, .src_width = DMA_TRANSFER_WIDTH_32BIT, .dst_width = DMA_TRANSFER_WIDTH_32BIT, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE, .src_burst_size = DMA_BURST_SIZE_1, .dst_burst_size = DMA_BURST_SIZE_1, .src_width = DMA_TRANSFER_WIDTH_32BIT, .dst_width = DMA_TRANSFER_WIDTH_32BIT, \ } #endif #endif diff --git a/source/Core/Drivers/TipThermoModel.cpp b/source/Core/Drivers/TipThermoModel.cpp index 29edc08d..f52f4733 100644 --- a/source/Core/Drivers/TipThermoModel.cpp +++ b/source/Core/Drivers/TipThermoModel.cpp @@ -89,7 +89,11 @@ TemperatureType_t TipThermoModel::getTipInF(bool sampleNow) { } TemperatureType_t TipThermoModel::getTipMaxInC() { +#ifdef CUSTOM_MAX_TEMP_C + return getCustomTipMaxInC(); +#else TemperatureType_t maximumTipTemp = TipThermoModel::convertTipRawADCToDegC(ADC_MAX_READING - 1); maximumTipTemp += getHandleTemperature(0) / 10; // Add handle offset return maximumTipTemp - 1; +#endif } diff --git a/source/Core/Inc/Settings.h b/source/Core/Inc/Settings.h index 72eb7d8d..e9bddfaf 100644 --- a/source/Core/Inc/Settings.h +++ b/source/Core/Inc/Settings.h @@ -11,7 +11,13 @@ #define SETTINGS_H_ #include #include -#define SETTINGSVERSION (0x2A) // This number is frozen, do not edit + +#ifdef MODEL_Pinecilv2 +// Required settings reset for PR #1916 +#define SETTINGSVERSION (0x55AB) // This number is frozen, do not edit +#else +#define SETTINGSVERSION (0x55AA) // This number is frozen, do not edit +#endif enum SettingsOptions { SolderingTemp = 0, // current set point for the iron diff --git a/source/Core/Src/Settings.cpp b/source/Core/Src/Settings.cpp index 77512b9d..72e9e7ff 100644 --- a/source/Core/Src/Settings.cpp +++ b/source/Core/Src/Settings.cpp @@ -135,9 +135,9 @@ bool sanitiseSettings() { // For all settings, need to ensure settings are in a valid range // First for any not know about due to array growth, reset them and update the length value bool dirty = false; - if (systemSettings.versionMarker != 0x55AA) { + if (systemSettings.versionMarker != SETTINGSVERSION) { memset((void *)&systemSettings, 0xFF, sizeof(systemSettings)); - systemSettings.versionMarker = 0x55AA; + systemSettings.versionMarker = SETTINGSVERSION; dirty = true; } if (systemSettings.padding != 0xFFFFFFFF) { diff --git a/source/Makefile b/source/Makefile index 6016a012..f18d8089 100644 --- a/source/Makefile +++ b/source/Makefile @@ -224,7 +224,7 @@ CPUFLAGS=-march=rv32imafczicsr \ -DARCH_RISCV \ -D__RISCV_FEATURE_MVE=0 \ -DBL702 \ - -DBFLB_USE_ROM_DRIVER=1 \ + -DBFLB_USE_ROM_DRIVER=0 \ # Binary blobs suck and they should be ashamed PINECILV2_SDK_DIR=$(DEVICE_BSP_DIR)/bl_mcu_sdk @@ -249,7 +249,7 @@ DEV_GLOBAL_DEFS=-DCFG_FREERTOS \ -DCFG_BLE \ -DOPTIMIZE_DATA_EVT_FLOW_FROM_CONTROLLER \ -DBL_MCU_SDK \ - -DCFG_CON=2 \ + -DCFG_CON=1 \ -DCFG_BLE_TX_BUFF_DATA=2 \ -DCONFIG_BT_PERIPHERAL \ -DCONFIG_BT_L2CAP_DYNAMIC_CHANNEL \ @@ -273,14 +273,14 @@ DEV_GLOBAL_DEFS=-DCFG_FREERTOS \ -DCONFIG_BT_SETTINGS_CCC_LAZY_LOADING \ -DCONFIG_BT_SETTINGS_USE_PRINTK \ -DCFG_SLEEP \ - -DCONFIG_BT_ALLROLES \ - -DCONFIG_BT_CENTRAL \ -DCONFIG_BT_OBSERVER \ -DCONFIG_BT_BROADCASTER \ - -DCFG_BLE_STACK_DBG_PRINT \ -DportasmHANDLE_INTERRUPT=FreeRTOS_Interrupt_Handler \ -DCONFIG_BT_DEVICE_NAME=\"Pinecil\" \ -DCONFIG_BT_DEVICE_APPEARANCE=0x06C1 + # -DCFG_BLE_STACK_DBG_PRINT \ + # -DCONFIG_BT_CENTRAL \ + # -DCONFIG_BT_ALLROLES \ # -DBFLB_USE_HAL_DRIVER \ # -DCONFIG_BT_SMP